eBPF 全称是 extended Berkeley Packet Filter ,起源于 BPF ( Berkeley Packet Filter )。顾名思义,它向linux内核提供了对数据包的过滤。
早期的网络监控器等都是作为用户级进程运行的。为了分析只在内核空间运行的数据,它们必须将这些数据从内核空间复制到用户空间的内存中去,并进行上下文切换。这与直接在内核空间分析这些数据相比,导致了巨大的性能开销。
BPF 就是解决这一问题的一种在内核空间执行高效安全的程序的机制。
BPF 在数据包过滤上引入了两大革新:
发展到今天,BPF 升级为 eBPF 。它演进成为了一套通用执行引擎,提供可基于系统或程序事件高效安全执行特定代码的通用能力,通用能力的使用者不再局限于内核开发者。原来的 BPF 被称为 cBPF (classic BPF)已被舍弃。
下面是 eBPF 的大致原理图:
用户可以通过创建内核探针(kprobe)或用户探针(uprobe)在几乎任何地方附加eBPF程序。
在我刚开始阅读 eBPF 的相关资料时,就在想,这不就是一个数据过滤吗。但是现在想想吧,你可以在几乎内核的任何地方加入自己的代码。向内核加入用户输入,这本身就是一个大胆创新的想法,而加入自己的程序这是多么令人激动!