映射结构的 BPF 散列的功能

Functionality of the BPF hash of maps structure

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

你是对的。 bcc 在 BPF_HASH_OF_MAPSBPF_ARRAY_OF_MAPS 之间没有区别,至少在它们的公开方式上没有区别 。在内核中,它们实际上是两种不同的数据结构,映射的 BPF 哈希可以具有各种大小的键。

bcc defines 硬编码 int 作为 BPF_HASH_OF_MAPS 映射的键类型(下面第一个 int):

#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