目录
将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);

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

被折叠的 条评论
为什么被折叠?



