第43期 | 门开了,就不许再关上
一、门开了,就不许再关上
2012 年 12 月 23 日,圣诞前两天。Linus Torvalds 在内核邮件列表上对维护者 Mauro Carvalho Chehab 开火——v3.8-rc1 里一个补丁把某个 ioctl 的错误码改成了 ENOENT,PulseAudio 和一堆 KDE 多媒体应用当场去世。Linus 的原话:"If a change results in user programs breaking, it's a bug in the kernel. We never EVER blame the user programs." 然后是那句全大写:"WE DO NOT BREAK USERSPACE!"¹
这是内核的第一戒律:因为内核升级而坏掉的用户程序,永远是内核的错。门牌号一旦发出去,就收不回来。
数一数这张表。1991 年 0.01:67 扇门(第 41 期核对过)。今天的 x86_64:0 号 read,1 号 write,一路排到 466 号 removexattrat²——近四百七十扇,只增不减。
表里躺着化石。i386 的表上,1 号还是 exit,3 号还是 read,4 号还是 write³——1991 年的门牌号,一个没挪过。stat 的结构体想改?旧的不许动,只能另开新门:于是表里有了 sys_oldstat、sys_oldfstat、sys_oldlstat,还有 sys_olduname、sys_oldolduname⁴。"old" 是刻在源码里的墓志铭:改不动,就另起一扇门。
表里还有死门。174 号 create_module、177 号 get_kernel_syms、178 号 query_module、180 号 nfsservctl²——功能早被删了(nfsservctl 在 3.1 版移除⁴),门牌号却钉死在原地,谁也不许重用。
门的材质换过三代——从 int 0x80 到今天的 syscall 指令(第 41 期),门牌一个没换。glibc 的包装函数在门外做好翻译,"ABI compatibility is preserved for old binaries"⁴。
这是发展性研究最硬的一课:不发明新原理,只把契约守成纪律。Unix 的原理 1970 年代已经成熟,Linux 靠"门牌永恒"这条纪律,把成熟原理变成了三十年的复利。
二、AI 的门,门牌号会过期
如果操作系统的第一批用户是智能体,门牌号先从整数毕业。智能体敲门天然带结构化意图——函数名加一段参数 schema,门后是按意图分发的表。整数门牌是 1970 年代的吝啬,67 个调用挤进一个字节(第 41 期)。
纪律也会变。"永不打破"保护的是不能被重编译的存在——人类编译好的二进制。智能体可以被重训练、重部署,AI-native OS 敢用版本协商代替永恒契约:握手时先对一下契约版本,对不上就降级。
但别急着扔掉这条纪律。稳定的接口才是生态复利的来源——protobuf 把它升了维:字段可以加,编号不许改、不许删。门牌从整数变成 schema,"不许拆门"的魂没变。
维纳在《Cybernetics》(1948)里写过:通信的前提,是收发双方共享一套代码⁵(思想化用)。内核与用户态之间,ABI 就是这套代码。Linus 守护的不是几个数字,是通信本身不断。
AIOS 那篇论文把这条路走了一半:LLM agent OS 里,工具接口就是新的系统调用表⁶(思想化用)——"门"的概念没变,变的是门后站着谁。
三、今晚,数一数门,敲一扇死门
三条命令,在手边任何一台 x86_64 Linux 上都能跑。
第一,数门:
grep -c '^#define __NR' /usr/include/x86_64-linux-gnu/asm/unistd_64.h
这台机器的头文件里,373 个门牌号(头文件版本不同数字有出入;内核 6.14 的表已经排到 466 号)。
第二,敲死门:
python3 -c "import ctypes; l=ctypes.CDLL(None, use_errno=True); print(l.syscall(174), ctypes.get_errno())"
输出 -1,38。174 号 create_module:门后是堵墙,errno 38 = ENOSYS,"查无此功能"——但门牌永远不拆、不重用。
第三,看门牌:
grep -E '__NR_(read|write) ' /usr/include/x86_64-linux-gnu/asm/unistd_64.h
0=read,1=write,雷打不动。
给智能体设计工具接口时,把这条抄过去:门牌号是承诺,不是草稿。工具一旦被智能体学会,函数名不许改,参数只许加可选的。放在任何一家企业的私有智能中心、任何一台跑本地模型的网关上,都吃这一套——schema 存进 git,老字段消失,CI 直接拦下。
觉 然 小 注
「是法平等,无有高下。」⁷
0 号的 read,和 466 号的 removexattrat,平起平坐。1991 年的老门牌和今年的新门牌,都是门。ABI 里没有贵贱,只有承诺。
引 用 与 出 处
- [1] Linus Torvalds. LKML 邮件(致 Mauro Carvalho Chehab,"WE DO NOT BREAK USERSPACE!",回应 v3.8-rc1 打破 PulseAudio). LKML 存档, 2012-12-23. https://lkml.org/lkml/2012/12/23/75
- [2] Linux 内核源码. arch/x86/entry/syscalls/syscall_64.tbl(一手核对:0=read、1=write、466=removexattrat;174/177/178/180 为无入口点的保留号码;335=uretprobe). TI 镜像 v6.14-rc5 分支, 2025. https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/arch/x86/entry/syscalls/syscall_64.tbl?h=v6.14-rc5
- [3] Linux/i386 system calls(i386 系统调用表:01 sys_exit、03 sys_read、04 sys_write). http://asm.sourceforge.net/syscall.html
- [4] Michael Kerrisk. syscalls(2). Linux man-pages(NOTES:多版本系统调用 oldstat/olduname 并存;nfsservctl 于 3.1 移除;glibc 包装保证旧二进制 ABI 兼容). https://manpages.ubuntu.com/manpages/jammy/man2/syscalls.2.html
- [5] Wiener, N. Cybernetics: Or Control and Communication in the Animal and the Machine. MIT Press, 1948. (思想化用)
- [6] Mei et al. AIOS: LLM Agent Operating System. arXiv:2403.16971, 2024. https://arxiv.org/abs/2403.16971 (思想化用)
- [7] 鸠摩罗什 译. 《金刚般若波罗蜜经》. 后秦弘始年间(约402年)译本. (引"是法平等,无有高下"一句)
· · ·