本学习归档整理自 eBPF.io 中文:什么是 eBPF。
eBPF 是一项革命性的技术,起源于 Linux 内核,它可以在特权上下文中(如操作系统内核)运行沙盒程序。它用于安全有效地扩展内核的功能,而无需通过更改内核源代码或加载内核模块的方式来实现。
从历史上看,由于内核具有监督和控制整个系统的特权,操作系统一直是实现可观测性、安全性和网络功能的理想场所。同时,由于操作系统内核的核心地位和对稳定性和安全性的高要求,操作系统内核很难快速迭代发展。eBPF 通过允许在操作系统中运行沙盒程序,让应用可以在运行时向操作系统添加额外功能。JIT 编译器和验证引擎保证安全性和执行效率。
eBPF 和 BPF 分别代表什么
BPF 最初代表伯克利包过滤器 (Berkeley Packet Filter),但现在 eBPF 可以做的不仅仅是包过滤。eBPF 现在被认为是一个独立的术语。在 Linux 源代码中,术语 BPF 持续存在;工具和文档中 BPF 和 eBPF 通常可以互换使用。最初的 BPF 有时被称为 cBPF。
钩子概览
eBPF 程序是事件驱动的,当内核或应用程序通过某个钩子点时运行。预定义的钩子包括系统调用、函数入口/退出、内核跟踪点、网络事件等。如果预定义钩子不够,可以使用 kprobe 或 uprobe,在内核或用户程序的几乎任何位置附加 eBPF 程序。
如何编写 eBPF 程序
很多情况下并不直接写 eBPF,而是通过 Cilium、bcc、bpftrace 等项目提供的抽象。若没有更高层抽象,则用 LLVM 把 C 代码编译成 eBPF 字节码,再通过 bpf 系统调用加载。加载时内核验证器会检查程序安全性,通过后 JIT 为本地指令,再附加到请求的钩子。
地图(Map)
eBPF 程序可以使用 Map 在不同事件之间保存状态,也可以在内核 eBPF 程序和用户态之间共享数据。
完整说明与延伸阅读
更完整的架构、校验器、辅助函数、发行版支持和项目列表,请直接阅读原文: