Appearance
前言
- 写作时间:
2026-03-23 - 当前字符:
3466
这是一本关于OS的教程,可能有人会疑惑,有那么多经典的OS教材,并且出自大牛之手,经过了时间和万千学子的检验,你为什么还要写一本?
其实理由很简单,因为兴趣。
程序是个我们每天都在写的东西,但一个程序究竟是怎么被"跑"起来的?从敲下回车到结果出现在屏幕上,中间发生了什么?操作系统(Operating System)在背后做了哪些事?我强烈地感觉到,只有彻底学一次OS,才能真正"看到"一个程序的原貌,而不是永远隔着一层抽象去猜。对计算机和程序本身的热爱,驱动我去弄清楚这些事情。
对于一个从未接受过计算机科班教育,也没有体系地学过操作系统的我,这件事很复杂。但我很认真,并且我认为这不是我写这本书的阻碍。恰恰相反,我既能在这个过程中深入学习OS并实践,我也可以最大地发挥我自己独特的理解优势,将那些课本上复杂,冷漠和"显而易见"的概念和逻辑,以一个初学者更容易理解的方式表达出来。这本书就是这个过程的产物:一个同样在学习的人,把自己搞懂的东西整理出来。需要更加审慎和敬畏的是,尊重前人们在OS的宝贵实践,尊重源码。
这本书的路线
传统操作系统教材的结构通常是:先讲一章理论,再做一个配套练习。理论和实践分离,练习往往是为了验证某个知识点而设计的人工场景。
这本书反过来。整个学习过程围绕 4 个真实项目展开。每个项目都是一个可用的系统,不是教学玩具。操作系统的概念在构建这些系统的过程中引入,遇到什么问题就学什么知识。
理论课和项目课分开编排。理论课按知识域分章,提供完整的知识体系。项目课独立成章,每个项目包含多课,列出前置理论依赖,读者学完对应理论后可随时开始项目。这样既保证理论的纯粹性,也让每个项目有完整的全貌,不再被理论课的顺序绑定。
四个项目
zish 是贯穿全书的项目。从最基础的 fork/exec/wait 开始,逐步加入管道、信号处理、作业控制(Job Control),直到最后移植进自己写的操作系统内核。每学一个新的进程管理概念,就在 zish 里用上它。这个项目覆盖进程生命周期、信号、进程组与会话等核心概念。
zedis 是一个 Redis 兼容的内存键值存储。从单线程事件循环(Event Loop)和 RESP 协议解析开始,逐步加入 fork() + 写时复制(Copy-on-Write)的 RDB 快照持久化、AOF 日志、I/O 多线程。这个项目的重点是性能:如何用单线程 epoll 事件循环高效处理大量并发连接,如何利用 fork() 的 COW 特性在不阻塞服务的情况下做持久化。项目的正确性和性能可以直接用 redis-cli 和 redis-benchmark 验证。
zcryptfs 是一个透明加密文件系统,参考 gocryptfs 设计。它使用 FUSE(Filesystem in Userspace)接口在用户态实现完整的文件系统语义,对文件内容做分块 AES-GCM 加密。构建过程中需要理解 VFS(Virtual File System)的四大对象、页缓存(Page Cache)、日志(Journal)、fsync 语义等概念。这个项目的重点是正确性:在任意时刻断电或崩溃后,文件系统的数据不能丢失也不能损坏。
zigos 是最后的整合项目。把前三个项目中学到的操作系统概念迁移到裸机环境,在 QEMU 上从零构建一个能跑自己 zish 的微型操作系统。涉及引导(Boot)、页表、中断(Interrupt)、上下文切换(Context Switch)、系统调用(System Call)、设备驱动等概念。
课程地图
全书分为两大部分:10 章理论课(32 课)和 4 个项目(14 课),合计 46 课。理论课提供完整的知识体系,项目课独立成章,可回引多篇理论课。
理论部分
| 章 | 课时 | 内容 |
|---|---|---|
| 基础与概览 | 4 | 操作系统与硬件、内核设计、特权边界、系统调用 |
| 进程管理 | 7 | 生命周期、信号、进程组与会话、CPU 调度、Linux 调度器、命名空间、Cgroups |
| 线程与并发 | 5 | 线程模型、同步原语、死锁、事件驱动、内核同步机制(RCU、Seqlock) |
| 内存管理 | 4 | 地址空间与分页、虚拟内存、内存映射、内核内存分配器(伙伴系统、Slab) |
| 网络与 IPC | 3 | Socket 与 TCP、进程间通信、零拷贝与高性能网络 |
| 存储与 I/O | 3 | I/O 分层架构、中断与设备驱动、块层与 I/O 调度 |
| 文件系统 | 4 | 文件与目录、VFS、日志机制、崩溃一致性 |
| 保护与安全 | 1 | 保护环、访问控制、Capabilities、Seccomp、内存安全 |
| 虚拟化 | 1 | 硬件虚拟化、KVM、Virtio 半虚拟化、容器与虚拟机 |
| 可观测性 | 1 | perf、ftrace、eBPF、生产环境性能诊断 |
项目部分
四个项目各自独立成章,可以在学完对应前置理论后随时开始。
| 项目 | 课时 | 内容 |
|---|---|---|
| zish:Shell | 3 | 基础 REPL → Job Control → Namespace 隔离 |
| zedis:内存数据库 | 4 | 事件循环 → fork-COW 持久化 → TCP 优化 → 性能分析 |
| zcryptfs:加密文件系统 | 3 | FUSE 用户态文件系统 → 透明加密 → 崩溃一致性 |
| zigos:裸机操作系统 | 4 | 引导与内存 → 中断与进程 → 系统调用与文件系统 → 设备与网络 |
为什么用 Zig
作为一个CS人,谁能拒绝一个新鲜事物或者工具?(但有一说一,Zig这玩意其实是个老东西了)Zig 的发明者 Andrew Kelley 在博客里写过,Zig 的目标是取代 C 和 C++。一门号称"比 C 更安全"的语言,还拥有 comptime 这样在编译期做计算的特性,光是这些就足够让人想动手试试了。
选择 Zig 而不是 C 来做操作系统项目,不是因为 C 不行,而是因为用 Zig 更好玩,更有挑战。Zig 和 C 一样能直接调用系统调用、操作裸指针、控制内存布局,但编译器帮你挡住了 C 最容易犯的错误:悬垂指针(Dangling Pointer)、缓冲区溢出(Buffer Overflow)、未初始化内存(Uninitialized Memory),这些在 Zig 中要么是编译期错误,要么会在运行时立即报出明确的错误信息,而不是静默地损坏内存。它还能禁用标准库,生成不依赖任何运行时的裸机二进制,这意味着 zigos 项目里从页表设置到中断处理的每一行代码都是自己写的,没有隐藏的运行时魔法。说了那么多好听的,反正就是咱们不能直接抄OS源码了。
我有点贪婪。我想亲手搞懂这门语言的设计和它的价值,而不是听别人来评价。用它来写操作系统,正好一箭双雕。
读者须知
这本书假设读者会编程,能在终端里用命令行完成日常操作。具体来说,需要熟悉至少一门编程语言,了解基本的数据结构,能读懂简单的 C 代码。
不需要提前了解操作系统内核、硬件架构或调度算法。这些正是本书要教的内容。Zig 语言也不需要提前学习,相关语法会在项目中按需介绍。
小结
| 项目 | 定位 | OS 概念域 |
|---|---|---|
| zish | 贯穿全程,概念练兵场 | 进程、信号、调度、命名空间 |
| zedis | 性能向,内存数据库 | 事件循环、线程、同步、TCP、fork/COW 持久化 |
| zcryptfs | 正确性向,数据可靠性 | 文件系统、VFS、日志、崩溃一致性 |
| zigos | 裸机整合,从零构建 | 引导、页表、中断、系统调用、设备驱动 |
四个项目,四个不同的切面。合在一起,覆盖了一个程序员需要了解的操作系统核心知识。