2个版本
0.1.1-alpha.with.debug | 2024年2月19日 |
---|---|
0.1.0 | 2023年1月18日 |
在Unix API中排名第534
57KB
1.5K SLoC
一个用于与BPF内核状态交互的库。
仅基于纯Rust编写的简单、惯用的绑定,用于管理与内核系统交互所需的用户空间状态。增加了一些小助手,但不超过最小化(避免泛型和额外依赖)。
该名称是
A BPF InterFace Foundation的缩写
目标
按优先级递减的顺序。
- 比直接系统调用更安全
- 纯Rust代码,无C依赖
- 对OS交互的最小依赖
- 高效
非目标
- 不是
libbpf
的替代品 - C接口,稍后重新评估
- 异步风格的实现。应该可以用同步代码实现所有功能。但是,可以在高效的地方引入可选的并发性,使用
async
。 - BPF程序的二进制分析和操作
实现
请注意,实现不需要直接链接到任何libc
函数。相反,它定义了一个以自由C函数(sys::SysVTable
)为术语的预期接口。调用者可以用从链接器静态或动态加载的函数填充它,也可以用另一个等效的实现。不幸的是,数据类型定义在这两种情况下都必须与平台的libc
兼容,但这是避免使用LD_PRELOAD
的起点,它是一个愚蠢的全局机制,用于覆盖它们。
动机
依赖于libbpf
相当重,当只需要其中一部分时。特别是,连接网络功能不需要编写BPF。此外,库中充满了C特有的问题
-
未知或高度隐晦的线程安全性
-
快速连续打开和关闭同步资源,只是为了隐藏对调用者的资源管理复杂性。真的,每个隐藏在许多操作中的
libbpf_netlink_send_recv
都会创建、配置、轮询和关闭新的netlink套接字。 -
看起来像这样的代码
static int libbpf_netlink_send_recv(...) { /* ... */ req->nh.nlmsg_seq = time(NULL);
他们正在玩弄我们,不是吗?
依赖项
~180KB