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