0%

2023 开源操作系统训练营第二阶段总结报告 - Misonoi

楔子

第一次看到这个训练营是在QQ频道上面的rust频道, 正巧当时有人在说OS训练营的问题, 正巧也确实对实现操作系统很感兴趣就参加了。 在此之前其实已经有rust的基础和使用rust开发项目的基础。

关于rust

rust是我非常喜欢的语言, 可以说是目前最喜欢的语言也不为过。诸如C, C++, java, python, go, kotlin, js这些语言我都学过, 也用它们或多或少的写过东西, 但是其中rust是最深得我心的。

比如说它的枚举中可以存放关联值, 这样就可以通过枚举的类型来进行分发; 还有它强大的泛型能力, 在学习rust之前其实我对泛型编程的理解一直不太深, 直到我学习了rust, 参考了rust标准库的源码, 对泛型的理解才更上了一层。

一阶段的许多东西都在圣经里面有所提及, 但是多出的那几个test确实是我不曾知道的, 后面我又去了解了一些rust插件开发, 对于有反射的语言, 可以使用反射动态读入来进行插件化。 而没有反射的诸如rust这样的编译型语言, 可以利用FFI进行插件化, 也就是把rust打包成动态链接库, 比如说用#[no_mangle]来阻止混淆函数名称, 然后通过调用库的方式调用链接库中的函数, 这样就可以实现插件化。 毕竟不能添加用户自定义的插件什么应用是完整的呢?, 所以一阶段确实是对我也很有帮助的。

关于二阶段

一阶段我用一个晚上速通之后就开始看文档, 也大概花了两周时间。

对于这个阶段我最大的感想就是, 理论需要与实践相结合。 在学习也学过操作系统这门通识课程, 当时也觉得课程里面说的什么比如特权级, 中断, 分页分段之类的学习起来并不难, 但是要是让我用代码来实现, 那必然是抠破脑袋都想不出来的。 直到现在我虽然是把所有的实验都完成了, 文档也看完了, 但是如果要我独立写一个操作系统, 也不一定可以。

我看的主要是v3的文档, 于我而言最有难度的是第四章和第六章, 分页管理和文件系统, 真的和其他章节不是一个难度。 不然即使如此, 要做完实验并不需要完全理解文档, 实验相对来说还是比较容易的。

关于各个实验

ch3

ch3是实现获取taskinfo的系统调用, 主要想法就是在运行过程中维护调用计数。 第一次遇到了爆栈空间的问题, 所以就给entry.asm的栈空间调大了, 事实证明也确实可以

ch4

ch4实现sys_mmap的方面, 我是通过参数分配对应的页表, 生成一块MapArea然后插入到MemorySet里面, sys_umap也只需要从MemorySet里面删除

ch5

ch5实现sys_spawn, 我觉得它与fork + exec的区别就是不用复制父进程的空间, 那么生成一块空白的空间按照exec处理即可

ch6

ch6实现sys_linkat, 在索引中加一个entry即可, 而sys_unlink我认为不容易删除一个entry, 我选择的是向里面写了一些非法数据, 让文件名读取不到这个节点

ch8

ch8实现死锁检测, 银行家算法需要提前获知需要的资源总数, 对于互斥锁我想资源数量就是1, 对于信号量就是对应的值

总体

rCore逐步递进, 从一个功能较少的小系统成为一个功能较多的大系统, 但是我感觉文档里面还有很多东西没有说的很清楚, 比如说rust函数和汇编中函数的互相调用, 参数和返回值传递之类的不是很明白。 除此之外文档还是非常全面的, 我感觉我主要的问题就是不太理解汇编和rust的交互。

另外就是在调试方面有一些问题, 不容易以代码级的方式调试, gdb调试也不太直观。