我正在编写一个BPF工具来维护每个进程的跟踪,这意味着我将需要某种2D数据结构。为了绕过512字节的限制,我决定最好使用受支持的结构(映射)。看了一下iovisor docs之后,似乎BPF_HASH_OF_MAPS
是我需要的结构。我以为这种结构提供了键-值配对,其中“值”是另一个BPF映射。但是,基于所需的参数,“外部”结构似乎是一个数组(就github文档而言,我个人看不出BPF_HASH_OF_MAPS
和BPF_ARRAY_OF_MAPS
之间的区别)。我是否被误导了:BPF_HASH_OF_MAPS
结构是否提供类似哈希图的功能?
您是正确的。 bcc在BPF_HASH_OF_MAPS
和BPF_ARRAY_OF_MAPS
之间没有任何区别,至少在它们的显示方式方面。在内核中,它们实际上是两个不同的数据结构,并且地图的BPF哈希可以具有各种大小的键。
[bcc defines硬编码的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
。