6 个版本
0.2.19 | 2021 年 8 月 2 日 |
---|---|
0.2.18 | 2021 年 8 月 2 日 |
0.2.17 | 2021 年 7 月 31 日 |
#908 in Unix API
445KB
9K SLoC
包含 (ELF lib, 10KB) tests/elfs/multiple_file.so, (ELF lib, 10KB) tests/elfs/empty_rodata.so, (ELF lib, 10KB) tests/elfs/noop.so, (ELF lib, 2KB) tests/elfs/noro.so, (ELF lib, 10KB) tests/elfs/pass_stack_reference.so, (ELF lib, 10KB) tests/elfs/relative_call.so 和 3 个更多.
giit_rbpf
Rust (用户空间) eBPF 虚拟机
描述
这是 Quentin Monnet 的 RBPF 的分支。
此存储库包含 eBPF 程序执行的虚拟机。BPF,即 Berkeley Packet Filter,是一种类似于汇编的语言,最初是为 BSD 系统开发的,用于通过工具如 tcpdump 在内核中过滤数据包,以避免在用户空间中不必要的复制。它被移植到 Linux,在那里它演变为 eBPF(扩展 BPF),这是一个功能更丰富、速度更快的版本。虽然 BPF 程序最初是为了在内核中运行,但此存储库的虚拟机允许它在用户空间应用程序中运行;它包含解释器、x86_64 JIT 编译器以及汇编器、反汇编器和验证器。
此存储库应该在 Linux、MacOS X 和 Windows 上编译和运行,尽管 JIT 编译器目前无法在 Windows 上运行。
存储库链接
此存储库可在 crates.io 获取,因此您应该通过将以下内容添加到您的 Cargo.toml
文件中即可轻松使用
[dependencies]
giit_rbpf = "0.2.17"
您也可以使用此 GitHub 存储库中的开发版本。这应该就像在您的 Cargo.toml
中放置以下内容一样简单
[dependencies]
giit_rbpf = { git = "https://github.com/solana-labs/rbpf", branch = "main" }
当然,如果您愿意,您可以在本地克隆它,可能对其进行修改,然后通过在 Cargo.toml
中指示本地版本的路径来使用它
[dependencies]
giit_rbpf = { path = "path/to/solana_rbpf" }
然后,在您的源代码中指定您想使用存储库
extern crate giit_rbpf;
API
API 的文档在源代码中已经相当完善。您还可以通过此处访问在线文档的版本,该文档自动从 crates.io 版本生成(可能与 master 分支不更新)。示例、单元测试 和 性能基准 也应该非常有帮助。
以下是在 rbpf 中运行 eBPF 程序的步骤
- 创建一个可执行文件,可以是字节码或 ELF 格式。
- 创建一个 syscall-registry,添加一些系统调用并将它放入可执行文件中。
- 如果您想要即时编译(JIT)的程序,请进行编译。
- 创建一个内存映射,包含多个内存区域。
- 使用所有前面的步骤创建配置和一个虚拟机。您还可以在此处传递只读内存,它将被映射为 eBPF 程序寄存器索引为 1 的数据包数据。
- 如果您已注册了系统调用函数,请绑定它们的上下文对象。
- 创建一个指令计数器。
- 执行您的程序:运行解释器或调用 JIT 编译的函数。
许可证
遵循 Rust 语言项目本身的努力,以简化与其他项目的集成,rbpf crate 以 MIT 许可证和 Apache 许可证(版本 2.0)的条款进行分发。
有关详细信息,请参阅 LICENSE-APACHE 和 LICENSE-MIT。
依赖项
~4.5MB
~85K SLoC