Update report

master
WangRunji 7 years ago
parent dac818d5d7
commit ce6c849f5b

@ -4,7 +4,7 @@
计53 王润基 2015011279
2018.05.25
2018.05.25 + 06.15
## 摘要
@ -49,6 +49,8 @@
* 同步互斥:没写
* 文件系统SFS和VFS作为单独模块实现完毕还没对接到进程中
到第16周完成了同步互斥部分并对内存管理进行了整合优化。
具体完成过程和内容参见下文,各部分完成情况清单参见[status.md](../status.md)。
### 前期调研情况
@ -228,6 +230,37 @@ CLion配合gdb调试的方法详见日志2018.05.18的记录
Log模块是软件开发中一种常用的库它可以支持在程序各处记录不同等级的日志汇总到一起统一输出。我在RustOS中引入了这个库并实现了根据不同日志等级以不同的颜色进行输出还支持在运行前对指定等级的日志进行过滤方便debug。
### 6. 同步互斥
在内核线程调度的基础上实现了用于内核态的同步互斥工具。这部分参考了spin模块和Rust标准库中的sync模块并提供和std::sync完全相同的接口。作为测试仿照uCore用这些工具在OS内实现了哲学家就餐问题。
各模块依赖关系如下:
```mermaid
graph TB
subgraph dependence
interrupt
thread
end
subgraph sync
SpinLock --> interrupt
Condvar --> SpinLock
Condvar --> thread
Mutex --> Condvar
Monitor --> Condvar
Semaphore --> Condvar
Semaphore --> SpinLock
mpsc --> SpinLock
mpsc --> Condvar
end
subgraph test
Dining_Philosophers --> Mutex
Dining_Philosophers --> Monitor
end
```
Rust中提供同步互斥的最底层支撑是核心库中的原子变量`AtomicBool`,用它即可实现最简单的自旋锁`spin::Mutex`。自旋锁已经可以满足OS内核中的大部分需求但如果在中断和非中断态都访问同一个锁就可能造成死锁问题这就需要在上锁期间关闭中断。此外还要实现支持线程调度的锁在无法获得锁时将当前线程加入等待队列并放弃CPU在用锁完毕时唤醒一个等待的线程。我通过将`spin::Mutex`修改为一个可替换底层支持的锁框架实现了上述两个需求。在此基础上又实现了信号量、条件变量、信息传递通道形成了比较完善的同步互斥工具组。这部分共计约400行代码。
## 实验总结
在整个移植过程中我并不会直接照搬C语言的实现而是去参考其他RustOS的设计尽量使用Rust的风格和视角去重新审视OS。

@ -2,6 +2,41 @@
这里以天为单位,以周为周期,按时间倒序维护了开发日志。
### 第15周
#### 2018.06.06FS-Process
- 学习xv6/uCore中文件系统上层接口
- 尝试在Rust中实现RootFS和FileManager
#### 2018.06.04:完成同步互斥
- 完成了信号量、条件变量,哲学家就餐问题
- 简易实现了std::sync::mpsc中的FIFO消息传递通道
#### 2018.06.03:新的物理帧分配器
- 实现了新的物理帧分配器支持回收。其本质是一个0-2^k的整数分配器内部用bitset维护并形成树状级联结构每16bit对应上层1bit用x86专有指令bsr相当于整数log2实现快速分配。目前使用容量为64Kb的分配器可维护256MB内存空间实际占用内存9KB以内。
- 由于Rust语言的限制该类无法实现const fn构造函数只能使用lazy_static等tradeoff进行运行时初始化。这时必须开启至少O1优化使用RVO返回值优化防止在栈上构造再复制到全局变量否则会栈溢出。
#### 2018.06.02:重构内存管理模块
- 大幅调整了内存管理模块对外统一使用MemorySet管理一个线程的内存简化了使用方式。
#### 2018.06.01:同步互斥进阶
- 完成了OS内用锁实现的哲学家就餐问题和OS外用条件变量的实现。
- 关于Rust并发模型Rust的所有权机制使得它可以轻松支持【锁数据】而不是【锁代码】。这使得在实现上述哲学家就餐问题时用锁非常自然而用条件变量管程则不太直观。
### 第14周
#### 2018.05.31:同步互斥初步
* 将spin::Mutex代码fork了一份到内核中在其中实现了一个接口框架可以自由替换底层支持。在此框架下已经实现了自旋锁(spin_lock)、禁止中断的自旋锁(spin_lock_irqsave),接下来就可以实现自动调度的锁了。
* 实现了禁止中断自旋锁后即可打开syscall的中断了。
* 为了方便内核态的线程操作将原有的process模块又封装了一层thread接口长得和标准库一模一样std::thread。这样具体的同步互斥问题如哲学家就餐可以先在外部环境中依赖std库实现并测试然后方便地移植到OS环境中。
* 在此过程中又学习了关于内核抢占、同步互斥锁等相关资料感觉又是个大坑。并且发现我实现的RustOS一直是内核可抢占的主要依赖时钟中断进行线程切换不知要不要改掉。
### 第13周
本周完成的主要工作:

@ -42,10 +42,10 @@
#### lab7: Synchronization
- [x] MutexRust core lib built-in
- [ ] Semaphore
- [ ] Monitor
- [ ] Dinning Philosophers Problem
- [x] Mutex
- [x] Semaphore
- [x] Monitor
- [x] Dinning Philosophers Problem
#### lab8: File system

Loading…
Cancel
Save