开发一个ebpf程序

第一步:使用 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 程序的过程入手。
 

你可能感兴趣的:(EBPF,java,前端,开发语言)