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

gemachain_rbpf

为eBPF程序提供的虚拟机和JIT编译器

1个不稳定版本

0.2.14 2021年10月28日

#1004 in Unix API

Download history 27/week @ 2024-03-11 30/week @ 2024-03-18 50/week @ 2024-03-25 66/week @ 2024-04-01 20/week @ 2024-04-08 28/week @ 2024-04-15 33/week @ 2024-04-22 24/week @ 2024-04-29 34/week @ 2024-05-06 30/week @ 2024-05-13 31/week @ 2024-05-20 20/week @ 2024-05-27 27/week @ 2024-06-03 22/week @ 2024-06-10 15/week @ 2024-06-17 34/week @ 2024-06-24

99 每月下载量
13 个crate中使用(通过gemachain-bpf-loader-prog…

Apache-2.0

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

Build Status Crates.io

描述

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

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

许可证

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

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

rbpf

依赖关系

~4.5MB
~84K SLoC