我是新来的eBPF,有很多教程说eBPF只是扩展的BPF,但我不明白extended
是什么意思?那么BPF和eBPF有什么区别呢?这些示例是驻留在Linux源文件[root]/samples/bpf
中的eBPF示例还是仅仅是BPF示例?
BPF有时指的是2014年创建的eBPF,有时指的是1991年创建的cBPF。正如Qeole所指出的,您可以在内核文档中找到两者的详细比较。
cBPF(经典的BPF)是一个带有两个32位寄存器的小字节码,用于对数据包和系统调用执行基本过滤。在对cBPF程序的两次调用之间不能持久化任何状态。
cBPF仍然被例如seccomp和tcpdump使用,但实际上在最近的内核中被转换为eBPF字节码。
eBPF(扩展BPF)是一种具有重要扩展的新字节码。字节码具有更"现代"的特征。形式,具有10个64位寄存器、直通跳转和堆栈空间,可以更轻松地对本机指令集进行jit编译。它可以调用特殊的函数(称为helper)来与内核交互。它可以使用这些帮助将状态保存到映射。它带有一个新的系统调用bpf(2)
,用于操作BPF对象(例如,地图,程序等)。eBPF生态系统的一个很好的介绍可以在eBPF .io上找到。
eBPF程序可以用C语言编写并使用LLVM/Clang编译成字节码。内核源代码中的示例是eBPF程序。