我正在编写一个维护每个进程跟踪的 BPF 工具,这意味着我需要某种二维数据结构。为了绕过 512 字节的限制,我决定使用支持的结构(映射)是我最好的选择。在浏览了iovisor docs之后,这似乎BPF_HASH_OF_MAPS
是我需要的结构。我假设这个结构提供了一个键值对,其中“值”是另一个 BPF 映射。但是,根据它所采用的参数,“外部”结构似乎是一个数组(个人而言,从 github 文档中,我无法区分BPF_HASH_OF_MAPS
和BPF_ARRAY_OF_MAPS
)。我是否被误导了:该BPF_HASH_OF_MAPS
结构是否提供类似 hashmap 的功能?
问问题
832 次
1 回答
2
你是对的。bcc 在and之间没有区别,至少在它们的暴露方式BPF_HASH_OF_MAPS
BPF_ARRAY_OF_MAPS
上没有区别。在内核中,它们实际上是两种不同的数据结构,并且映射的 BPF 哈希可以具有各种大小的键。
bcc 将硬编码定义为映射int
的键类型(int
下面第一个) :BPF_HASH_OF_MAPS
#define BPF_HASH_OF_MAPS(_name, _inner_map_name, _max_entries) \
BPF_TABLE("hash_of_maps$" _inner_map_name, int, int, _name, _max_entries)
要使用不同的密钥类型,您可以简单地BPF_TABLE
使用BPF_HASH_OF_MAPS
.
于 2020-04-14T18:10:27.703 回答