1 个不稳定版本
0.6.0 | 2023 年 11 月 9 日 |
---|
#1026 in Unix APIs
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 虚拟机
描述
这是 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 程序的步骤
- 创建配置和一个内置的加载程序,添加一些函数。
- 创建一个可执行文件,无论是从字节码还是从 ELF。
- 如果您想要一个 JIT 编译的程序,请编译它。
- 创建一个内存映射,由多个内存区域组成。
- 创建一个上下文对象,它还将作为指令计数器。
- 使用所有前面的步骤创建一个虚拟机。
- 执行您的程序:运行解释器或调用 JIT 编译的函数。
许可证
遵循 Rust 语言项目自身的努力,以简化与其他项目的集成,rbpf 库在 MIT 许可证和 Apache 许可证(版本 2.0)的条款下分发。
有关详细信息,请参阅LICENSE-APACHE和LICENSE-MIT。
依赖项
~2.5–3.5MB
~68K SLoC