CO-RE 是 Compile Once - Run Everywhere 的缩写,是 libbpf 为了解决编写可移植性 BPF 程序提供的一套解决方案。所谓的可移植性是指在不同的内核版本和内核配置间,无需修改 BPF 程序的源代码及运行时编译就可以运行。
另一个提出类似口号的是 Java,所谓的 Write once, run anywhere (WORA)。当然这依赖于 JVM 的支持。
同样地,要达成 CO-RE,也需要额外的依赖。需要以下这些组件相互配合:
编译器:LLVM,编译 BPF 程序生成包含重定位信息的目标代码
加载器:libbpf, 在运行时完成重定位及代码加载
内核:BTF 提供内核数据结构的信息;BPF verifier 做 dead code elimination
BPF 程序:适配不同内核版本的变更
所以,CO-RE 还是有点理想化了,因为只有 BPF 程序去适配了内核的变更,我们才可能达到只编译一次,然后在不同的内核版本间运行。
接下来将通过几篇文章演示 CO-RE 如何解决内核版本变更带来的移植性问题。敬请关注。
参考链接
https://www.kernel.org/doc/html/latest/bpf/llvm_reloc.html
https://nakryiko.com/posts/bpf-core-reference-guide/
https://lwn.net/Articles/775692/
https://www.kernel.org/doc/html/latest/bpf/btf.html