第100期 | 送神比请神难:拆模块前先数什么?

操作系统 · · 九羲科技

一、拆之前,先数清谁在用它

1995 年,Linux 1.2 把一段"外来代码"请进内核——可加载模块。请神的仪式第 98 期讲过:重定位、对暗号、调 module_init。但请进来容易,送走难。2002 年秋,Rusty Russell 在 2.5 开发版里重写模块加载器,LKML 上吵得最凶的不是"怎么装",而是"怎么拆":卸载时的引用计数。11 月 18 日,他专门写了一份《Module Refcount & Stuff mini-FAQ》,第一句话就是 Golden Rule:"如果你要顺着函数指针调进另一个模块,必须先抱住那个模块的引用。不然,你可能在人家拆房子的时候,还在里面睡大觉。"¹

反常识的是:rmmod 干的第一件事不是"删代码",是"数人头"。每个模块头上都有个计数器,try_module_get 加一,module_put 减一。你敲下 rmmod,内核先看数:不为零,直接把你顶回来(-EBUSY)——客人没走完,门不许关。数归零了,才轮到 module_exit 跑收尾——这是模块的"收笔";收完,内核把模块从名单上划掉,内存还回去。

更麻烦的是模块和模块之间。EXPORT_SYMBOL 让一个模块把函数借给别的模块用:A 借了 B 的函数,B 想走,得先问 A 答不答应。depmod 把全系统的借还关系抽出来,写进 /lib/modules/…/modules.dep,一本总账。modprobe -r 按这本账逆序拆:先拆借东西的,再拆被借的。一环乱,满盘崩。

最妙的是一段公案。Rusty 当年嫌引用计数太烦,提过一个"懒人方案":rmmod 只调清理函数、从内核名单上除名,代码干脆留在内存里不拆了——拿浪费一点内存,换绝对安全²。Linus 一句话否决:"咱们不再动模块机制的根本了。"二十多年过去,计数器还在数。这就是内核的脾气:宁可天天数茶杯,不欠一笔糊涂账。

二、智能体的退役,也要先数清茶杯

如果 AI 的操作系统先出现,"卸载"会换一身衣服,叫"退役"和"遗忘"。一个 MCP 能力下线、一个智能体注销、一段记忆被删除——动手之前,都得先数清谁还在引用它。不然,就是内核版的 use-after-free:房子拆了,人还在里面。

2026 年 10 月 13 日,Workday 宣布收购 C1.ai(原 ConductorOne)³。新闻稿里最狠的不是收购价,是机制:"人一离职,权限立即收;智能体一退役,访问立即断。"这是企业级的 rmmod:权限跟着事件走,引用不用一个个数,事件一到自动清零。内核的引用计数是"被动地数",Workday 的事件驱动是"主动地听"。AI OS 的卸载,大概率会从"数茶杯"进化到"听门铃"。言外之物是:治理的重心,正从"记得住"转向"忘得掉"。

另一条线是代价。2026 年 10 月 27 日,Anthropic 的 Frontier Red Team 公布:内部研究模型写出了 5 条多步漏洞利用链,其中 Linux 那条直指内核网络栈的 multipath TCP(CVE-2026-98432):48 分钟泄露内核指针,5 分钟拿到 root⁴。第 98 期说过,模块和内核之间"没有隔离,只有信任"。UAF(释放后使用)正是"拆房子时里面还有人"的学名——Rusty 的 Golden Rule,防的就是这一种死法。如今 AI 能自动写出利用链,"送神"这件事的攻防两端,都在被 AI 接管。

Brooks 1987 年在《No Silver Bullet》里把软件的困难分成"本质"与"偶然"⁵。卸载的繁琐,恰好落在本质那一侧:conformity——必须迁就各色注册回调的接口,谁都得认;changeability——系统活着,就得允许变。引用计数不是笨办法,是卸载这件事内禀的代价。想一键无痛卸载?先过 Brooks 的 9/10 检验。

还有一根隐形的线,三十年后接上了。2023 年 SOSP,Kwon 等人发表 PagedAttention⁶:大模型推理服务的 KV cache 按页管理,多个请求共享同一段 prompt 的缓存块时,用引用计数决定这块内存何时释放。2002 年为内核模块发明的数数方法,在 AI 基础设施里借尸还魂——数的不是模块,是注意力。机制会转世,约束不会。

三、今晚,看一次完整的请神送神

找一台手边的 Linux 机器,三个动作,看完卸载的全套账本。

先看谁在用谁:lsmod,最后一列"Used by"就是引用计数的现场直播。挑一个后面带数字的,数字就是 try_module_get 数出来的茶杯数。

再看那本总账:grep usb-storage /lib/modules/$(uname -r)/modules.dep——找到的那一行,冒号左边是借东西的,右边是被借的,拆的时候从左往右拆。

最后看一次 dry-run:modprobe -n -r usb_storage(-n 只演不拆),看用户态会按什么顺序动手。注意:只演,别真拆正在用的驱动。

这套"数—拆—听"三段式,做 AI 工程可以直接抄:给智能体的每个外部工具配引用计数,几个 agent 在用,计数器说了算;工具退役走事件,事件一到,引用自动清零。喊、认、装、拆四步拆开,治理才有地方下钩子。这套也可以直接搬进企业的 AI 平台:工具上线走喊—认—装,退役走数—拆—听,一进一出才算闭环。

卸载的三步:数清引用、逆着拆、调收笔、除名归还——引用没归零,内核不许动手。

觉 然 小 注

「过去心不可得,现在心不可得,未来心不可得。」⁷——鸠摩罗什译《金刚经》第十八分。执着于记住一切是病,知道何者当忘才是智慧。内核不留恋任何一块活字:引用清零,收笔,除名,归还,复归平正⁸。孙过庭《书谱》里,学书的最后一步叫"复归平正"——拆,不是失去,是把位置还给字盘,让下一块活字有地方住。凡发生必有利于我:送走的每一块活字,都在给系统腾地方。

引 用 与 出 处

  1. [1] Rusty Russell. Module Refcount & Stuff mini-FAQ. LKML, 2002-11-18. https://www.cs.helsinki.fi/linux/linux-kernel/2002-46/0796.html
  2. [2] Jonathan Corbet. A different approach to module races. LWN.net, 2003. https://lwn.net/Articles/41726/
  3. [3] Workday. Workday to Acquire C1.ai, a Leading Agentic Identity Platform for People and Agents. 官方新闻稿, 2026-10-13. https://s21.q4cdn.com/950027458/files/doc_news/Workday-to-Acquire-C1-ai-a-Leading-Agentic-Identity-Platform-for-People-and-Agents-2026.pdf
  4. [4] Anthropic Frontier Red Team. Discovering and exploiting vulnerabilities in critical, real-world software with Claude. Anthropic, 2026-10-27. 细节转述见 https://www.onesignaldesk.com/news/anthropic-red-team-five-exploits (二手转引)
  5. [5] Frederick P. Brooks Jr. No Silver Bullet: Essence and Accidents of Software Engineering. IEEE Computer, 1987. https://doi.org/10.1109/MC.1987.1663532
  6. [6] Woosuk Kwon et al. Efficient Memory Management for Large Language Model Serving with PagedAttention. SOSP, 2023.
  7. [7] 《金刚般若波罗蜜经》第十八分,鸠摩罗什译本。
  8. [8] 孙过庭. 《书谱》:"初学分布,但求平正;既知平正,务追险绝;既能险绝,复归平正。"

· · ·

← 返回资讯中心