入门指南
本入门指南将帮助您使用Rust编程语言和Aya库来构建扩展的Berkley数据包过滤器(eBPF)程序。
Aya的受众
Rust因其安全特性和优秀的C语言互操作性而成为流行的系统编程语言。在eBPF的上下文中,安全特性的重要性较低,因为程序通常需要读取内核内存,这被认为是不安全的。然而,Rust与Aya结合提供了一种快速高效的开发体验:
- 使用Cargo进行项目脚手架、构建、测试和调试
- 生成带有编译一次、运行到处(CO-RE)支持的内核头文件的Rust绑定
- 简化用户空间和eBPF程序之间的代码共享
- 快速编译时间
- 无需在运行时依赖LLVM、BCC或libbpf
范围
本指南的目标是:
-
让开发者快速掌握eBPF Rust开发,即如何设置开发环境。
-
分享关于使用Rust进行eBPF开发的当前最佳实践
本指南适合谁
本指南适合具有一定eBPF或Rust背景的人。对于没有任何先验知识的人,我们建议您首先阅读“假设和先决条件”部分。您可以查看“其他资源”部分,以找到可能需要了解的主题资源。
假设和先决条件
-
您已熟悉Rust编程语言,并在桌面环境中编写、运行和调试过Rust应用程序。您还应该熟悉2021版的惯用法,因为本指南面向Rust 2021。
-
您熟悉eBPF的核心概念。
其他资源
如果您对上述任何内容不熟悉,或想要了解本指南中提到的某个特定主题的更多信息,以下资源可能对您有帮助。
| 主题 | 资源 | 描述 |
|---|---|---|
| Rust | Rust Book | 如果您对Rust不够熟悉,我们强烈建议阅读这本书。 |
| eBPF | Cilium BPF and XDP Reference Guide | 如果您对eBPF不够熟悉,本指南非常出色。 |
如何使用本指南
本指南通常假定您从头到尾阅读。后面的章节基于前面章节中的概念,而前面的章节可能不会深入探讨某个主题,而是在后面的章节中重新讨论该主题。
eBPF程序约束
eBPF虚拟机是一个受限的运行时环境,我们的eBPF程序将在其中运行:
- 只有512字节的堆栈(如果使用尾调用则为256字节)。
- 无法访问堆空间,数据必须写入映射。
即使是用C语言编写的应用程序也被限制在语言特性的一个子集内,而我们在Rust中也有类似的约束:
- 不可使用标准库。我们使用
core。 - 不可使用
core::fmt及其依赖的特性,例如Display和Debug。 - 由于没有堆空间,我们无法使用
alloc或collections。 - 不可
panic,因为eBPF VM不支持堆栈展开或abort指令。 - 没有
main函数。
此外,由于我们直接从内核内存读取,编写的很多代码都是unsafe的。