ebpf基础篇(二) ----- ebpf前世今生

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

你可能感兴趣的:(性能分析优化,ebpf,XDP)