BPF 映射¶
BPF “映射”为内核和用户空间之间共享数据提供不同类型的通用存储。 有几种存储类型可用,包括哈希、数组、布隆过滤器和基数树。 存在几种映射类型,以支持特定的 BPF 助手,这些助手根据映射内容执行操作。 这些映射通过 BPF 程序经由 BPF 助手访问,这些助手记录在man-pages 中的 bpf-helpers(7) 中。
BPF 映射通过 bpf
系统调用从用户空间访问,该系统调用提供创建映射、查找元素、更新元素和删除元素的命令。 有关 BPF 系统调用的更多详细信息,请参见 ebpf-syscall 以及 man-pages 中的 bpf(2)。
映射类型¶
- BPF_MAP_TYPE_ARRAY 和 BPF_MAP_TYPE_PERCPU_ARRAY
- BPF_MAP_TYPE_BLOOM_FILTER
- BPF_MAP_TYPE_CGROUP_STORAGE
- BPF_MAP_TYPE_CGRP_STORAGE
- BPF_MAP_TYPE_CPUMAP
- BPF_MAP_TYPE_DEVMAP 和 BPF_MAP_TYPE_DEVMAP_HASH
- BPF_MAP_TYPE_HASH,带有 PERCPU 和 LRU 变体
- BPF_MAP_TYPE_LPM_TRIE
- BPF_MAP_TYPE_ARRAY_OF_MAPS 和 BPF_MAP_TYPE_HASH_OF_MAPS
- BPF_MAP_TYPE_QUEUE 和 BPF_MAP_TYPE_STACK
- BPF_MAP_TYPE_SK_STORAGE
- BPF_MAP_TYPE_SOCKMAP 和 BPF_MAP_TYPE_SOCKHASH
- BPF_MAP_TYPE_XSKMAP
使用说明¶
-
int bpf(int command, union bpf_attr *attr, u32 size)¶
使用 bpf()
系统调用来执行由 command
指定的操作。 该操作采用 attr
中提供的参数。 size
参数是 attr
中 union 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-Z
、a-z
、0-9
、'_'
和 '.'
。
BPF_MAP_LOOKUP_ELEM
使用 attr->map_fd
、attr->key
、attr->value
在给定映射中查找键。 成功时返回零并将找到的元素存储到 attr->value
中,失败时返回负错误。
BPF_MAP_UPDATE_ELEM
使用 attr->map_fd
、attr->key
、attr->value
在给定映射中创建或更新键/值对。 成功时返回零,失败时返回负错误。
BPF_MAP_DELETE_ELEM
使用 attr->map_fd
、attr->key
在给定映射中按键查找并删除元素。 成功时返回零,失败时返回负错误。