Skip to content

入门指南

本入门指南将帮助您使用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及其依赖的特性,例如DisplayDebug
  • 由于没有堆空间,我们无法使用alloccollections
  • 不可panic,因为eBPF VM不支持堆栈展开或abort指令。
  • 没有main函数。

此外,由于我们直接从内核内存读取,编写的很多代码都是unsafe的。