Levy's ink.
Doodles, whimsy & life.
About
Blog
Mess
Catalog

从零开始写个操作系统I - 序 & 目录

距离上次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

  • ❌ 拿A给苹果Offer:拿A也不会在邮箱里收到苹果CoreOS的Offer... 但鉴于苹果公司招人多以组为单位,且标准高度差异化,一个15-410拿A的成绩单能在面试苹果CoreOS组时帮你一路保送应该是可能的。

建议和警告

若干对想上这门课的同学们的建议和警告,片面之辞,仅供参考。

  • 先修课程
    • 15-213 (Intro. to Computer Systems) 一定要学... 其中涉及的基础同步数据结构、原语、计算机体系结构入门知识非常关键。如果学了但记不清楚的同学建议复习复习。
    • 15-440 (Distributed Systems) 非常建议学习。该课程涉及的系统编程技巧和Troubleshoot Race Condition的经历会在做Project中派上大用场。
    • 15-418 (Parallel Computer Architecture and Programming) 建议学习。该课程涉及的并发编程、计算机架构相关知识对Project有一定帮助。由于15-418的主题更多涉及现代、多核CPU/GPU,15-410的Project搭建在旧单核CPU (奔2)上,故418中的很多顾虑在实现课程Project中不会出现。
    • 15-746 (Storage Systems) 可学。为了调整合理的工作量,15-410的操作系统简化了文件系统部分的要求。而15-746的教学内容和项目则可以作为完美的补充剂服用。
  • 不建议选410的人群
    • 试图靠此课程毕业的同学:由于这门课从头到尾都充斥着退课、挂科的风险,尽管这门课的硬核属性让其几乎名列所有系统类项目的项目内可选课程清单上,但靠15-410毕业为非常不明智之举。
    • 同时选修大量其他课程的同学:该课的工作量几乎断绝了选另一门“较重”课程的可能性。
    • GPA完美主义者:上文提到,该课程拿A难度非常高,建议以GPA 4.0为目标的学霸们三思。

总之... 这是一个绝对值CMU两万多学费的课程。但鉴于其高风险、高压力、高标准的特征,建议大家选课前和项目导师/任课教授(Dave Eckhardt)充分沟通。