优点知识eBPF开发实践 全
编写和编译代码
eBPF代码通常是用“限制性C”编写的,然后编译成eBPF字节码。Clang是事实上的编译标准。
在编写代码时,可以引用bpf_helper函数来执行各种常见操作,如内存复制、检索PID和时间戳属性以及与其他应用程序通信(需定义eBPF数据结构,eBPF maps)。因此,你通常不必从头开始编写大量自定义代码。定制代码仅限于你想要实现的特定功能。
检验与加载
要部署已编译的eBPF程序,首先调用bpf()系统调用,它将字节码传递给内核检验器。内核检验器的工作是确保程序不会对内核造成问题。如果验证成功,内核JIT编译器将把它转换为可执行的机器代码。
运行时(runtime)
加载并验证后,程序就可以执行了。它将监视你附加到的任何代码流—无论是在内核空间、用户空间还是两者都有。一旦它运行,你就可以使用eBPF映射或预定义的文件描述符访问程序输入或输出。
下面摘自Cilium的Golang eBPF框架的部分代码片段应该有助于说明这个过程(上面是eBPF代码,下面是加载eBPF程序并与之通信的用户空间应用程序)。在编译和运行应用程序时,它将计算系统上正在执行的新程序的数量。很整洁!