终于,在漫长的,无聊的Debug之后,我和我的组员终于完成了PintOS的最后一个部分,完成了这个自己写的操作系统。现在回想起来,这个项目的工作量要远比想象中的大,implementation也比预想中有很多难点。现在终于写完了,望着自己的操作系统通过一个又一个的test,并且能够运行所有简单的C程序,感觉上这门课还是蛮值得的,不仅让我对操作系统背后的原理有了深刻的理解,而且也加强了我的各种写码能力。
PintOS是一个来自Stanford的教学性OS(操作系统)框架,包含一些最基本的OS功能来让学生自己完善操作系统的各种重要部件。在Berkeley这门课叫做CS162 Operating System,要在一个学期的时间里完成Pintos的四个核心部分,也是现代OS的核心组件:
- User program
- Memory
- File system
- Process Scheduling
其中除了Memory支持是自己写以外,剩下三个部分都是4人的Group Project。对于每个部分要提前规划Design Doc,然后四人分工合作实现计划的功能。
很多时候我们是每人负责一个部分,最后整合。最初这种strategy并没有什么问题,我们可以高效的完成各个组件,但是到了比较复杂的,相互关联的系统,比如文件系统,这个策略就带来了很多麻烦。比如说如果一个别人负责的模块有潜在的bug,导致你的部分无法正常运行,那么你要花很多时间才能找到问题所在。我们在这上面我们浪费了很多时间检查别人的code,而其实这些问题如果是一起解决的话则会高效很多。
C语言非常不好写,主要原因是没有很多主流语言的各种pre-compile的检查,导致很容易出现各种page fault,memory leak和implicit bug。因为debug message的匮乏,所以很多时候只能通过极其不好用的gdb工具debug。每次写C都感觉很心累,因为你要手动handle所有的error case,然后要为所有需要的buffer手动分配空间。操作系统需要管理各种硬件资源以及内存资源为各种程序提供支持,所以必须使用C这种底层的语言,现在想想虽然写起来痛苦,但是手动考虑各个步骤也让我对整个计算机系统背后的工作有了深刻的了解,花费的时间也是非常值得。