1个不稳定版本
0.0.2 | 2023年2月23日 |
---|---|
0.0.1 |
|
#1041 in Unix API
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虚拟机
描述
这是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]
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程序的步骤:
- 创建一个可执行文件,无论是从字节码还是ELF文件。
- 创建一个系统调用注册表,添加一些系统调用并将其放入可执行文件中。
- 如果您想要一个即时编译的程序,请对其进行编译。
- 创建一个由多个内存区域组成的内存映射。
- 使用所有前面的步骤创建配置和一个虚拟机。您还可以在此处传递只读内存,它将在eBPF程序寄存器的索引一中映射为数据包数据。
- 如果您已注册系统调用函数,则绑定其上下文对象。
- 创建一个指令计频器。
- 执行您的程序:运行解释器或调用即时编译函数。
许可证
遵循Rust语言项目本身的努力,以简化与其他项目的集成,rbpf软件包根据MIT许可证和Apache许可证(版本2.0)的条款分发。
有关详细信息,请参阅LICENSE-APACHE和LICENSE-MIT。
依赖项
~5MB
~91K SLoC