1

我正在编写一个维护每个进程跟踪的 BPF 工具,这意味着我需要某种二维数据结构。为了绕过 512 字节的限制,我决定使用支持的结构(映射)是我最好的选择。在浏览了iovisor docs之后,这似乎BPF_HASH_OF_MAPS是我需要的结构。我假设这个结构提供了一个键值对,其中“值”是另一个 BPF 映射。但是,根据它所采用的参数,“外部”结构似乎是一个数组(个人而言,从 github 文档中,我无法区分BPF_HASH_OF_MAPSBPF_ARRAY_OF_MAPS)。我是否被误导了:该BPF_HASH_OF_MAPS结构是否提供类似 hashmap 的功能?

4

1 回答 1

2

你是对的。bcc 在and之间没有区别,至少在它们的暴露方式BPF_HASH_OF_MAPSBPF_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 回答