libbpf 开发指南:将bpf结构固定到文件系统以便于进程共享

本文详细介绍了如何使用bpf_object__pin_maps和bpf_object__unpin_maps函数将BPF映射固定和解除固定在文件系统路径,以及BPF程序的固定方法。通过固定,可以实现进程间共享和持久化BPF资源,同时提供了示例代码和Makefile/CMakeLists.txt配置。

目录

将BPF 映射(maps)固定到指定的文件系统路径

函数原型与作用

代码demo

makefile

cmake

将BPF 程序固定到指定的文件系统路径

函数原型与解释

代码demo

makefile

cmake

将object固定到文件系统

函数原型与解析

代码demo

makefile

cmake


将BPF 映射(maps)固定到指定的文件系统路径

函数原型与作用

/*
    bpf_object__pin_maps() pins each map contained within the BPF object at the passed directory.

    If path is NULL bpf_map__pin (which is being used on each map) will use the pin_path attribute of each map. In this case, maps that don’t have a pin_path set will be ignored.

    Parameters:

            obj – Pointer to a valid BPF object

            path – A directory where maps should be pinned.

    Returns:

        0, on success; negative error code, otherwise


*/
LIBBPF_API int bpf_object__pin_maps (struct bpf_object *obj, const char *path)

bpf_object__pin_maps 函数的作用是将 BPF 对象中的所有 BPF 映射(maps)固定到指定的文件系统路径。固定(pinning)是一种将 BPF 映射的生命周期与创建它的进程解耦的方法。通过将映射固定到文件系统上的某个路径,其他进程可以在稍后访问和使用这些映射,即使创建它的原始进程已经退出。通常,BPF 映射会在创建它们的进程退出时自动关闭,但是固定映射允许它们在进程之间共享和持久化。

pf_object__unpin_maps 函数的作用是将 BPF 对象中的所有 BPF 映射(maps)从指定的文件系统路径解除固定。在之前使用 bpf_object__pin_maps 将映射固定到文件系统的路径后,你可以使用 bpf_object__unpin_maps 将它们解除固定。解除固定后,映射将不再在文件系统上可用。

代码demo

#include <stdio.h>
#include <stdlib.h>
#include <sys/resource.h>
#include <bpf/libbpf.h>

int main() {
    struct bpf_object *obj;
    const char *filename = "example.bpf.o";
    const char *pin_path = "/sys/fs/bpf/example_maps";
    int err;

    // 设置 RLIMIT_MEMLOCK 为无限制
    struct rlimit rlim = {RLIM_INFINITY, RLIM_INFINITY};
    if (setrlimit(RLIMIT_MEMLOCK, &rlim)) {
        perror("Failed to set RLIMIT_MEMLOCK");
        return 1;
    }

    // 使用 bpf_object__open_file 打开 BPF 对象文件
    obj = bpf_object__open_file(filename, NULL);
    if (libbpf_get_error(obj)) {
        fprintf(stderr, "Error loading BPF object from file: %s\n", filename);
        return 1;
    }

    // 使用 bpf_object__load 加载 BPF 对象到内核中
    err = bpf_object__load(obj);
    if (err) {
        fprintf(stderr, "Error loading BPF object: %d\n", err);
        bpf_object__close(obj);
        return 1;
    }

    printf("BPF object loaded successfully\n");

    // 使用 bpf_object__pin_maps 将 BPF 对象中的所有地图固定到指定路径
    err = bpf_object__pin_maps(obj, pin_path);
    if (err) {
        fprintf(stderr, "Error pinning BPF maps: %d\n", err);
        bpf_object__close(obj);
        return 1;
    }

    printf("BPF maps pinned at %s\n", pin_path);

    // 在此处,你可以执行其他操作,例如与固定的地图进行交互
    // 然后,在完成操作后,使用 bpf_object__unpin_maps 解除固定:
    err = bpf_object__unpin_maps(obj, pin_path);
    if (err) {
        fprintf(stderr, "Error unpinning BPF maps: %d\n", err);
        bpf_object__close(obj);
        return 1;
    }

    printf("BPF maps unpinned from %s\n", pin_path);

    bpf_object__close(obj);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ym影子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值