从零开始写 OS 内核 (序篇)

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

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

项目预期

网上也有不少相似的很好的系列教程,我也但愿个人这个系列可以稍微带来些不同的地方,你能够大概地有个心理预期:多线程

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

知识准备

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

再具体一些,但愿你的理论和实践能力能够覆盖如下这些:操作系统

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

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

推荐书目和教程

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

JamesM's kernel development tutorials

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

操做系统真相还原

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

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

项目目录

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

  • 从 BIOS 开始启动到实模式
  • 进入保护模式
  • 加载并进入内核
  • 显示打印
  • GDT 和 IDT,中断处理
  • 打开虚拟内存
  • 实现堆和 malloc
  • 建立第一个内核线程
  • 多线程运行与切换
  • 进入用户态
  • 进程的实现,加载可执行程序
  • 系统调用的实现