1 个不稳定版本
0.2.38 | 2023 年 1 月 22 日 |
---|
#973 in Unix API
在 2 个 crate 中使用(通过 cbe-program-runtime)
595KB
12K SLoC
包含(ELF 库,6KB)tests/elfs/scratch_registers_debug.so,(ELF 库,2KB)tests/elfs/bss_section.so,(ELF 库,2KB)tests/elfs/empty_rodata.so,(ELF 库,3KB)tests/elfs/multiple_file.so,(ELF 库,2KB)tests/elfs/noop.so,(ELF 库,2KB)tests/elfs/noro.so 等 18 项。
cbe_rbpf
Rust(用户空间)eBPF 虚拟机
描述
这是由 Quentin Monnet 开发的 RBPF 的一个分支。
此 crate 包含一个用于 eBPF 程序执行虚拟机。BPF(即 Berkeley Packet Filter),是一种类似于汇编语言,最初为 BSD 系统开发,用于通过如 tcpdump 等工具在内核中过滤数据包,以避免向用户空间的无用复制。它被移植到 Linux,在那里它演变成 eBPF(扩展 BPF),这是一个更快且功能更丰富的版本。虽然 BPF 程序最初旨在在内核中运行,但此 crate 的虚拟机允许在用户空间应用程序中运行它;它包含解释器、eBPF 程序的 x86_64 JIT 编译器,以及汇编器、反汇编器和验证器。
该 crate 应该可以在 Linux、MacOS X 和 Windows 上编译和运行,尽管 JIT 编译器目前不能在 Windows 上工作。
crate 链接
此 crate 可从 crates.io 获取,因此只需将其作为依赖项添加到您的 Cargo.toml
文件中即可。
[dependencies]
cbe_rbpf = "0.2.38"
您还可以从本 GitHub 仓库使用开发版本。这应该在您的 Cargo.toml
中这样做。
[dependencies]
cbe_rbpf = { git = "https://github.com/Cartallum/rbpf", branch = "main" }
当然,如果您愿意,可以将其本地克隆,可能修改 crate,然后指示本地版本路径在 Cargo.toml
中。
[dependencies]
cbe_rbpf = { path = "path/to/cbe_rbpf" }
然后,在您的源代码中指定您要使用此 crate
extern crate cbe_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