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

cbe_rbpf

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

1 个不稳定版本

0.2.38 2023 年 1 月 22 日

#973 in Unix API


2 个 crate 中使用(通过 cbe-program-runtime

Apache-2.0

595KB
12K SLoC

包含(ELF 库,6KB)tests/elfs/scratch_registers_debug.so,(ELF 库,2KB)tests/elfs/bss_section.so,(ELF 库,2KB)tests/elfs/empty_rodata.so,(ELF 库,3KB)tests/elfs/multiple_file.so,(ELF 库,2KB)tests/elfs/noop.so,(ELF 库,2KB)tests/elfs/noro.so 等 18 项

cbe_rbpf

Rust(用户空间)eBPF 虚拟机

Build Status 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]
cbe_rbpf = "0.2.38"

您还可以从本 GitHub 仓库使用开发版本。这应该在您的 Cargo.toml 中这样做。

[dependencies]
cbe_rbpf = { git = "https://github.com/Cartallum/rbpf", branch = "main" }

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

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

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

extern crate cbe_rbpf;

API

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

以下是在rbpf中运行eBPF程序的步骤

  1. 创建配置和一个内置程序加载器,添加一些函数。
  2. 创建一个可执行文件,可以是字节码或ELF。
  3. 如果您想要JIT编译的程序,请进行编译。
  4. 创建一个内存映射,由多个内存区域组成。
  5. 创建一个上下文对象,它还将作为指令计数器。
  6. 使用所有前面的步骤创建一个虚拟机。
  7. 执行您的程序:运行解释器或调用JIT编译的函数。

许可证

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

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

依赖项

约2.5-3.5MB
约68K SLoC