BPF 映射

BPF“映射”为在内核和用户空间之间共享数据提供了不同类型的通用存储。有几种存储类型可用,包括哈希、数组、布隆过滤器和基数树。存在几种映射类型是为了支持特定的 BPF 助手,这些助手根据映射内容执行操作。映射通过 BPF 助手从 BPF 程序访问,这些助手记录在 man-pages 中的 bpf-helpers(7) 中。

BPF 映射通过 bpf 系统调用从用户空间访问,该系统调用提供创建映射、查找元素、更新元素和删除元素的命令。有关 BPF 系统调用的更多详细信息,请参见 ebpf-syscallman-pages 中的 bpf(2)

映射类型

使用说明

int bpf(int command, union bpf_attr *attr, u32 size)

使用 bpf() 系统调用执行 command 指定的操作。该操作接受 attr 中提供的参数。size 参数是 attrunion bpf_attr 的大小。

BPF_MAP_CREATE

使用 attr 中所需的类型和属性创建映射

int fd;
union bpf_attr attr = {
        .map_type = BPF_MAP_TYPE_ARRAY;  /* mandatory */
        .key_size = sizeof(__u32);       /* mandatory */
        .value_size = sizeof(__u32);     /* mandatory */
        .max_entries = 256;              /* mandatory */
        .map_flags = BPF_F_MMAPABLE;
        .map_name = "example_array";
};

fd = bpf(BPF_MAP_CREATE, &attr, sizeof(attr));

成功时返回进程本地文件描述符,失败时返回负错误。可以通过调用 close(fd) 删除映射。当进程退出时,打开文件描述符持有的映射将自动删除。

注意

map_name 的有效字符为 A-Za-z0-9'_''.'

BPF_MAP_LOOKUP_ELEM

使用 attr->map_fdattr->keyattr->value 在给定映射中查找键。成功时返回零,并将找到的元素存储到 attr->value 中,失败时返回负错误。

BPF_MAP_UPDATE_ELEM

使用 attr->map_fdattr->keyattr->value 在给定映射中创建或更新键/值对。成功时返回零,失败时返回负错误。

BPF_MAP_DELETE_ELEM

使用 attr->map_fdattr->key 在给定映射中查找并删除键的元素。成功时返回零,失败时返回负错误。