eBPF 虚拟机是运行在内核中的寄存器级虚拟机,负责执行 eBPF 字节码。它包含 11 个 64 位寄存器(R0~R10),其中 R10 为只读帧指针,并配备 512 字节的栈空间。相比早期 cBPF 仅有的 2 个 32 位寄存器,寄存器数量与宽度的提升使 eBPF 能够传递更丰富的参数、编写更复杂的逻辑。
验证器是 eBPF 安全模型的核心,负责对字节码进行静态分析,确保程序不会破坏内核。它通过深度优先搜索遍历程序所有可能的执行路径,检查程序是否会终止、是否存在越界内存访问、是否使用未初始化变量等。只有通过验证的程序才被允许加载执行。
JIT(Just-In-Time)编译器将验证通过的通用字节码翻译为目标 CPU 架构的本机指令,使 eBPF 程序的执行效率接近原生编译的内核代码。早期 eBPF 采用解释器执行字节码,如今主流内核已普遍使用 JIT 编译以获得更好的性能与安全性。
eBPF Map 是驻留在内核空间的高效键值存储结构,用于在多个 eBPF 程序之间、以及内核态与用户态之间共享数据。常见类型包括哈希表(Hash)、数组(Array)、LRU 缓存、环形缓冲区(Ring Buffer)、最长前缀匹配(LPM)等,多数类型还提供共享版本与 per-CPU 版本。
eBPF 程序不能调用任意的内核函数,只能调用内核提供的一组受控 Helper 函数(如获取当前时间、读写 Map、读取进程上下文等),以保证跨内核版本的兼容性。Hook 挂载点则决定了程序在何处被触发,涵盖系统调用、tracepoint、kprobe/uprobe 以及 XDP、TC 等网络事件点。