eBPF 程序是事件驱动的,本身不会主动运行,而是挂载到内核预定义的 Hook 点上,当对应事件发生时才被触发执行。这些 Hook 点包括系统调用、内核函数入口与返回、内核 tracepoint、网络收包事件等。若预定义的 Hook 点不满足需求,开发者还可以通过 kprobe(内核探针)或 uprobe(用户态探针)将 eBPF 程序挂载到内核或用户程序的几乎任意位置。
用户态程序通过 bpf() 系统调用将 eBPF 字节码加载进内核,通常借助 libbpf、BCC 等工具库完成。字节码加载后并不会立即执行,而是先经过验证器检查,确认安全后再由 JIT 编译器翻译为本机指令,最后挂载到指定的 Hook 点。这一流程保证了只有合法、安全的程序才能进入内核运行。
eBPF 程序直接运行在内核态,无需将数据频繁复制到用户态,避免了昂贵的用户态—内核态上下文切换。程序执行时可通过 eBPF Map 将采集到的统计信息、事件详情回传给用户态程序,也可借助 perf-event 通道实时上报数据。由于数据处理与聚合在内核内完成,相比传统用户态采集方案能显著降低 CPU 开销。