第51期 | 门上的小窗

操作系统 · · 九羲科技

一、门上的小窗

/proc/PID/syscall,把"正在干什么"摆出来

2008 年,Linux 2.6.27,在 /proc 里开了一扇小窗:/proc/PID/syscall¹。

窗里有什么?一行数字:系统调用号,六个参数寄存器的值,再加栈指针和程序计数器。进程正卡在某个调用里,窗里就是它的"现在进行时";进程没进门(比如卡在缺页异常里),号的位置写 -1,只给 SP 和 PC;进程压根没停下,窗里只有一个词:running。

实现它的是内核里的一个小函数:task_current_syscall²,住在 lib/syscall.c。"Discover what a blocked task is doing"——发现一个被拦住的任务在干什么。内核自己查"卡住的任务"就靠它;/proc 只是把这个内部函数,摆到了用户面前。

看窗要资格。内核编译时得开 CONFIG_HAVE_ARCH_TRACEHOOK;读别人的窗,要过 PTRACE_MODE_ATTACH_FSCREDS 的许可检查¹——和第 50 期的 ptrace 是同一把锁。自己看自己,随便看;看别人,得有看的权力。

照见一层平时看不见的。硬约束:看别人要许可——观察即权力,权力要许可。谁受益谁买单:写巡检、做审计的人受益,被看的进程买单(状态被摆出来)。被大家默认的前提是错的:"进程在干什么是它的隐私"。只对了一半:门号和参数本来就在内核手里,/proc 只是把本来就存在的东西摆了出来。

美学时刻:博物馆的展柜——能看,不能碰。小窗是只读的,你看得见门后那只手在干什么,但伸不进去。

二、状态可见,应该是出厂设置

如果操作系统的第一批用户是智能体,/proc/PID/syscall 这种"小窗"不会是一个 2008 年才补上的补丁,而是出厂设置。agent 的"当前意图"——在调哪个工具、等哪份数据、卡在哪一步——是第一等的可观测项。strace 那种拦路盘查(第 50 期)不需要了:意图流出生时就是结构化的,不需要翻译。

但诚实的一面:许可检查不能丢。企业私有化场景里,agent 的每一步都该可审计(第 50 期说的证据链),可跨主体去看,要有授权。可见性默认开,跨界要许可——这正是 PTRACE_MODE_ATTACH 那把锁在 AI 时代的样子。

这是第 58 章"Agent 时代的 /proc"的预演:给智能体看的系统状态。今天的小窗看的是"门";那一章的窗,看的是整个世界。

三、今晚,透过小窗看一眼:两个命令

实验一,看自己。任何一台 Linux 机器:

cat /proc/self/syscall

本机实测,输出像这样:"0 0x3 0x… 0x20000 …"——0 号是 read³,正在读。号、六个参数、SP、PC,全摆在那儿。自己看自己,不要许可。

实验二,看别人。起一个 sleep 挂在后台,再去看它的窗:

sleep 100 &

cat /proc/$!/syscall

在 x86-64 的普通机器上,你会看到 35 开头——35 号是 nanosleep³,sleep 正睡在里面。六个参数里还躺着它要睡多久。

但本机实测,这一招被挡了回来:Operation not permitted。man 手册写了,读别人的窗要过 ptrace 许可检查¹——这台机器的安全策略不放行。连看一眼都要许可:观察即权力,权力要许可。实验失败本身,就是这一期的结论。

落点。写巡检脚本查"卡住的进程在干什么",先读 /proc/PID/syscall,别急着 strace -p 贴上去——前者只读不拦,被看的进程不减速(第 50 期说的"观察要交税",在这里免税了)。做 agent 平台同理:审计轨迹应该是只读的窗,不是拦路的卡。

觉 然 小 注

过去心不可得,现在心不可得,未来心不可得——化用《金刚经》第十八分"一体同观分"的思想⁴。小窗里看到的号,是"现在心"的一瞥;而心,本不可得。

引 用 与 出 处

  1. [1] proc_pid_syscall(5). Linux man-pages 项目("/proc/pid/syscall (since Linux 2.6.27)";号+六个参数寄存器+SP+PC;"running"/-1 语义;CONFIG_HAVE_ARCH_TRACEHOOK;PTRACE_MODE_ATTACH_FSCREDS 许可检查). https://manpages.ubuntu.com/manpages/noble/man5/proc_pid_syscall.5.html
  2. [2] task_current_syscall. lib/syscall.c, Linux 内核源码("Discover what a blocked task is doing";-EAGAIN/-EINVAL 语义). https://git.rockylinux.org/staging/src-code/el9-upstream-kernel/-/blob/d300d59ca179fd1de427cde2a96eb2871347491f/lib/syscall.c
  3. [3] x86-64 系统调用号(read=0、nanosleep=35;本地内核头文件 /usr/include/x86_64-linux-gnu/asm/unistd_64.h 一手核对). (无网址,随内核头文件发布)
  4. [4] 鸠摩罗什 译. 《金刚般若波罗蜜经》第十八分"一体同观分". 后秦弘始年间(约402年)译本. ("过去心不可得,现在心不可得,未来心不可得"一句,思想化用)

· · ·

← 返回资讯中心