eBPF 验证器:内核里的迷你编译器

Linux 内核里藏着一个不太起眼却极其精巧的组件——eBPF 验证器。当你往内核加载一段 BPF 程序时,它并不会直接执行,而是先被这个验证器逐指令扫描。验证器要做的事情本质上就是编译原理里的程序分析:它模拟执行所有可能的路径,追踪每个寄存器和栈槽的类型与范围,确保程序不会越界访问内存、不会无限循环、不会使用未初始化的变量。最有趣的部分是它对循环的处理——eBPF 早期干脆禁止循环,后来才允许有限循环,验证器通过限制总指令数(上限一百万条)和跟踪状态来保证终止。它还会做死代码消除,把不可能到达的分支直接剪掉,这在某种意义上就是在做编译优化。如果你去看 kernel/bpf/verifier.c,会发现这个文件有三万多行,占了整个 eBPF 子系统代码量的大头,比虚拟机解释器本身还大得多。换句话说,内核团队把最多的工程精力不是花在"怎么运行 BPF 程序",而是花在"怎么确保 BPF 程序不会搞崩内核"上。这个取舍很说明问题:在一个特权执行环境中,安全验证的复杂度永远高过执行本身。

#CS