bpf
要追述ebpf的历史,就不得不提bpf.
bpf(Berkeley Packet Filter)
从早(1992年)诞生于类Unix系统中,用于数据包分析.
它提供了数据链路层的接口,可以在数据链路层发送和接收数据.如果网卡支持混杂模式,所有的数据包都可以被接收,即使这些数据包的目的地址是其它主机.
BPF最为熟知的应用就是tcpdump
,用户可以指定过滤规则,这样就可以避免不需要的数据包被从内核拷贝到用户程序,极大地提高了性能.
这些过滤指令实际上是由内核中运行的虚拟机执行的,这个内核中的虚拟机就是BPF的实现核心.
Linux将bpf这种虚拟机的机制进行了扩展,使其不仅能应用于数据包过滤,还能应用于各种场景。
为了与之前的bpf进行区分,常见老的bpf称为cBPF(classic BPF)
, 新的bpf称为ebpf(extend BPF)
.
ebpf与bp对比
对比项 | cBPF | eBPF |
---|---|---|
寄存器数量 | 2个: A和X | 10个: R0~R9, R10是只读的帧指针寄存器 |
寄存器宽度 | 32位 | 64位 |
存储 | 16个内存 M[0-15] | 512字节栈大小,无限制的映射型存储 |
受限的内核调用 | 非常受限, JIT专用 | 可用,通过bpf_call指令 |
支持的事件类型 | 网络数据包, seccomp-BPF | 网络数据包、内核函数、用户态函数、跟踪点、用户态标记、PMC |