mirror of
https://github.com/eunomia-bpf/bpf-developer-tutorial.git
synced 2026-03-20 11:56:22 +08:00
docs: Update README files to include information on extending GPU driver behavior with eBPF and the gpu_ext project
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
|
||||
这就是 **BPF struct_ops** 的强大之处。这个先进的 eBPF 功能允许 BPF 程序实现内核操作结构的回调函数,实际上是让你能够“插入”BPF 代码来充当一个内核子系统。这已经超越了简单的跟踪或过滤;这是关于在 BPF 中实现核心的内核逻辑。例如,我们还使用它在 GPU 驱动中通过 eBPF 实现 GPU 调度和内存卸载扩展(请参阅 [LPC 2024 演讲](https://lpc.events/event/19/contributions/2168/) 和 [gpu_ext 项目](https://github.com/eunomia-bpf/gpu_ext))。
|
||||
|
||||
在本教程中,我们将探讨如何使用 `struct_ops` 来动态地实现一个内核子系统的功能。我们不会使用常见的 TCP 拥塞控制示例。相反,我们将采用一种更基础的方法,这种方法反映了与 kfuncs 相似的可扩展性。我们将创建一个自定义的内核模块,该模块定义了一组新的、简单的操作。这个模块将充当一个占位符,为我们的 BPF 程序创建新的附加点。然后,我们将编写一个 BPF 程序来实现这些操作的逻辑。这演示了一种强大的模式:使用一个最小化的内核模块来暴露一个 `struct_ops` 接口,然后使用 BPF 来提供完整、复杂的实现。
|
||||
在本教程中,我们将探讨如何使用 `struct_ops` 来动态地扩展内核子系统的行为。我们不会使用常见的 TCP 拥塞控制示例。相反,我们将采用一种更基础的方法,这种方法反映了与 kfuncs 相似的可扩展性。我们将创建一个自定义的内核模块,该模块定义了一组新的、简单的操作。这个模块将充当一个占位符,为我们的 BPF 程序创建新的附加点。然后,我们将编写一个 BPF 程序来实现这些操作的逻辑。这演示了一种强大的模式:使用一个最小化的内核模块来暴露一个 `struct_ops` 接口,然后使用 BPF 来提供完整、复杂的实现。
|
||||
|
||||
> 本教程的完整源代码可以在这里找到:<https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/features/struct_ops>
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
### 挑战:安全、动态地扩展内核行为
|
||||
|
||||
传统上,向 Linux 内核添加新功能,例如新的文件系统、网络协议或调度器算法,都需要编写内核模块。虽然功能强大,但内核模块也带来了重大的挑战:
|
||||
|
||||
- **复杂性:** 内核开发具有陡峭的学习曲线,需要对内核内部有深入的了解。
|
||||
- **安全性:** 内核模块中的一个错误很容易导致整个系统崩溃。没有沙箱保障。
|
||||
- **维护性:** 内核模块必须针对不同的内核版本进行维护和重新编译,这与内核的内部 API 产生了紧密的耦合。
|
||||
@@ -28,6 +29,7 @@ BPF `struct_ops` 填补了这一空白。它允许 BPF 程序实现 `struct_ops`
|
||||
这种方法的精神与 **kfuncs** 允许开发者扩展 BPF 功能的方式相似。通过 kfuncs,我们可以在内核模块中定义它们,从而向 BPF 运行时添加自定义的辅助函数。通过 `struct_ops`,我们更进一步:我们为 BPF 程序定义了一整套全新的*附加点*,有效地在内核中创建了一个自定义的、可通过 BPF 编程的子系统。
|
||||
|
||||
其好处是巨大的:
|
||||
|
||||
- **动态实现**:你可以在不重启内核或应用程序的情况下,动态加载、更新和卸载实现子系统逻辑的 BPF 程序。
|
||||
- **安全性**:BPF 验证器确保 BPF 程序的运行是安全的,防止了诸如无限循环、越界内存访问和系统崩溃等常见陷阱。
|
||||
- **灵活性**:逻辑位于 BPF 程序中,可以独立于定义 `struct_ops` 接口的内核模块进行开发和更新。
|
||||
|
||||
Reference in New Issue
Block a user