共计 1364 个字符,预计需要花费 4 分钟才能阅读完成。
这是一个很早就想要做的系列,从零开始写一个小的操作系统,算是致敬以前学校里做的 OS 我的项目,也是心愿能帮忙到对这一块感兴趣的同学。
操作系统是计算机专业的外围学科,但我想即便是很多大学的 CS 本科操作系统专业课,也未必会设置这样规模和难度的我的项目。我是在 CMU 读研时修了它们的本科课程 15-410,这是课程的最大一个我的项目作业。对于很多计算机专业的同学,以及非科班转计算机的同学,尝试去做,哪怕是读懂这样一个我的项目,我想都是大有益处的。
我的项目预期
网上也有很多相似的很好的系列教程,我也心愿我的这个系列可能略微带来些不一样的中央,你能够大略地有个心理预期:
- 这不是一个手把手教学的系列,有些入手的中央须要你本人实际解决,当然我会给出我的 Git 我的项目地址供你参考;
- 我不会过多地贴代码逐行解释,也不会过多地解释一些课本或者手册上的专业知识(我认为你应该晓得,或者有能力自学 / 查);
- 这是一个偏实际 + 原理阐释的系列文章,我会尽可能多地用图片,而不是文字;
常识筹备
为了读懂这个系列,你须要有足够的专业知识筹备,总的来说就是大学操作系统专业课的所有理论知识,不要求精通,但最起码能理解,须要用到的时候晓得怎么去查。这里举荐《深刻了解计算机系统》这本书,如果你的程度曾经笼罩了这本书,那么能够持续了。
再具体一些,心愿你的实践和实际能力能够笼罩以下这些:
- 扎实的 C 语言能力;
- 还够用的 x86 汇编能力(能够在我的项目中进步);
- 纯熟应用 Linux 零碎,以及 Linux 下的零碎编程教训;
- gcc,Makefile 等工具的应用;
- 对编译,链接,执行代码的原理有足够的意识;
- 硬件以及 OS 对内存的治理原理,尤其是虚拟内存;
- 程序在操作系统中的加载,执行过程,内存的应用和散布;
- 中断的概念和解决;
- 过程,线程的概念原理;
- 多线程编程,同步与锁的概念;
是不是看上去有点多 …… 这确实是对你的根本要求,但还是那句话,不要求纯熟精通,只须要能”理解“,你能够只有一个含糊的实践概念,单薄的实际根底,能够在我的项目中进步这些能力,这其实也是这个我的项目的终极目标所在。
举荐书目和教程
仅仅看我这个系列可能未必足够,也不肯定对每个人适宜,所以我举荐一些我看过的书和教程:
JamesM’s kernel development tutorials
这个系列是十分举荐的,作者的重点把握明确,组织构造和代码十分清晰。但这个系列我的项目规模偏小,没有 boot loader 和内核成形后的线程,过程以及零碎调用方面的内容,整体比拟偏 Demo 和教学性质,很适宜初学。
操作系统假相还原
这也是很举荐的一本书,与下面的系列相同,这本书从头到尾残缺地实现了一个性能比较完善的内核,规模比拟大,而且作者的解说很粗疏,不厌其烦,甚至我都感觉有些啰嗦,比拟适宜在理论我的项目开发中作为参考和实践手册查问,而不适宜从头到尾通读。
我的这个系列我的项目其实参考并综合了以上两者,取了折中,把规模和难度管制在了我认为比拟正当的水平。
我的项目目录
在开始系列之前,咱们首先列一下我的项目的目录清单,前面把这些坑一个个填上。
- 从 BIOS 开始启动到实模式
- 进入保护模式
- 加载并进入内核
- 显示打印
- GDT 和 IDT,中断解决
- 关上虚拟内存
- 实现堆和 malloc
- 创立第一个内核线程
- 多线程运行与切换
- 进入用户态
- 过程的实现,加载可执行程序
- 零碎调用的实现