第41期 | 内核的门,为什么朝外开?

操作系统 · · 九羲科技

一、门是朝外开的

1991 年 9 月 17 日,0.01 版发布。内核初始化的尾巴上,sched_init() 里躺着一行代码——set_system_gate(0x80, &system_call)¹。

翻译成人话:把 0x80 号中断设成一扇"系统门",门后连着 system_call——内核处理系统调用的总入口。从此,任何用户程序只要执行一条 int $0x80,CPU 就放下手里的活,切进内核态,一头撞进这扇门。

门一共 67 个号。eax 里放门牌号,ebx、ecx、edx 里放捎带的参数,门后那张 sys_call_table 按号分发¹。1 号是 exit,敲门就是退出;4 号是 write,敲门就是写。整个 0.01,用户态和内核态之间,就这一扇门。

妙处在 set_system_gate 的"系统"二字。x86 有条铁规:门的特权级(DPL)必须大于等于敲门者的特权级(CPL),门才开。用户程序跑在 Ring 3——最没权的那一环。内核要是把门设成 DPL 0,用户一敲,CPU 直接甩回一个 #GP 保护故障,门纹丝不动。

所以这行代码把门的 DPL 定成了 3。内核在自己最森严的边界上,开了一扇朝外开的门:门轴攥在内核手里,推手却留给了最不可信的用户态。

分环的思想,1975 年 Saltzer 和 Schroeder 在《The Protection of Information in Computer Systems》里系统论述过²:最小特权、完全仲裁。但 1991 年这一笔反常识——最彻底的隔离,靠的不是把墙砌死,而是精确地只留一扇门,并且让它朝外开。焊死的墙没有用,门才是架构。

自绘示意图:x86 的四个特权环(Ring 0 在最内,Ring 3 在最外)与 0x80 号系统门——门的 DPL=3,朝用户态敞开。

二、如果 AI 先有 OS,门上不写门牌号

如果操作系统的第一批"用户"不是人,而是智能体,这扇门会长得不一样。

先消失的是门牌号。eax 里那个数字,是 1970 年代的吝啬——67 个调用挤进一个字节。如今智能体的"敲门"天然是结构化的:函数名加一段参数 schema。门后不再是一张按数字分发的表,而是一张按意图分发的表。MemGPT 把这条路走了一半:借操作系统的内存分级管上下文,用"中断"管控制流³(思想化用)——门,变成了语义的。

再往下,门的检查方向会反过来。1991 年的门防的是"恶意的用户",检查发生在进门时:号对不对、参数越没越界。智能体的麻烦不是恶意,是幻觉——它真心实意地调错了门。检查的重心于是从"进门验身份"移到"出门验效果":调用发出去容易,效果落下来之前,门得回头看一眼。这扇门,成了双向的。

还有一层。埃舍尔 1953 年的石版画《Relativity》里(文字描述代替配图),三拨人走在同一栋建筑里,每拨都坚信自己脚下才是地面⁴。Ring 0 俯视 Ring 3 的"上下",只是 CPU 的视角,不是宇宙的真相。特权是相对的——AI 原生的门上,或许不该刻"特权"二字,该刻的是"责任":谁为这一次调用的后果负责。

三、今晚,数一数你穿过了几次门

这扇 1991 年的门,今天还在——就在手边任何一台 Linux 机器上,只是换了材质。64 位上,int 0x80 让位给了 syscall 指令,更快,但位置没变:用户态和内核态之间,每一次调用都要穿门。

今晚就能亲手数。打开终端(没装 strace 先 sudo apt install strace),跑:

strace -e trace=write echo hello

你会看到一行:write(1, "hello\n", 6) = 6。一次穿门,一次返回。再来个大的:

strace -c ls > /dev/null

看最后一行:列个目录,几百次穿门。你每天敲的每条命令,都是几百次 1991。

还有个更好玩的:有些门,后来变成了窗户。

strace -e trace=clock_gettime date

输出里没有 clock_gettime——取时间的调用根本没进内核。Linux 把一小段内核代码(vDSO)直接映射进每个进程的用户地址空间⁵,读时间不再穿门。门还在,但最常用的那几扇,被改成了窗。

如果你在给一家企业做本地 AI,这套"门学"可以直接抄:第一,给每次调用发"门牌号",不给 ambient 权限——能力令牌,不问你是谁,只验你拿的号对不对;第二,审计点设在门上:谁、何时、穿了哪扇门,一条日志记全;第三,高频调用学学 vDSO,开窗——别让智能体为读个时间排队穿门。

觉 然 小 注

「如来说世界,即非世界,是名世界。」⁶

Ring 0、Ring 3,用户态、内核态,都是假名安立。英特尔给了四个 Ring,Linux 只用了两个;名字是人取的,门是自己开的。而最妙的是门的朝向——最森严的边界上,门朝外开。防得住的从来不是墙,是门。

引 用 与 出 处

  1. [1] Linus Torvalds. Linux 0.01 内核源码. kernel.org 历史存档, 1991. https://www.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz
  2. [2] Saltzer, J. H.; Schroeder, M. D. The Protection of Information in Computer Systems. Proceedings of the IEEE, 63(9), 1975. https://web.mit.edu/saltzer/www/publications/pubs.html
  3. [3] Packer, C. et al. MemGPT: Towards LLMs as Operating Systems. arXiv:2310.08560, 2023. https://arxiv.org/abs/2310.08560 (思想化用)
  4. [4] Escher, M. C. 《Relativity》. 石版画, 1953. https://en.wikipedia.org/wiki/Relativity_(M.C._Escher) (文字描述代替配图)
  5. [5] Michael Kerrisk. vdso(7). Linux man-pages, man7.org 在线版. https://man7.org/linux/man-pages/man7/vdso.7.html
  6. [6] 鸠摩罗什 译. 《金刚般若波罗蜜经》. 后秦弘始年间(约402年)译本. (化用"如来说世界,即非世界,是名世界"一句)

· · ·

← 返回资讯中心