eBPF 让受限程序在内核事件点执行。用户态加载字节码,Verifier 逐条验证控制流、边界和指针安全;通过后内核可以解释执行或 JIT 编译,并通过 Map、perf buffer 或 ring buffer 与用户态交换数据。它适合观测和受限处理,但不是把任意 C 代码搬进内核。
先选 Hook 和数据模型,再写程序
要观察函数调用、网络包、调度事件还是用户态探针,会决定使用 tracepoint、kprobe、fentry/fexit、XDP 或 uprobe 等不同入口。入口一旦确定,再列出真正需要的字段和采样频率。把所有数据都塞进 Map、每个事件都打印,通常会先把性能和可读性拖垮。
Map 也不是普通全局变量。哈希、数组、per-CPU、ring buffer 等类型各有内存、锁和用户态读取语义。对长期运行的工具,要考虑对象 pinning、进程退出后的清理和内核版本差异;对诊断工具,要给丢失事件和 map 满容量留出可观测指标。
Verifier 通过不代表诊断结论正确
Verifier 只证明程序在它能分析的条件下不会进行不安全访问。它不保证你选的 Hook 正好覆盖了问题,也不保证时间戳、进程身份和采样率足以支持业务归因。发布前应在已知工作负载下核对事件数量、延迟和输出的关联关系,再把它用在真正的故障场景。
参考:eBPF 程序构成与通信