第一步:使用 C 开发一个 eBPF 程序新建一个 hello.c 文件,并输入下面的内容:
//ebpf程序
int hello_world(void *ctx)
{
bpf_trace_printk("Hello, World!");
return 0;
}
第二步:使用 Python 和 BCC 库开发一个用户态程序
#!/usr/bin/env python3
# 1) import bcc library
from bcc import BPF
# 2) load BPF program
b = BPF(src_file="hello.c")
# 3) attach kprobe
b.attach_kprobe(event="do_sys_openat2", fn_name="hello_world")
# 4) read and print /sys/kernel/debug/tracing/trace_pipe
b.trace_print()
让我们来看看每一处的具体含义:第 1) 处导入了 BCC 库的 BPF 模块,以便接下来调用;
第 2) 处调用 BPF() 加载第一步开发的 BPF 源代码;
第 3) 处将 BPF 程序挂载到内核探针(简称 kprobe),其中 do_sys_openat2() 是系统调用 openat() 在内核中的实现;
第 4) 处则是读取内核调试文件 /sys/kernel/debug/tracing/trace_pipe 的内容,并打印到标准输出中
第三步:执行 eBPF 程序
第三步:执行 eBPF 程序
开发一个 eBPF 程序需要经过开发 C 语言 eBPF 程序、编译为 BPF 字节码、加载 BPF 字节码到内核、
内核验证并运行 BPF 字节码,以及用户程序读取 BPF 映射五个步骤。
使用 BCC 的好处是,它把这几个步骤通过内置框架抽象了起来,并提供了简单易用的 Python 接口,
这可以帮你大大简化 eBPF 程序的开发。
BCC 负责了 eBPF 程序的编译和加载过程。因而,要了解 BPF 指令的加载过程,就可以从 BCC 执行 eBPF 程序的过程入手。