eBPF概述

2023-05-26 发布 0条评论

起源

1992年论文,其提出了一个由内核直接过滤网络包,减少用户态的无效克隆

20230411225136

伪机器码、BPF指令集、JIT

伪机器码

不能在物理机上直接运行,需要在虚拟机上执行

BPF指令集

是伪机器码,在初期由于BPF功能较少,只用在网络数据包过滤,因此早期的BPF指令集只需要几个库(如tcpdump的实现基于libcap库)就可以将一般的表达式生成BPF指令集;

但随着BPF的发展,指令集的复杂、支持的BPF程序类型增多,就需要编译器了

JIT

just in time的缩写,用于将BPF指令直接编译成机器码,大大提高了执行效率

eBPF介绍

eBPF是extend BPF的简称,也就是扩展的BPF。因此早期的BPF称为cBPF

20230411230949

二者对比

20230411231029

eBPF类型和Map机制

20230411231128

Map机制中,内核和用户共享一块内存,一般由内核存,用户取

20230411231202

所用语言

cBPF是直接写指令,后发展为C语言,通过clang/llvm进行编译为字节码,注入还是要手动

因此出现了python的bcc库和更新的libbpf,其完成了编译、解析ELF、加载BPF代码以及创建map,用户只需要设计bpf代码

工作原理如下:

20230411231437

BPF作用

20230411231607

libbpf支持的hook点(节选)

20230426180222

20230426181704

发表评论