距离上次po文又过去了接近四个月,再不更文这博客怕是要凉了... 当然这次断更真不是我拖延症发作,而是因为本学期沉迷守望屁股 学习无法自拔。来CMU前一直对一门史诗级课程有所耳闻,传言此门课拥有高达每周50小时的workload、工业级的代码质量要求、从零搭OS内核的上万行编码数量和极高的拿A难度,更有传言,拿A的学生可直接得到Apple CoreOS Offer。为了满足探究校园传说真实性的好奇心,我在第一年把学位课程都完成后,抱着不怕死的态度选上了这门课 -- CMU 15-410: Operating System Design and Implementation。
由于一些机缘巧合以及个人不想错过课程任何内容的倾向,我最终一个人完成了本该两个人协同完成的所有Project。尽管如此,我并不鼓励这种行为 -- 且不说极高的挂科风险,单刷在这门课中注定会带来弊端:由于该课重点之一在于写出稳定性高、bug少、代码风格优秀的OS内核(TA们会将提交的代码逐行批注,并指出各种设计上的问题、各类bug),而单人可用时间和精力极难在保证内核功能完备性时还兼顾稳定性、代码质量,所以项目最终大概率依然会和期望有所差距(如果你是Linus Torvalds当我没说)。当然,单刷带来的好处也是非常诱人的:作者可以完全自主设计并实现整个内核的全部模块,充分体会底层架构的有趣之处。
正值圣诞节留守匹村无所事事,容我把上课期间的一些感想和学到的技术问题在此总结一下。本篇日志主要涉及心得体会,而对于真正“从零开始写个操作系统”的技术部分则大概会以下图的形式分章总结。
// 所以说这是一个千年大坑...
首先说说几个校园传说的真实性:
❌ 每周50小时工作量:虽然工作量因人而异,但我依然觉得每周50小时过于夸张。即使在单刷最艰难的一个due(P3-Checkpoint1)那周,我花在这门课的工作时间也没超过40小时,而正常情况下每周耗时在15~25小时之间波动。总而言之,谣言。
✔ 工业级代码质量要求:真事。该课对系统设计合理性、错误处理完备性、边界情况覆盖的周到性、代码复用性要求都极高,且公开的测试十分简单(强迫开发者自己考虑测试)。由于几乎每次Project都是在上次Project源码基础上开发,不稳定的代码或不好的代码质量都会给接下来的开发带来灾难性的后果(甚至挂掉)。另外,由于TA人工批注分数占比很大,开发者需要在源码中加入足够多的注释方便TA理解,否则在分数上遭受惩罚 -- 说是工业级代码要求绝对没问题。
✔ 从零开始搭建OS内核:基本正确。在这门课程中,官方唯一提供的代码是bootstrap部分,而从刚进入Protected Mode开始剩下的部分(例如安装驱动、设置IDT、设置GDT、以及一切OS常规逻辑)则全部由开发者完成。经过4次Project的迭代,最终目标是一个多任务、完全抢占式、支持多线程、支持多虚拟I/O控制台、支持虚拟机的完整OS内核。
✔ 上万行编码数量:正确。我的最终实现共计12,000行代码(包含注释、头文件、汇编)。
✔ 拿A难度极高:每年0~2个拿A选手,需要其写出正确、高质量、bug少的代码并在期中期末考试中拿到较好的成绩方能拿A。
If you get a B, I'll be very proud of you. -- Garth Gibson
若干对想上这门课的同学们的建议和警告,片面之辞,仅供参考。
总之... 这是一个绝对值CMU两万多学费的课程。但鉴于其高风险、高压力、高标准的特征,建议大家选课前和项目导师/任课教授(Dave Eckhardt)充分沟通。