#ebpf #jit #interpreter #virtual-machine #filtering

uwcl_rbpf

用于eBPF程序的虚拟机和JIT编译器

1个不稳定版本

0.0.2 2023年2月23日
0.0.1 2023年2月23日

#1041 in Unix API

Apache-2.0

465KB
9K SLoC

包含(ELF库,10KB)tests/elfs/multiple_file.so,(ELF库,3KB)tests/elfs/bss_section.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 以及更多

uwcl_rbpf

Rust(用户空间)的eBPF虚拟机

Crates.io

描述

这是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可以从crates.io获取,因此只需将其添加到您的Cargo.toml文件中的依赖项即可使用。

[dependencies]
uwcl_rbpf = "0.0.1"

您还可以从本GitHub仓库使用开发版本。这应该像在您的Cargo.toml中放入以下内容一样简单:

[dependencies]
uwcl_rbpf = { git = "https://github.com/trancesnail/uwcl_rbpf", branch = "master" }

当然,如果您愿意,可以将其本地克隆,可能修改crate,然后指示本地版本在Cargo.toml中的路径。

[dependencies]
uwcl_rbpf = { path = "path/to/uwcl_rbpf" }

然后,在您的源代码中指定您想要使用该crate

extern crate uwcl_rbpf;

API

API在源代码中得到了很好的文档记录。您还应该能够从这里访问在线文档的版本,该版本自动从crates.io版本生成(可能与master分支不一致)。示例单元测试性能基准也应该很有帮助。

以下是使用rbpf运行eBPF程序的步骤:

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

许可证

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

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

依赖项

~5MB
~91K SLoC