English
The model lives in user mode; the host is the kernel. A tool list is a syscall table, and the boundary does not care how eloquent the request was.essay · standmeet2026.10.07 · essay
2026.10.07·3 min read#agent-os

Tools Are Syscalls

The model lives in user mode; the host is the kernel. A tool list is a syscall table, and the boundary does not care how eloquent the request was.

工具即系统调用

一个运行中的程序活在用户态。它爱算什么算什么,但它碰不到世界:每一次读文件、发数据包、写字节,都要穿过一道窄的、编号的、查权限的边界——系统调用表——进入一个决定请求是否合法的内核。这套安排的优雅之处在于:程序的聪明程度与边界的纪律无关。一个绝顶聪明的程序和一个已被攻陷的程序,敲的是同一扇门,出示的是同一套凭证。

Agent 就是一台计算恰好以语言进行的的用户态程序。模型什么都可以推理,但它碰世界只能通过它的工具——而工具清单就是一张 syscall 表:一组有限的、命名的、带类型的 crossing,每一次的参数都由宿主在执行前验证。这不是从外面强加的比喻;这就是每一个值得信任的 agent 宿主的字面架构。宿主是内核。模型永远拿不到 ring 0。

内核纪律中有三条值得逐字抄过来。边界处验证:参数在 crossing 处检查,不在它被组装的地方检查——模型自信地发出的畸形请求,只是一个畸形请求。最小权限是表的属性:进程调不了不在它表里的调用,agent 也调不了不在它工具清单里的工具;能力靠枚举授予,不靠说服授予。当访客的角色收窄了 agent 可读的范围,那是保护环在做它日常的工作——访问码解析为角色,角色解析为能力集,边界执行时不关心请求写得多么雄辩。还有可审计性:内核记录 syscall,是因为 crossing 是一切要紧之事必须经过的唯一地点。记录工具调用的 agent 宿主有同样的性质——一份完整的记录,记的全是系统接触现实的那些时刻。

反面同样有教益。那些把边界抹糊的框架——让生成的代码直接执行、把工具结果和模型文本当成一股不分彼此的流——就是操作系统当年有理由抛弃的那种单体式、人人都在 ring 0 的设计。提示注入用用户态的话说叫 confused deputy(被搞糊涂的代理人)问题,而它有这个问题的经典解法:代理人检查的是请求的凭证,不是请求者的自信。

让模型保持聪明,让边界保持无聊。这份分工——智力在用户态,纪律在内核——已经六十岁了,而且从未被"让程序自己给自己把门"改进过哪怕一次。