BPF CO-RE:面向用户的体验 现在我们将看一下BPF应用的一些典型场景,以及如何通过BPF CO-RE解决兼容性问题。下面可以看到,一些可移植性问题(如兼容结构体布局差异)可以透明地进行处理,但其他一些场景则需要更加显示地处理,如if/else条件判断(与编译时BCC程序中的#ifdef/#else构造相反)和BPF CO-RE提供的一些额外机制。
BPF CO-RE:面向用户的体验 现在我们将看一下BPF应用的一些典型场景,以及如何通过BPF CO-RE解决兼容性问题。下面可以看到,一些可移植性问题(如兼容结构体布局差异)可以透明地进行处理,但其他一些场景则需要更加显示地处理,如if/else条件判断(与编译时BCC程序中的#ifdef/#else构造相反)和BPF CO-RE提供的一些额外机制。
从中我们可以看到CO-RE实现的首要条件是clang编译器需要记录被访问结构体成员的重定位信息,其次eBPF加载器读取eBPF程序的BTF信息和CO-RE重定位信息,与主机内核的BTF信息(通常就是我们的内核BTF文件)进行比较,并在需要时对指定的指令进行修补。修补后的程序会被加载和验证,以确保其在主机内核上的正确运行。这里,我们会...
为了更彻底地解决 BPF 移植性问题,我们设计了 BPF CO-RE,并相信这是BPF 程序的未来开发方式,尤其适用于开发复杂、真实环境中的 BPF 应用。 3 BPF CO-RE:高层机制 BPF CO-RE 将它所依赖的如下软件栈和它的数据集中到了一起, 内核 用户空间 BPF 加载器库(libbpf) 编译器(clang) 使得我们能以一种轻松的方式...
BPF CO-RE 示例代码解析 环境 编译 运行 代码解析 内核空间(BPF)代码 用户空间代码 TIPs 总结 参考 环境 本地测试的话,建议采用Ubuntu,其内核本身已经开启了BTF选项,无需再对内核进行编译。我用的是Ubuntu 20.10,内核版本5.8.0。 # cat /boot//config-$(uname -r)|grep BTFCONFIG_VIDEO_SONY_BTF_MPX=mCON...
BPF CO-RE 现如今 eBPF 在很多方便都有它的身影,cilium、skywalking、bpftrace、pixie等等在各个方面上都发挥着作用,不过 eBPF 存在的缺陷是功能随着内核版本的更新而更新,老版本内核无法使用相当多基于 eBPF 的组件,另外一个问题是 eBPF 程序的移植性较不好,这一点已经从上一小节得到了验证,结构体成员的更新、重...
为了解决这一问题,eunomia-bpf 应运而生,它通过集成 CO-RE(Compile Once - Run Everywhere)技术和 WebAssembly,极大地简化了 eBPF 程序的开发流程,使得开发者能够更加专注于创新而非繁琐的配置和编译工作。本教程将带领你从 eunomia-bpf 的基础配置开始,逐步深入到高级功能的实现,通过详细的示例代码,让你掌握如何...
关于BPF CO-RE 的目标,引用文中的一段总结就是: 作为一种简单的方式,帮助 BPF 开发者解决简单的移植性问题(例如读取结构体的字段),并且 作为一种不是最优,但可用的方式,帮助 BPF 开发者 解决复杂的移植性问题(例如不兼容的数据结构改动、复杂的用户空间控制条件等)。
coolbpf 项目,以 CO-RE(Compile Once-Run Everywhere)为基础实现,保留了资源占用低、可移植性强等优点,还融合了 BCC 动态编译的特性,适合在生产环境批量部署所开发的应用。coolbpf 开创了一个新的思路,利用远程编译的思想,把用户的BPF程序推送到远端的服务器并返回给用户.o或.so,提供高级语言如 Python/Rust/Go...
简单来说 CO-RE 是使用 BTF 记录源代码的重定位信息和内核数据结构的相关信息, 由libbpf 在加载时进行重定位来解决 BPF 程序的可移植问题的.仍然以前面 task_struct结构体的 pid 成员访问为例, 在 CO-RE 的解决方案中,BPF 字节码中对 pid 的访问被记录为一个重定位点.当 libbpf 加载 BPF 字节码程序时, ...