前言
偶在某个群里听说了开源公开课的存在,讲OS就带你实现一个小型OS,讲计网就带你实现计网的5层架构。作为一个对底层感兴趣,又忍受不了学校课程的照本宣科的人,心想这样的课程也太有意思了吧,于是开启了我自学公开课的旅途。
关于开源操作系统训练营
说来很巧,在我将要把6.s081刷完的时候,在相关互助群里听说了这个开源操作系统训练营,于是自然地抱着进一步学习的想法就报了名。现在看来这门课确实符合我的期待:
- 和学校课程最大的不同也是开源课程共同的优点,不会单讲理论,而是结合实践真正地实现一个能够使用的程序
- 能够学习更加现代化的rust语言,其中的包管理器和所有权确实很实用
- 由于xv6和rCore都是基于riscv的,很多功能的实现方式都是差不多的,所以学习难度很平缓,又能巩固之前所学
rust
这门语言刷新了我对计算机语言的理解,以往了解的 cpp, py, java, js 给我的感觉都是换汤不换药,基本熟悉了一门其他的都能很快上手。但rust很特别,第一次看到变量默认不可变,以及赋值就不可使用的所有权等机制,让我感到很神奇。但仔细想想也合理,从来没有人说过计算机语言一定就要是什么样子,而只是为了更好的写出好用的代码而服务。这或许也是计算机让我着迷的地方,在这个世界里一切皆有可能,只取决于你是否有想象力与能力将其构建出来。
而学习的过程花了大概一周的时间,基本是跟着rustling的题目去学习对应的知识点,就是感觉做完之后也只是很粗略的过了一遍,并不能灵活的运用,所以决定等第二阶段遇到了问题再继续学
rCore
总结
rCore的实验总体上不算难,将文档和代码结合着看基本就能理解然后实现:
- ch1让我了解了裸机平台以及如何在其上运行程序,ch2让我明白了riscv中断的具体流程,这两章补全了081没有提及的两个关键的机制
- ch3通过向TCB添加两个字段记录对应信息即可
- ch4关键要理解用户空间和内核空间的区别,需要先在用户空间找到对应的物理地址,再写入内容
- ch5的
sys_spwan()
是参照sys_fork()&sys_exec()
结合实现的,sys_proi
向TCB添加的字段要放在inner
里 - ch6的api非常多,需要结合代码中的使用来理解每个api的作用与使用方式,相较于前面的实验难度大了很多
总体来说,循序渐进逐步将rCore变成一个功能越来越丰富的内核,从一开始的批处理到后面的交互式,非常有意思。
建议
作为第一次参加这个训练营,感觉在某些需要有明确引导的地方并没有,于是绕了挺多弯路,当然也可能是我比较笨,例如:
- 可以在项目的
README
里对如何开始实验多一点说明,一开始非常迷茫不知道该干嘛 - 然后是对测试多一点说明:由于文档里并没有提到可以本地 Grading 的
ci-user
,我在ch4云端多次重测后回看README
才知道可以在本地 Grading;而 Grading 会把 rCore 的输出都存在stdout-ch*
中,于是不明白为什么没有输出错误原因