#bpf #linux #kernel #interaction #userspace #state-management #bindings

无std abpfiff

与Linux BPF(2)的交互。无libbpf-sys。

2个版本

0.1.1-alpha.with.debug2024年2月19日
0.1.0 2023年1月18日

Unix API中排名第534

EUPL-1.2

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