|
|
|
@ -2,6 +2,41 @@
|
|
|
|
|
|
|
|
|
|
这里以天为单位,以周为周期,按时间倒序维护了开发日志。
|
|
|
|
|
|
|
|
|
|
### 第15周
|
|
|
|
|
|
|
|
|
|
#### 2018.06.06:FS-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周
|
|
|
|
|
|
|
|
|
|
本周完成的主要工作:
|
|
|
|
|