37

这是一个很早就想要做的系列,从零开始写一个小的操作系统,算是致敬以前学校里做的 OS 项目,也是希望能帮助到对这一块感兴趣的同学。

操作系统是计算机专业的核心学科,但我想即使是很多大学的 CS 本科操作系统专业课,也未必会设置这样规模和难度的项目。我是在 CMU 读研时修了它们的本科 OS 课程 15-410,这是课程的最大一个项目作业。对于很多计算机专业的同学,以及非科班转计算机的同学,尝试去做,哪怕是读懂这样一个项目,我想都是大有益处的。

项目预期

网上也有很多类似的很好的系列教程,我也希望我的这个系列能够稍微带来些不一样的地方,你可以大概地有个心理预期:

  • 这是一个偏实践+原理阐释的系列文章,我会尽可能多地用图片,而不是文字;
  • 这不是一个手把手教学的系列,有些动手的地方需要你自己实践解决,当然我会给出我的 Git 项目地址供你参考;
  • 我不会过多地贴代码逐行解释,也不会过多地解释一些课本或者手册上的专业知识(我认为你应该知道,或者有能力自学/查);

知识准备

为了读懂这个系列,你需要有足够的专业知识准备,总的来说就是大学操作系统专业课的所有理论知识,不要求精通,但最起码能了解,需要用到的时候知道怎么去查。这里推荐《深入理解计算机系统》这本书,如果你的水平已经覆盖了这本书,那么可以继续了。

再具体一些,希望你的理论和实践能力可以覆盖以下这些:

  • 扎实的 C 语言能力;
  • 还够用的 x86 汇编能力(可以在项目中提高);
  • 熟练使用 Linux 系统,以及 Linux 下的系统编程经验;
  • gcc,Makefile 等工具的使用;
  • 对编译,链接,执行代码的原理有足够的认识;
  • 硬件以及 OS 对内存的管理原理,尤其是虚拟内存;
  • 程序在操作系统中的加载,执行过程,内存的使用和分布;
  • 中断的概念和处理;
  • 进程,线程的概念原理;
  • 多线程编程,同步与锁的概念;

是不是看上去有点多......这的确是对你的基本要求,但还是那句话,不要求熟练精通,只需要能”了解“,你可以只有一个模糊的理论概念,薄弱的实践基础,可以在项目中提高这些能力,这其实也是这个项目的终极目的所在。

推荐书目和教程

仅仅看我这个系列可能未必足够,也不一定对每个人适合,所以我推荐一些我看过的书和教程:

JamesM's kernel development tutorials

这个系列是非常推荐的,作者的重点把握明确,组织结构和代码非常清晰。但这个系列项目规模偏小,没有 boot loader 和内核成形后的线程,进程以及系统调用方面的内容,整体比较偏 Demo 和教学性质,很适合初学。

操作系统真相还原

这也是比较推荐的一本书,与上面的系列相反,这本书从头到尾完整地实现了一个功能比较完善的内核,规模比较大,而且作者的讲解很细致,不厌其烦,甚至我都觉得有些啰嗦,比较适合在实际项目开发中作为参考和理论手册查询,而不适合从头到尾通读。

我的这个系列项目其实参考并综合了以上两者,取了折中,把规模和难度控制在了我认为比较合理的程度。

项目目录

在开始系列之前,我们首先列一下项目的目录清单,后面把这些坑一个个填上。

内容还是比较多的,我们一步一步来,准备出发吧。


navi
612 声望191 粉丝

naive