eBPF概述
起源
1992年论文,其提出了一个由内核直接过滤网络包,减少用户态的无效克隆
伪机器码、BPF指令集、JIT
伪机器码
不能在物理机上直接运行,需要在虚拟机上执行
BPF指令集
是伪机器码,在初期由于BPF功能较少,只用在网络数据包过滤,因此早期的BPF指令集只需要几个库(如tcpdump的实现基于libcap库)就可以将一般的表达式生成BPF指令集;
但随着BPF的发展,指令集的复杂、支持的BPF程序类型增多,就需要编译器了
JIT
just in time
的缩写,用于将BPF指令直接编译成机器码,大大提高了执行效率
eBPF介绍
eBPF是extend BPF的简称,也就是扩展的BPF。因此早期的BPF称为cBPF
二者对比
eBPF类型和Map机制
Map机制中,内核和用户共享一块内存,一般由内核存,用户取
所用语言
cBPF是直接写指令,后发展为C语言,通过clang/llvm进行编译为字节码,注入还是要手动
因此出现了python的bcc库和更新的libbpf,其完成了编译、解析ELF、加载BPF代码以及创建map
,用户只需要设计bpf代码
工作原理如下:
发表评论