我对eBPF很陌生,有很多教程说eBPF只是扩展的BPF,但我不明白这里的“扩展”是什么意思?那么BPF和eBPF有什么区别呢?Linux源文件中的示例[root]/samples/bpf
是eBPF的例子还是BPF的例子?
我对eBPF很陌生,有很多教程说eBPF只是扩展的BPF,但我不明白这里的“扩展”是什么意思?那么BPF和eBPF有什么区别呢?Linux源文件中的示例[root]/samples/bpf
是eBPF的例子还是BPF的例子?
BPF有时用于指代eBPF(创建于2014年),有时也用于指代cBPF(其前身1991年)。正如Qeole所指出的,你可以在内核文档中找到两者的详细比较。
cBPF(经典 BPF)是一种小型字节码,具有两个 32 位寄存器,用于对数据包和系统调用执行基本过滤。在两次调用 cBPF 程序之间无法保持任何状态。
cBPF 仍然被例如 seccomp 和 tcpdump 使用,但实际上在最近的内核中被转换为 eBPF 字节码。
eBPF(扩展 BPF)是一种具有显著扩展的新字节码。该字节码具有更为“现代”的形式,拥有 10 个 64 位寄存器、跳转指令和堆栈空间,易于即时编译成本机指令集。它可以调用称为 helpers 的特殊函数与内核进行交互。它可以使用这些 helpers 将状态保存到 maps 中。它附带一个新的系统调用 bpf(2)
,用于操作 BPF 对象(例如 maps、programs 等)。eBPF 生态系统的良好介绍可在 ebpf.io 上找到。
eBPF 程序可以使用 LLVM/Clang 编写 C 代码并编译成字节码。内核源代码中的示例 是 eBPF 程序。