起源
之前就看到了rcore训练营,但是报名后没有没加到群里,群满了无法再加,工作忙和后续的几次时间也没对上,所以就自己按照rcore的教程进行学习一步一步的写出了自己的一个os。
这次刚好新开营时间对的上,看到最后阶段有新东西,很兴奋所以加入了这次训练营
rust
其实个人学rust已经学了很久了,在工作里也在用rust写项目,也实现过网络框架,所以这次rust语言对我来说并不是什么问题,个人的技术站主要是java、go、rust和一些c(主要是一些ebpf和CRIU是c写的,所以需要看懂)
用了c和rust以后很明显的感觉就是内存管理rust编译器可以帮忙管理,而减少悬垂指针等等非法内存异常,rust也会对数组进行检测,当然有时候为了速度优化的话也可以用unsafe去除这些下标检测
整体来说就是rust提供了半自动化的内存管理和编译器的生命周期检测来帮助我们减少内存安全问题,让问题尽量暴露在编译器而不是运行期,外带cargo和rust的高级抽象能力,这些都是rust的生产力,也很适合多人协作大型项目。
二阶段
其实对于代码整体结构来说,已经看过一次了,并且跟着教程写了一个,所以代码结构对我来说并不是太大的问题,主要是时间的问题,对于上班党来说时间是真的很紧,基本下班以后就在做,而且会做到比较晚
lab1
其实是一个很简单的lab,taskinfo和系统调用的次数统计,对于了解代码结构的我来说不是什么特别难的事,很轻松就完成了
问答题是很好的问题,也帮助我回忆和加深了risc-v的寄存器的作用,包括trap的流程,这个很重要,直接以代码展现出来,没学rcore的时候平时听到系统调用,其实是很抽象的,并不知道系统调用是怎么从用户态切换到内核态的,而rcore非常精彩的给我解答了这个问题,并且以代码展现,不再抽象。只能说感谢开源!lab2
mmap 和 munmap 匿名映射,对我来说其实也不难,不过反而是问答题让我再次加深了SV39的结构,页表,页表项等等这些其实理解很抽象,包括用户态是怎么用到MMU的,MMU和操作系统存储的页表这些是怎么结合的,在这一张再结合linux的一些代码就理解了。其实是riscv 使用 SATP 寄存器来保存 MMU 映射表的根地址
lab3
spawn和stride 调度算法,这个其实也不算特别复杂,在给予fork和exec代码中只需要理解 spawn和他们的区别,就很容易写出来,而stride调度算法用一个小顶堆实现即可。因为之前看了linux的task_struct的实现,所以比较轻松就能理解。
lab4
这个要求实现linkat和unlinkat 这个加深了我对硬连接的理解,并且文件系统的这章让我对linux的vfs也更加理解,以及操作系统是如何读取磁盘的数据的不过这个lab有一个坑,那就是在spawn以后再次加载文件就无法读出来文件,需要去修改TaskControlBlock 结构体上加#[repr(align(64)] 不知道具体原因还。整体来说明显会感受到磁盘读取和内存有异曲同工之妙。
lab5
死锁检测,其实一开始我看到那个要求我是懵的,看了一眼算法,大概理解想干啥,但是比较抽象,后来才知道这就是银行家算法,我觉得这里不如直接先说这是银行家算法,再给出后续的数据结构的定义,这个就非常考察细心了,主要就是资源的分配、分出、释放,需要格外注意,否则都无法通过,顺带这里也有一个坑,就是检测用了sleep,sleep用的是get_time,所以要实现这个api不然程序就会卡在那
总结
整体来说,rcore是很好的一个课程,让人对操作系统的实现理解更加深刻,包括和cpu的互动,trap、switch、磁盘、内存、甚至在问答题里还加入了扩展Kernel page-table isolation 这个让我又一次掌握了新姿势,也理解了为什么要创建跳板。
学完收获很大,怀着对底层知识的渴望打开rcore,理解底层知识,对我来说感到非常的开心,理论不再是抽象,而是具体的实现。
感谢开源!