操作系统课的集体创伤
学过操作系统的人大概都有类似的记忆:教材厚得像砖头,概念抽象得像哲学,考完试之后脑子里只剩下"进程是资源分配的基本单位,线程是调度的基本单位"这种八股文。
至于真正的操作系统长什么样?不知道。代码在哪里?没见过。能不能自己写一个?想都不敢想。
这不是你的问题,是教学方式的问题。
传统操作系统课程有个致命矛盾:概念必须讲全,但代码不可能看全。Linux 内核超过 2800 万行代码,就算是精简版的 xv6 也有近 1 万行——对于一个学期的课程来说,这已经是"只能挑重点讲"的体量了。
结果就是:学生记住了一堆名词(上下文切换、页表、中断向量),却从未完整地理解过一个操作系统是怎么从第一行代码跑到最后一行的。
Cornell 大学的博士生 Yunhao Zhang 决定解决这个问题。他的方案简单粗暴:把整个操作系统压缩到 2000 行代码,让每个学生都能从头到尾读完。
这就是 egos-2000。
什么是 egos-2000
egos-2000,全称 Earth and Grass Operating System,是一个专为教学设计的微型操作系统。它的核心代码恰好 2000 行(用 cloc 工具计数),主要由 C 语言编写,配合少量 RISC-V 汇编。
别被"2000 行"这个数字骗了,以为它只是个玩具。egos-2000 实现了一个操作系统应该有的所有核心组件:
- 内存管理:物理内存分配、虚拟地址空间
- 进程控制:进程创建、调度、上下文切换
- 系统调用:用户态与内核态的边界
- 文件系统:inode、目录、文件读写
- 进程间通信:消息传递机制
- Shell:命令行交互界面
它能在 QEMU 模拟器上运行,也能烧录到真实的 RISC-V 开发板上跑起来——比如 Digilent 的 Arty A7 FPGA 板,或者 Sipeed 的 Lichee RV64 模块。
更有意思的是,有人成功在 egos-2000 上跑起了 DOOM。没错,就是那个 1993 年的经典 FPS 游戏。一个 2000 行的操作系统,能撑起一个 3D 射击游戏的运行——这说明它的架构设计是认真的,不是糊弄学生的 demo。
三层架构:Earth、Grass、Application
egos-2000 的名字来自它的三层架构设计。这个命名很有意思:Earth(地球)在最底层,Grass(草)长在地球上,应用程序则在草上面运行。
Earth 层:硬件抽象
Earth 层负责与硬件直接打交道。它实现了四个核心接口:
tty:终端设备,处理键盘输入和屏幕输出disk:磁盘设备,读写存储介质mmu:内存管理单元,处理地址转换和页表timer:定时器,支撑抢占式调度
这一层的代码是硬件相关的。如果你想把 egos-2000 移植到另一种 CPU 架构,主要改动就在这里。
Grass 层:操作系统核心
Grass 层是操作系统的"内核",但它不依赖具体硬件。它实现了:
process:进程管理,包括创建、销毁、调度syscall:系统调用分发ipc:进程间通信
这一层的代码体现了操作系统的核心抽象。学生可以在这里看到"进程是什么"、“系统调用怎么实现"这些问题的具体答案。
Application 层:用户程序
最上层是用户态程序,包括:
- 文件系统服务进程
- Shell 命令解释器
- 各种用户命令(ls、cat、echo 等)
这三层通过 egos.h 头文件中定义的 struct earth 和 struct grass 两个结构体连接起来。接口清晰,边界明确。
代码量分布:每一行都有意义
让我们看看 2000 行代码是怎么分配的:
| 模块 | 行数 | 说明 |
|---|---|---|
| SD 卡驱动 | 222 | Earth 层,磁盘 I/O |
| 异常处理 | 48 | Earth 层,中断和陷阱 |
| 内存管理 | 106 | Earth 层,MMU 相关 |
| 内核(调度+系统调用) | 358 | Grass 层核心 |
| 文件系统 | 339 | Application 层 |
| 应用程序 | 264 | Shell 和命令 |
| 库函数 | 262 | 基础设施 |
| Makefile | 54 | 构建系统 |
| 板级工具 | 172 | 硬件适配 |
| 其他 | 175 | 杂项 |
注意内核只有 358 行。这意味着一个下午就能读完操作系统最核心的部分——进程调度和系统调用的全部实现。
对比一下:Linux 内核的调度器 kernel/sched/ 目录下有超过 3 万行代码;xv6 的 proc.c 加上 trap.c 也有近千行。egos-2000 把同样的概念压缩到了极限,同时保持了可读性。
9 个课程实验:从 Hello World 到多核锁
egos-2000 配套了一本在线教程《The EGOS Book》,包含 9 个循序渐进的课程实验。这套实验被 Cornell CS4411/5411 和 Northeastern CS4973/6640 等课程采用。
核心实验(本科级别)
| 实验 | 主题 | 你会学到 |
|---|---|---|
| P0 | Hello World | 代码段、数据段、堆、栈 |
| P1 | 协作式线程 | 线程、yield、上下文切换 |
| P2 | 抢占式调度 | 中断处理、定时器、优先级 |
| P3 | 系统调用与保护 | 特权级、CSR 寄存器、IPC |
| P4 | 虚拟内存 | 页表、地址空间 |
| P6 | 文件系统 | 块、inode、目录 |
进阶实验(研究生级别)
| 实验 | 主题 | 你会学到 |
|---|---|---|
| P5 | I/O 设备驱动 | 内存映射 I/O、DMA |
| P7 | 网络栈 | 以太网、TCP/IP、UDP |
| P8 | 多核与锁 | 启动加载、互斥、原子操作 |
实验设计的精妙之处在于:每个实验只引入一个新的硬件概念。
比如 P1 和 P2 让你玩线程和调度,但完全不涉及特权级和页表——这些复杂的东西留到后面的实验再加。这样学生可以专注于理解一个概念,而不是被多个新知识同时轰炸。
为什么选 RISC-V
egos-2000 选择 RISC-V 作为目标架构,这不是随便选的。
指令集简洁
RISC-V 是一个现代的精简指令集,设计时就考虑了教学需求。它的特权级模型(M-mode、S-mode、U-mode)清晰明了,控制寄存器数量有限,比 x86 的历史包袱少太多。
开源生态完善
RISC-V 是开源的,从指令集规范到处理器实现都可以免费获取。学生不仅能理解操作系统,还能往下挖到 CPU 微架构——有人已经用 SystemVerilog 写了一个能跑 egos-2000 的简易处理器 mriscv。
模拟器成熟
QEMU 对 RISC-V 的支持非常完善。不需要买任何硬件,一台普通笔记本就能跑起来。macOS、Linux、Windows 都支持。
真实硬件便宜
如果你想在真机上跑,Sipeed 的 Lichee RV 模块只要几十美元。比买一块 x86 开发板便宜得多。
与 xv6 的对比
提到教学操作系统,不得不提 MIT 的 xv6。这是目前最流行的教学 OS,被全球数百所大学采用。egos-2000 和它有什么区别?
代码量
- xv6:约 8000-10000 行
- egos-2000:恰好 2000 行
xv6 的目标是"Unix 的简化版”,功能相对完整。egos-2000 的目标是"能读完的操作系统",极致精简。
架构
- xv6:传统的单内核设计
- egos-2000:三层架构,接口清晰
xv6 的代码组织更接近真实的 Unix,但边界不够清晰。egos-2000 用 struct 显式定义层间接口,更容易理解模块划分。
学习曲线
- xv6:需要较长时间才能建立全局认知
- egos-2000:一个周末就能通读全部代码
如果你的目标是"理解操作系统的核心概念",egos-2000 更适合入门。如果你想深入研究某个特定子系统(比如文件系统或网络栈),xv6 提供了更丰富的实现。
硬件支持
- xv6:x86(原版)或 RISC-V(riscv 分支)
- egos-2000:仅 RISC-V
xv6 有 x86 版本,这对于理解传统 PC 架构有帮助。但 RISC-V 版本的 xv6 和 egos-2000 在硬件层面是可比的。
动手跑起来
想亲自体验 egos-2000?以下是最快的上手路径。
环境准备(macOS/Linux)
# 安装 RISC-V 工具链
# macOS
brew tap riscv-software-src/riscv
brew install riscv-tools qemu
# Ubuntu
sudo apt install gcc-riscv64-unknown-elf qemu-system-riscv32
获取代码
git clone https://github.com/yhzhang0128/egos-2000.git
cd egos-2000
编译并运行
make
make qemu
如果一切顺利,你会看到一个 Shell 提示符。输入 ls 看看文件系统里有什么,输入 cat README 读一下自述文件。
阅读代码的建议顺序
egos.h:理解三层架构的接口定义earth/earth.c:看看 Earth 层怎么初始化grass/process.c:进程管理的核心grass/syscall.c:系统调用分发apps/system/sys_file.c:文件系统服务
建议配合《The EGOS Book》一起看,书里对每个实验都有详细的背景说明和代码导读。
适合谁
egos-2000 不是万能的,它有明确的适用场景:
适合:
- 操作系统初学者,想建立全局认知
- 计算机专业学生,需要完成 OS 课程项目
- 对 RISC-V 架构感兴趣的开发者
- 想亲手写一个操作系统的极客
不适合:
- 已经熟悉操作系统原理,想深入研究某个子系统
- 需要生产环境可用的嵌入式 OS
- 想学习 Linux 内核开发
简单说:如果你从未完整读过一个操作系统的全部代码,egos-2000 是目前最好的起点。
延伸阅读
- 项目地址:https://github.com/yhzhang0128/egos-2000
- 教程书籍:https://egos.fun
- RISC-V 特权级规范:理解 M/S/U 模式的官方文档
- xv6-riscv:如果想进一步深入,可以看 MIT 的这个项目
写在最后
Richard Feynman 说过:“What I cannot create, I do not understand.”
操作系统是计算机科学的基石,但大多数程序员对它的理解仅停留在概念层面。不是因为操作系统太难,而是因为传统的学习材料太臃肿。
egos-2000 证明了一件事:一个完整的操作系统可以简单到让每个人都能读完。
2000 行代码,9 个实验,一个周末。
这可能是你第一次真正"看见"操作系统的全貌。