gobpf不完整使用指南
编译过程
安装llvm-10,clang-10
apt-install llvm-10 clang-10
下载bpf2go
|
|
修改bpf程序的include
|
|
编译时将bpd的headers包含进来
|
|
得到大端和小端两个版本的ELF文件,之后在go程序里加载即可。cpu一般都是小端。
内核版本要求
经测试一些gobpf的一些syscall不适配较低版本的内核(例如5.8的BPF_LINK_CREATE会报参数错误),建议使用最新版本内核5.19
bpf_map
用户态程序首先加载bpf maps,再将bpf maps绑定到fd上。elf文件中的realocation table用来将代码中的bpf maps重定向至正确的fd上,用户程序在fd上发起bpf syscall
map的value尽量不要存复合数据结构,若bpf程序和用户态程序共用一个头文件,用户态程序调用bpf.Lookup时由于结构体变量unexported而反射失败
pinning object
将map挂载到/sys/fs/bpf
|
|
其他用户态程序获取pinned map的fd
|
|
packet processing
使用系统/usr/include下的包头解析lib
|
|
其中ubuntu缺失asm库,需要安装gcc-multilib
|
|
ctx存放dma区报文的指针,同时存放报文的设备号和队列号
|
|
由于ctx中的指针会发生变动,一般创建两个局部变量来存
|
|
为了缩减报文边界检查次数(例如,先检查eth头长度是否合法,再检查ip头长度是否合法,会造成多次检查,影响性能),检查器在加载bpf程序时就会根据针对data_end的if语句进行静态检查。例如某bpf函数内需要读data指针后10个地址的数据,需要进行如下的校验,否则检查器会拒绝加载 XDP 子节代码
|
|
Example
按照xdp-project/xdp-tutorial: XDP tutorial (github.com)移植的gobpf程序(还未完成):
go-base/src/ebpf/xdp-ex at main · scottlx/go-base (github.com)
参考文档
BPF 进阶笔记(一):BPF 程序(BPF Prog)类型详解:使用场景、函数签名、执行位置及程序示例 (arthurchiao.art)
tc/BPF and XDP/BPF - Hangbin Liu’s blog (liuhangbin.netlify.app)
[BPF and XDP Reference Guide — Cilium 1.12.2 documentation](https://docs.cilium.io/en/stable/bpf/#:~:text=cBPF is known,before program execution.)
- 原文作者:windseek
- 原文链接:https://scottlx.github.io/posts/gobpf/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。