第52期 | 同一扇门,两套门牌号
一、同一扇门,两套门牌号
read 在 64 位世界是 0 号,在 32 位世界是 3 号
1991 年,0.01 版的门后挂着 67 个号(第 33 期)。三十多年过去,本机内核头文件里,x86-64 的号已经排到 461¹:getrandom 是 318(2014 年),clone3 是 435(2019 年),futex_waitv 是 449(2022 年)。新来的只许排队尾,老号一个不许动——第 43 期"门开了就不许再关上"的另一面:门不能关,门牌也不能换。
同一扇门,门牌有两套。64 位世界:read=0、write=1¹;32 位世界:read=3、write=4²。socket 在 64 位是 41 号单间¹,32 位却挤在 102 号 socketcall 的大通铺里²——当年为省号,一整套网络调用塞进一个号,靠子功能号再分房。
老房客拿着旧门牌来敲门,门后有翻译台:compat 层(CONFIG_IA32_EMULATION³)。32 位程序报 102,内核听成"socket 那一家",再按子号分派。2026 年的内核,还认 1990 年代的门牌。
新城区另起了一套。arm64、riscv 这些新架构共用 asm-generic 号表⁴:read=63;老城区的 open(2 号)直接除名,只有 openat(56 号)。新城区从"开文件必须带目录 fd"的时代起步,不背历史包袱。
照见一层平时看不见的。硬约束:号是 ABI 的一部分,改一个号,砸掉所有按旧号敲门的老程序。谁在买单:内核维护者——两套号表加一张翻译台,背了三十年。被大家默认的前提是错的:"号越大,功能越重要"。不,号只是出生证;41 号的 socket 和 449 号的 futex_waitv,在门后一律平等。
香农 1948 年讲编码⁵,化用一句:号表就是一套码本,解码器(内核)必须永远认旧码——兼容的全部数学,就这一句。孙过庭《书谱》里"贵能古不乖时,今不同弊"⁶,化用过来正好:老号不改,不是泥古,是"古不乖时";新号不断追加,是"今不同弊"。
二、AI 的调用,不用门牌号:如果先有智能体,门上挂的该是名字
如果操作系统的第一批用户是智能体,数字门牌这套东西可能根本不会出现。agent 调工具,是函数名加结构化参数——名字本身就是门牌。MemGPT 把上下文当内存管⁷,AIOS 给 LLM 配了专属"内核"⁸——在那套设想里,agent 的每一次调用出生时就是结构化的,不需要"号→名"的翻译表。
兼容也不靠号表,靠理解:名字变了、参数挪了地方,AI OS 自己对齐语义,不用查 461 行的对照表。
但也要诚实。名字也会腐:重命名、语义漂移,"open"今天开文件,明天开什么说不准。AI OS 省不掉"意图的 ABI"——版本化的语义契约:这个名字在这个版本里,到底承诺了什么。号表是死的,契约是活的;"许出去就收不回"(第 43 期)这条铁律,换个马甲还在。
范式之眼补一句:数字门牌是线性时代的产物——查表、跳转,一次一号。向量时代,调用也许不再是"报号进门",而是在意图空间里的最近邻路由:说出想干什么,系统把你领到最像的那扇门前。
三、今晚,查查你机器上的门牌:三条命令,看两套号表
手边任何一台 Linux 机器,今晚就能看。
第一条,看 64 位的门牌:
grep -E "#define __NR_(read|socket|clone3) " /usr/include/x86_64-linux-gnu/asm/unistd_64.h
本机输出:read 0,socket 41,clone3 435¹。
第二条,看新城区的门牌:
grep -E "#define __NR_(read|open|openat) " /usr/include/asm-generic/unistd.h
read 63,没有 open,只有 openat 56⁴——老城区的 2 号,在这里查无此人。
第三条,数一数门牌总数:
grep -c "#define __NR_" /usr/include/x86_64-linux-gnu/asm/unistd_64.h
本机 460 多个。三十年,从 67 长到 460+,一个没删。
落点。给智能体定工具接口时,记住门牌的教训:名字和参数契约一旦许出去就收不回(第 43 期),第一版就要想好,版本号从第一天写进契约。本地模型、边缘盒子、视频 AI 平台、企业私有智能中心——凡是"别人会来调你的东西",规矩都一样:先许的,就是永远的。
觉 然 小 注
如来说世界,非世界,是名世界——化用《金刚经》第十三分"如法受持分"⁹。门牌号是假名,门后的契约才是实。
引 用 与 出 处
- [1] x86-64 系统调用号(read=0、write=1、socket=41、getrandom=318、clone3=435、futex_waitv=449、最大号 461;本机内核头文件 /usr/include/x86_64-linux-gnu/asm/unistd_64.h 一手核对). (无网址,随内核头文件发布)
- [2] i386 系统调用号(read=3、write=4、socketcall=102;本机 /usr/include/x86_64-linux-gnu/asm/unistd_32.h 一手核对). (无网址,随内核头文件发布)
- [3] syscalls(2) 手册(系统调用总表;IA32_EMULATION 兼容说明). https://man7.org/linux/man-pages/man2/syscalls.2.html
- [4] asm-generic 统一号表(read=63、无 open、openat=56、socket=198;本机 /usr/include/asm-generic/unistd.h 一手核对). (无网址,随内核头文件发布)
- [5] Shannon, C. E. A Mathematical Theory of Communication. The Bell System Technical Journal, 27(3): 379–423, 1948. https://doi.org/10.1002/j.1538-7305.1948.tb01338.x(编码与码本,思想化用)
- [6] 孙过庭. 《书谱》. 垂拱三年(687)墨迹本. ("贵能古不乖时,今不同弊",思想化用)
- [7] Packer, C. et al. MemGPT: Towards LLMs as Operating Systems. arXiv:2310.08560, 2023. https://arxiv.org/abs/2310.08560
- [8] Mei, Y. et al. AIOS: LLM Agent Operating System. arXiv:2403.16971, 2024. https://arxiv.org/abs/2403.16971
- [9] 鸠摩罗什 译. 《金刚般若波罗蜜经》第十三分"如法受持分". 后秦弘始年间(约402年)译本. ("如来说:世界,非世界,是名世界",思想化用)
· · ·