6 个版本

0.2.19 2021 年 8 月 2 日
0.2.18 2021 年 8 月 2 日
0.2.17 2021 年 7 月 31 日

#908 in Unix API

Apache-2.0

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 虚拟机

[Build Status Crates.io

描述

这是 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 程序的步骤

  1. 创建一个可执行文件,可以是字节码或 ELF 格式。
  2. 创建一个 syscall-registry,添加一些系统调用并将它放入可执行文件中。
  3. 如果您想要即时编译(JIT)的程序,请进行编译。
  4. 创建一个内存映射,包含多个内存区域。
  5. 使用所有前面的步骤创建配置和一个虚拟机。您还可以在此处传递只读内存,它将被映射为 eBPF 程序寄存器索引为 1 的数据包数据。
  6. 如果您已注册了系统调用函数,请绑定它们的上下文对象。
  7. 创建一个指令计数器。
  8. 执行您的程序:运行解释器或调用 JIT 编译的函数。

许可证

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

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

依赖项

~4.5MB
~85K SLoC