1 个不稳定版本

0.6.0 2023 年 11 月 9 日

#1026 in Unix APIs

Apache-2.0

620KB
13K SLoC

包含 (ELF lib, 6KB) tests/elfs/scratch_registers_debug.so, (ELF lib, 2KB) tests/elfs/bss_section.so, (ELF lib, 2KB) tests/elfs/empty_rodata.so, (ELF lib, 3KB) tests/elfs/multiple_file.so, (ELF lib, 2KB) tests/elfs/noop.so, (ELF lib, 2KB) tests/elfs/noro.so 及更多

cartes_rbpf

Rust(用户空间)的 eBPF 虚拟机

Build Status Crates.io

描述

这是 Quentin Monnet 的 RBPF 的分支。

这个包包含一个用于执行 eBPF 程序的虚拟机。BPF,即 Berkeley Packet Filter,是一种类似于汇编语言,最初为 BSD 系统开发,用于内核中通过工具如 tcpdump 过滤数据包,以避免将无用数据复制到用户空间。它已被移植到 Linux,并演变成 eBPF(扩展 BPF),这是一个功能更强大、速度更快的版本。虽然 BPF 程序最初是设计在内核中运行的,但这个包的虚拟机允许在用户空间应用程序中运行它;它包含一个解释器、eBPF 程序的 x86_64 JIT 编译器,以及汇编器、反汇编器和验证器。

该包应该在 Linux、MacOS X 和 Windows 上编译和运行,尽管 JIT 编译器目前不支持 Windows。

该包可在 crates.io 获取,因此只需在您的 Cargo.toml 文件中将它作为依赖项添加即可正常工作。

[dependencies]
cartes_rbpf = "0.6.0"

您也可以从这个 GitHub 仓库中使用开发版本。这应该就像在您的 Cargo.toml 中放置以下内容一样简单:

[dependencies]
cartes_rbpf = { git = "https://github.com/cartallum/rbpf", branch = "main" }

当然,如果您愿意,您也可以本地克隆它,可能修改包,然后在 Cargo.toml 中指定您的本地版本路径。

[dependencies]
cartes_rbpf = { path = "path/to/cartes_rbpf" }

然后在您的源代码中指明您想使用这个包

extern crate cartes_rbpf;

API

API 的文档在源代码中得到了很好的记录。您也应该能够从这里访问文档的在线版本,这些文档是由crates.io版本自动生成的(可能与master分支不同步)。示例单元测试性能基准测试也应该非常有帮助。

以下是在 rbpf 中运行 eBPF 程序的步骤

  1. 创建配置和一个内置的加载程序,添加一些函数。
  2. 创建一个可执行文件,无论是从字节码还是从 ELF。
  3. 如果您想要一个 JIT 编译的程序,请编译它。
  4. 创建一个内存映射,由多个内存区域组成。
  5. 创建一个上下文对象,它还将作为指令计数器。
  6. 使用所有前面的步骤创建一个虚拟机。
  7. 执行您的程序:运行解释器或调用 JIT 编译的函数。

许可证

遵循 Rust 语言项目自身的努力,以简化与其他项目的集成,rbpf 库在 MIT 许可证和 Apache 许可证(版本 2.0)的条款下分发。

有关详细信息,请参阅LICENSE-APACHELICENSE-MIT

依赖项

~2.5–3.5MB
~68K SLoC