第24期 | 操作系统为什么长得像四合院?
一、Linux 线
1987年,阿姆斯特丹自由大学的 Andrew Tanenbaum 教授碰上一个教学上的麻烦:AT&T 给 Unix 第七版发的许可证,禁止在课堂上研读源码。很多大学干脆不教 Unix 了,只讲理论。
Tanenbaum 的 remedy 很硬:自己从零写一个。"not using even one line of AT&T code"——不用 AT&T 一行代码。用户视角下和 Unix 兼容,里面完全不同。他在书的前言里写,读者可以"dissect a real operating system to see what is inside, just as biology students dissect frogs"——像生物系学生解剖青蛙一样,解剖一个真实的操作系统。
这本书叫《Operating Systems: Design and Implementation》,1987 年 Prentice-Hall 出版。书里印了 12,010 行删减版的 C 源码:内核、内存管理、文件系统,一行不少。源码和二进制,随书放在软盘里发行。这个为教学而写的小系统,叫 Minix。
Minix 的内部结构,书里画得很清楚,一共四层。
最底下 Layer 1,是内核:接住 trap 和中断,保存、恢复寄存器,调度进程,还要干消息传递的体力活——检查消息目标合不合法、在物理内存里定位收发缓冲区、把字节从发送方拷到接收方。
Layer 2,住着一堆 I/O task:磁盘、终端、打印机、网卡各有一个 task,还有两个特殊的:clock task(管时钟和调度心跳),和 system task。system task 有点意思——它自己不做普通意义上的 I/O,它的存在,是替那些不允许直接碰内存的进程,干跨内存区拷贝这类脏活。
Layer 3,是服务器进程:MM(memory manager,管 fork、exec、brk 这些和内存相关的调用)和 FS(file system,管 read、mount、chdir 这些和文件相关的调用)。它们跑在低特权级,连 I/O 端口都摸不到。资源管理的力气活在第 1、2 层,系统调用的"解释权"在第 3 层。
最上面 Layer 4,用户进程:init、shell、编辑器、编译器,你写的程序。它们和硬件之间隔着整整三层,想干点什么,只有一条路:发消息。
第 1、2 层会被链接成一个叫 kernel 的二进制,共享内核地址空间。一次系统调用的旅程是这样的:用户进程发消息给 MM 或 FS——`syscall(who, syscallnr, msgptr)`,who 就是收件人;服务器能在用户态办就自己办了,办不了,再发消息请 system task 出手。
Minix 四层解剖图:用户进程(倒座)→ 服务器 MM/FS(厢房)→ I/O tasks(门房)→ 内核(正房)。红线是特权边界,一次系统调用就是一封从上往下递的消息。
妙处在这里:三十多年后你去翻 Minix 的源码包,顶层目录依然是 kernel/、mm/、fs/ 三个——目录即平面图。1991 年 Linus 读的,正是这张图。看得懂,才敢动手改;敢动手改,才有了后来的故事。
这四层,越看越像一座四合院:内核是正房,住在最里,最要紧;MM 和 FS 是东西厢房,管事的;用户进程是倒座和来往的客人,临街,最热闹。Tanenbaum 当年大概没想过四合院,但"每间房住谁、一目了然"这个要求,全世界的匠人是相通的。
二、原生 AI OS 线:如果 AI 先画这张图
Minix 的分层,是为"让人看懂"和"线性指令流"设计的:楼层即特权,谁离硬件近,谁权力大。
如果 AI 的操作系统先出现,这张图大概率不长这样。楼层可能按"认知"来切:感知层(传感器与世界输入)、世界模型层(记忆与预测)、意图层(目标与规划)、执行层(工具与行动)。权力的划分也不再是"能不能碰硬件",而是"能改写谁的记忆、能替谁定目标"。
有意思的是,Minix 的消息传递(send/receive/reply),已经是维纳"感知—比较—执行"回路的雏形。AI OS 里,消息的内容会从"系统调用号+参数"变成"意图+上下文",system task 那个位置上,可能站着一个"意图路由器"。
但"分层"这个思想本身不会死。贝塔朗菲早就说了:跨层次,规律会变。每一层都需要新概念——AI OS 也会分层,只是切楼板的位置不同。
三、现在动手线:今晚就能摸到 1987 年
找一台能联网的 Linux 机器,几分钟,你就能把 1996 年发行的 Minix 1.7.2 源码包拼出来(普林斯顿大学镜像站还留着当年分 8 张软盘发行的包):
mkdir -p /tmp/minix && cd /tmp/minix
for i in 01 02 03 04 05 06 07 08; do
curl -sO https://mirror.math.princeton.edu/pub/oldlinux/Linux.old/Minix/1.7.2/src/SRC.$i.gz
done
zcat SRC.*.gz > src.pack && gzip -dc src.pack > src.tar
tar xf src.tar src/kernel src/mm src/fs && ls src/
你会观察到三件事:第一,`ls src/` 吐出来 kernel、mm、fs——三十多年了,平面图没变;第二,`wc -l src/mm/*.c` 数一数,内存管理服务器两千多行,一个周末读得完;第三,打开 src/kernel/system.c,那就是当年替所有人干脏活的 system task。
再往深想一层:Tanenbaum 做的是"把原理讲清楚"(教学),Linus 做的是"把原理做出来"(发展性研究)。Minix 是原理的讲义,Linux 是原理的工程化。Unix 的原理 1969–1974 年就已成熟,赢的从来不是原理,是中间那层"做出来"的功夫。
如果你手头也在做边缘 AI 硬件或私有化项目,不妨画一张自己系统的"四合院图":哪间是正房(最核心、最不能动),哪间是厢房(办事的服务),哪间是倒座(天天和用户打交道)。画完看看:是不是有间房住得太挤了?
觉 然 小 注
「如来说世界,即非世界,是名世界。」——所谓分层,即非分层,是名分层。楼层是假名,能住人才是真的。(化用自《金刚经》第十三品,鸠摩罗什译本)
引 用 与 出 处
- Minix 词条(1987/Minix 1.0/12,010 行源码/Prentice-Hall 等信息核实于此),https://en.wikipedia.org/wiki/Minix
- Minix 1 源码在线浏览(Albert Woodhull 维护),https://minix1.woodhull.com/sources.html
- Minix 1.7.2 源码镜像(普林斯顿大学镜像站,8 张软盘分卷),https://mirror.math.princeton.edu/pub/oldlinux/Linux.old/Minix/1.7.2/
- Andrew S. Tanenbaum《Operating Systems: Design and Implementation》,Prentice-Hall,1987,ISBN 0-13-637406-9("dissect frogs"引自该书前言,据公开流传的第三版 PDF 前言页转引)
· · ·