前言

操作系统是与开发者日常工作息息相关的基础软件,我们编写的所有应用程序都运行于操作系统之上,一旦涉及到对应用性能、资源等的优化,就离不开对操作系统工作原理的理解,同时操作系统也是学习计算机底层技术的敲门砖,掌握其原理会对程序的开发带来潜移默化的帮助。

目前操作系统的书籍或教材大多偏理论为主,站在现代操作系统的基础上介绍各类繁杂的概念,一是缺乏实践难以真正理解概念,动手永远是最好的吸收知识的方式;二是站在结果上看难以还原整个演进历史,不知道为什么要这么做。

当然国内外也有一些好的实践课程,比如 Mit6.S081 的 xv6系统,但这个课程已经提供了一个较为完整的kernel,更多是在其基础上实现功能;又比如来自清华的 rCore,也是非常好的从0搭建操作系统的教程,但还是不够极简。所以不如让我们回到20世纪50年代,从第一行代码开始实现自己的操作系统。

内容概述

本系列实践的原则是 "最小可用",思维方式是 "走一步看一步",不做过多的预先设计,确保使用最少的知识和代码来完成每一步的迭代,这样既能保证每一行代码和配置的含义都是清晰的,也能更好还原操作系统的演进历程。

每一章的结构会比较类似,主要包含以下几部分内容:

  1. 讨论这一步要实现什么功能,达到什么效果,为什么要这么做
  2. 要写哪些代码,为什么这么写 (仅提供个人实现,读者可以根据自己的思路自由编写)
  3. 虚拟机上运行代码的效果
  4. 真机上运行的效果 (验证我们的操作系统是真实可用的)
  5. 衍生阅读:如 这一功能在历史上是怎么做的、现代操作系统又是怎么做的

技术选型

指令集架构

指令集架构是计算机处理器能够运行的指令集合,因为OS需要和CPU及其它硬件直接打交道,往往在内核中会存在小部分汇编代码,这部分是和底层平台绑定的,所以需要选择支持哪些CPU指令集架构。

目前常见的指令集架构有:X86,是一种复杂指令集架构,指令集数量繁多(超过千条),X86是完全闭源的,只有通过购买Intel的芯片才能获得,X86侧重兼容性和性能,覆盖了大部分的PC和服务器市场;ARM是一种精简指令集(RISC)架构,相比X86则较为开放,它将处理器架构作为基础技术被授权的芯片产商集成(如高通、苹果),特点是节能、低功耗,如今广泛用于智能手机和嵌入式场景; RISC-V同样是精简指令集架构,设计上是三者中最为简洁的 (基础指令只有40多条),更吸引人的是它的指令架构是完全开源的,未来会更多应用于AIoT场景。

根据上述分析,CPU指令集会首先支持 RISC-V,因为其设计精简易上手、且架构开源,后续系统内核成型后再考虑对其他指令集如X86的支持。

编程语言

在内核的编程语言选择上,C和Rust都是首选,在与底层硬件的控制上都有着不错的支持。相比之下,Rust最大的优势是号称可以解决C编程中常见的内存安全问题,但同时它的学习路线也更为陡峭;而另一方面C语言则更易入门,且可参考的案例更多,比如 Linux 和 xv6等。

本着快速上手和尽量还原OS演进历史的目的,开发语言上选择最接近底层的高级语言 C 语言,把重心更多放在OS的设计和实现上,后续如果想学习Rust,可以考虑用Rust重写。

运行环境

由于首先支持RISC-V指令集,那么操作系统最终编译生成的产物在 X86的开发机上肯定是无法运行的,所以要么需要一台有 RISC-V 芯片的真实计算机,要么有一个能模拟 RISC-V 计算机的模拟器。在模拟器方面QEMU是最佳选择,它的原理是在软件层面去模拟硬件,例如CPU寄存器会被模拟成内存中的一个数组;真实硬件方面,目前已经有不少RISC-V芯片的开发板量产了,比如全志D1,K210等。

  • 模拟器选择 QEMU,可以在 X86 的开发机器上模拟出一台 RISC-V 的计算机
  • 如果觉得跑在模拟器上不过瘾,还可以尝试在各RISC-V开发板上运行,验证我们的操作系统是可以真机运行的
  • 操作系统成型后可考虑支持X86架构,最终目标是能制作成U盘启动盘,在身边任意一台PC机上运行

可见这也是很适合零基础入门的实践,需要掌握的只是 常用的linux命令、简单的C语言语法、简单的 RISC-V 汇编指令,仅此而已。 而即使没有这些知识也没关系,在后面的实践应用中也能很快掌握。

章节目录

这个从零开发的操作系统命名为 MinOS (Minimum usable operating system),源码见:minos

第一章: 第一条指令

标签: minos

添加新评论