2024年秋冬季开源操作系统训练营第一、二阶段总结报告
在开始正式报告之前,我想说作为一位三战老兵,三次参加开源操作系统训练营,从一开始的只能勉强完成rustlings,再到现在完全实现第二阶段五个lab的所有功能。一路走来,走到今天实属不易。遥想一年前的我,因为二进制漏洞挖掘与利用(pwn)接触到操作系统,并励志于弄清操作系统的运行原理,但是苦于实在没有学习路径而踌躇不前,是开源操作系统训练营给予我接下来奋斗努力的方向。在此也非常感谢这个项目。
另外这一路上结识的,给予我帮助的伙伴,我也非常的感激并庆幸认识了你们。尤其是23年春夏季的助教徐堃元老师和朱懿老师,没有你们的帮助我可能还卡在一些看上去非常令人费解而又苦恼的地方,你们在rcore与系统能力赛上的指导对我的启发很大,在这里向你们表示感谢。
我身边的朋友曾问我,为什么要做操作系统?操作系统在外人看来晦涩难懂,且在实际业务场景中似乎并不需要我们去细究它的实现与原理。每到这种时候,我就会想到登月前肯尼迪总统所做的讲话:We choose to go to the moon, not because it’s easy, but because it’s hard.
做难而正确的事情,至少目前为止,我都是这样干的。至于前程?但行好事,莫问前程。在我还有精力干的年纪,稍微干点事情吧。
2024.11.7 stone-san于寝室
第一阶段总结
第一阶段就是rustlings的通关。一开始我对rust语言一无所知,且光看一些书籍的话,学习的效果也不佳,所以使用rustlings来实操是有助于我理解rust语言的。在这个阶段我觉得rust不同于其他高级语言的一些地方一个就是所有权的概念,使用所有权,编译器在编译时会根据一系列规则进行检查,且这种检查只发生在编译期,因此对于程序运行期,不会有任何性能上的损失。我理解是说同一个作用域范围内,数据只能被一个变量所使用,如果说发生了赋值的情况,那么除非是这个数据类型本身支持自动拷贝之外,像String这样的类型则必须显式调用clone方法来进行拷贝。这样在内存安全上,rust从根本上杜绝了一些c语言里会有的问题,诸如悬垂指针等。
另外,训练营版本的rustlings本身也加了一些自己的内容。比如今年新增的数据结构与算法章节,就给rustlings通关带来了新的挑战。不过这对于接下来rcore是有好处的,因为rcore里全是数据结构相关的一些东西。
第二阶段总结
第二阶段是rcore,有五个lab,分别对应着多道程序、地址空间、进程管理、文件系统、并发同步这几个我认为操作系统里最基本的一些实现。
多道程序的实验主要是实现一个系统调用来获取当前任务信息。第一次做的时候并不清楚到底要干什么,但是随着多次的学习了解了,这个TaskInfo结构体的信息其实是要我们在任务结构体里先增加一些对应的字段,然后再通过实现方法来设置这些字段的内容或者是获取这些字段的信息,最后输出给用户。其实绝大多数后面的任务基本也就是对结构体字段的完善与实现方法的撰写。、
在地址空间的实验中,除了上一章的实验之外,还增加了内存分配mmap和munmap的实现。因为开启了虚拟内存,所以现在我们不能直接对任务结构体操作,因为会遇到数据存储在两个页上的情况,我们只能先根据token找到真实地址,然后再获取内容。至于mmap和munmap,那涉及到对页表和memory_set的更改,为此维护了一个BTreeMap,来对应内存地址与具体页的关系。
在进程管理里,先前的任务结构体被重新修改为了进程。并且要实现的系统调用也与进程的产生有关系。此外,对stride算法也有了一定的了解。本质上还是进程里添加了一个字段,然后在每次执行进程时都重新处理一次prio字段并更新记录,以决定下一次执行的进程。
文件系统是比较难啃的一章,这里首先文件系统我不是很了解,而且这一章里也大量使用了闭包,这都是要从零开始学习的地方。由于文件系统大改,sys_spawn需要适配上新的文件系统。这里我原本的写法是将这些操作全部放置于syscall/process.rs下,但是问题在于data会莫名其妙的数据置零。所以只能将这个任务扔进task中了。
而并发同步是我另一个不熟悉的领域,在此之前我对并发这里并没有过多的了解。通过这章的学习也了解了互斥锁和信号量的实现机制。总之还是非常有挑战性以及很有趣的。
之后……
至于之后要做什么?我不知道,我手上的活有很多。有很多的任务等待我去完成,比如三阶段的项目制实习,比如明年系统能力赛的内核实现,比如软件所的kernel开发任务。总之一直在路上。我想到了我小学时候读过的一本关于奥数的书,在那里,序言的最后写下一句话:
奔跑了,就别停下!
我想。应该是这样的。