本章是操作系统从 0 到 1 系列的第一篇文章,主要说明了本系列文章的目标、章节规划、前置知识储备及参考文章;文章编写力求图文丰富、逻辑完备,利用主线把知识串联起来,最终将从 0 到 1 实现一个操作系统所需要的知识都有机结合起来。
其实本科阶段在学习操作系统的时候就有跟着清华大学的 ucore 项目,当时感觉学到了很多,但由于 ucore 是补充关键代码而非从真正意义上的 0 开始写一个操作系统,时至今日,细节已经完全模糊了,这是本系列产生的第一个原因。
第二个原因也在于,之前在看 sakura 师傅的知乎问答时看到关于打基础的内容,提到了:"自己写一个操作系统,并用自己的写的编译器来编译一个程序",又唤起了我之前的雄心,此时此刻,正适合有一个系列来记录这个过程,于是,Boooooom!
# 目标
网上已经存在一些非常成熟的教程了,但可能或多或少都有一点点过时,软件版本的巨大变动使得过去教程中的一些东西可能有些过时(指的是工具部分,而非理论部分),这是我希望解决的第一个问题;同时我还希望能做到以下几点:
用丰富的图片去解析原理,用足够的资料去支撑理论。
该系列将尽可能详细的对原理和实践进行解释,如果你仍然有疑问,欢迎评论,我会在看到后及时回复。
最终实现一个微型操作系统,并在其上运行自己实现的编译器去编译运行一个程序。
# 章节规划
非最终版,在系列结束后本部分会更新成确定版本
🎉🎉本系列的所有文章可以通过左手侧边栏中的系列文章索引进行快速到达~
- 序言
- 环境准备
- BIOS 启动
- GDT 与保护模式
- 虚拟内存实现
- 加载并进入 kernel
- 显示与打印
- 全局描述符表 GDT
- 中断处理
- 虚拟内存完善
- 实现堆和 malloc
- 第一个 kernel 线程
- 多线程切换
- 锁于多线程同步
- 进入用户态
- 系统调用
- 简单文件系统
- 加载可执行文件
- 键盘驱动
- 运行 shell
# 前置知识储备
操作系统本身就比较复杂,想自己实现操作系统并运行更需要很多其他的知识,这些知识中关于操作系统原理部分的知识会详细讲解,但涉及到工具的部分(模拟工具,编译工具等等)就不会过多的深入,只会讲一点于实现操作系统有关的部分,一切为主线服务。
如果你已经具备以下知识,那么你可能可以较为轻松的接受本系列所讲知识,并将主要精力放在代码实践上,而如果你不是很了解以下知识,其实也没关系,不明白了就去搜索学习就好,带着问题学知识本身就是一种很好的学习方式,这些知识包括:
- C 语言能力
- 一点 x86 汇编能力(可以在项目中提高);
- 熟练使用 Linux 系统,以及 Linux 下的系统编程经验;
- gcc,Makefile 等工具的使用;
- 对编译,链接,执行代码的原理有足够的认识;
- 硬件以及 OS 对内存的管理原理,尤其是虚拟内存;
- 程序在操作系统中的加载,执行过程,内存的使用和分布;
- 中断的概念和处理;
- 进程,线程的概念及原理;
- 多线程编程,同步与锁的概念;
# 参考文章
- https://github.com/ruiers/os-tutorial-cn/tree/chinese
- https://segmentfault.com/a/1190000040124650
- https://wiki.osdev.org/Main_Page
- https://github.com/cfenollosa/os-tutorial