跳到正文
返回

02 什么是 eBPF

本学习归档整理自 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 程序和用户态之间共享数据。

完整说明与延伸阅读

更完整的架构、校验器、辅助函数、发行版支持和项目列表,请直接阅读原文:

https://ebpf.io/zh-hans/what-is-ebpf/


分享这篇文章:

上一篇
03 bpftrace 单行教程
下一篇
01 Linux 调试程序(strace / 内核探针)