第26期 | 一万行代码的第一天:1991年9月17日

操作系统 · · 九羲科技

一、Linux 线

(第3章开篇。切口:0.01版:一万行代码的骨架里有什么)

1991年9月17日,赫尔辛基大学。一台386前面,Linus Torvalds把一个叫linux-0.01.tar.Z的压缩包传上了ftp.funet.fi。没有发布会,没有公告——他只给之前在comp.os.minix上回帖表示感兴趣的几个人发了邮件。Linux的"出生证明",就是一次悄悄的上传。

名字是场意外。他自己管它叫Freax——free、freak,再加Unix的x,攒了半年的工作目录都叫这个。ftp管理员Ari Lemmke觉得这名字不行,没商量,直接建了个叫"Linux"的目录。Linus后来认了,还自嘲说自己原先嫌Linux太自恋。

有多大?88个文件,公开统计10,239行(含注释和空行)。我今天亲手从kernel.org的Historic存档把它拉下来数了一遍:目录骨架是boot、fs、init、kernel、lib、mm、tools、include——八个目录,就是一台操作系统的全部家当。最大的单文件是fs/namei.c,678行,干的是路径名解析:连第一天,文件名解析都是最硬的骨头之一。

随包附的RELNOTES-0.01是一份诚实的"缺憾清单",Linus原话:"This is a free minix-like kernel for i386(+) based AT-machines... As the version number (0.01) suggests this is not a mature product. Currently only a subset of AT-hardware is supported (hard-disk, screen, keyboard and serial lines), and some of the system calls are not yet fully implemented (notably mount/umount aren't even implemented)."

注意最后一句:mount、umount都没实现。一个连"挂载"都不会的操作系统。更狠的是:它自己编译不了自己,得借Minix的肚子出生——在Minix下用gcc 1.40编,跑在Minix的文件系统上。自己编译自己,要等到两个月后的0.10。

而最动人的一行不在发布说明里,在代码注释里。init/main.c开头十几行,Linus写道:"Yeah, yeah, it's ugly, but I cannot find how to do this correctly and this seems to work... Most of this was trial and error, and some bios-listing reading. Urghh."翻译一下:对,很丑,但我没找到正确做法,这个能跑。大部分是试出来的,还翻了BIOS清单。呃。

main()的最后一行是`for(;;) pause();`——0号进程就这么永远闲着,把CPU让给别人。一个操作系统的第一天,诚实得有点可爱。

这里藏着杨振宁说的"发展性研究"。Unix的原理1969–1974年就成熟了,0.01没有发明任何新原理,它赢在把成熟原理在386上工程化:386实现、Minix启发、GCC嫁接、Internet分发——"先实际后原理"。对照组是GNU Hurd:追微内核的原理完美,1991年远未可用。原理研究管30–100年,产品研究管制造改良,中间这一层——把原理变成能跑的东西——最脆弱,也最关键。

孙过庭《书谱》里那句"贵能古不乖时,今不同弊",放在这里正好:0.01不泥古(没把Minix的16位包袱背过来),也不趋时(没追微内核的时髦)。骨架先求平正,险绝是以后的事。

二、原生AI OS线:推演

如果AI的操作系统先出现,它的0.01会是什么样?照着Linus的样子想:一个能调度一个agent的最小回路,加一份诚实的缺憾清单。版本号0.01本身就是设计——"not a mature product"写在前头,社区才知道力往哪使。今天的AI demo常常反过来:包装得像成品,缺憾藏在脚注里。Linus的0.01提醒我们:先把"能跑"和"缺什么"同时端上桌。

还有一层。Anderson在"More is Different"里说:还原论不等于建构论——你知道386指令集怎么工作,不等于能从它推出Linux;每一层都需要新概念。0.01的sched.c里,调度就是counter按时间片递减:调度=切指令流,那是冯诺依曼时代的调度观,整套抽象(进程、线程、线性地址空间)都是为顺序指令流设计的。而今天的算力主体是向量阵列:GPU的SIMT、Tensor Core的矩阵乘。AI-native OS的0.01,调度起点就该不一样:不按时间片切指令流,而按算力阵列的占用、按token预算来排。旧抽象与新硬件的错位,要从第0.01版就写进设计里,而不是留给第61章。

Hofstadter在《GEB》里讲的"怪圈"在这里也有回声:系统指涉自身时,会升起一级。0.01还不能自举——它借Minix的肚子出生,自己编译自己是两个月后的事。从"借肚子"到"自举",是一个系统成年的仪式。AI OS的成年礼会是什么?一个能训练、部署、运维自己的agent的系统——那一天,它的版本号才配叫1.0。

金刚经里那句"如来说世界,即非世界,是名世界",放在这里也贴切:所谓操作系统,即非操作系统——只是一万行386汇编加几个驱动——是名操作系统。破掉"操作系统"这个名相,才能重新命名AI时代的系统。

三、现在动手线:今晚就能亲手试的一步

把0.01拉下来,亲手数一遍。下面这条链路我今天亲手跑通过:

mkdir -p ~/lx001 && cd ~/lx001

wget https://www.kernel.org/pub/linux/kernel/Historic/v0.01/linux-0.01.tar.gz

tar xzf linux-0.01.tar.gz

find linux -type f | wc -l # 88

ls linux # boot fs init kernel lib mm tools include

wc -l linux/init/main.c # 147

三个可观察的现象:一,88个文件,一个晚上读得完——这是"小到能被完整读完"的最后一个Linux,理解操作系统的最好入口,配合AI逐行讲,一晚上就能走完一遍。二,main.c只有147行,main()结尾是`for(;;) pause();`;去读读开头的注释,那句"Yeah, yeah, it's ugly... Urghh."——看一个伟大项目的第一天,是怎么诚实地写"丑代码"的。三,fs/namei.c 678行全场最长:路径解析,三十年后依然是文件系统里最绕的部分,第一天就埋下了。

照见之镜再看一层:AI让"读懂一个操作系统"从博士课题变成了一个晚上的事。可能性是:0.01加AI讲解,就是最好的OS入门课。离落地还差一步:一个一键复现的实验环境——qemu里跑起来的0.01镜像、配好的讲解prompt。缺的不再是算力,是有人把这一课做出来。

这剂"0.01方法论"是通用的:任何一个复杂项目——一家企业的私有化AI平台、边缘盒上的第一个demo、下一个产品模块——第一天都该是0.01式的:最小可运行,加一份诚实的缺憾清单。别一上来就造1.0。

觉 然 小 注

一万行代码里,最动人的不是代码,是注释里的那声Urghh。诚实,是操作系统最好的第一行。

引 用 与 出 处

  1. Notes for linux release 0.01(Linus原文转引),https://www.systutorials.com/notes-for-linux-release-0-01/
  2. Exploring the internals of Linux v0.01(10,239行、66个系统调用),https://seiya.me/blog/reading-linux-v0.01
  3. The First Linux Kernel Is Released Online(Freax/Ari Lemmke/88文件考),https://www.todayonce.com/en/sep-17/the-first-linux-kernel-is-released-online.html
  4. Linux 0.01源码(kernel.org Historic存档,亲手下载验证),https://www.kernel.org/pub/linux/kernel/Historic/v0.01/linux-0.01.tar.gz
  5. Hofstadter《Gödel, Escher, Bach: An Eternal Golden Braid》,1979("怪圈与自指"化用,出处见课题弹药库,已核实)
  6. Anderson, "More is Different", Science, 1972("还原论不等于建构论"化用,出处见课题弹药库,已核实)
  7. 孙过庭《书谱》"贵能古不乖时,今不同弊"(公有领域,课题已核实引文)
  8. 《金刚般若波罗蜜经》"如来说世界,即非世界,是名世界"(鸠摩罗什译本)

· · ·

← 返回资讯中心