Функциональность БПФ га sh структуры карт - PullRequest
1 голос
/ 14 апреля 2020

Я пишу инструмент BPF, который поддерживает трассировку для каждого процесса, а это значит, что мне понадобится двухмерная структура данных. Чтобы обойти ограничение в 512 байт, я решил, что лучше всего придерживаться поддерживаемых структур (карт). Посмотрев на iovisor docs , показалось, что BPF_HASH_OF_MAPS - это структура, которая мне нужна. Я предположил, что эта структура предлагает пару ключ-значение, в которой «значение» было еще одной картой BPF. Однако, исходя из требуемых параметров, «внешняя» структура выглядит как массив (лично я из документации github не могу отличить BPF_HASH_OF_MAPS от BPF_ARRAY_OF_MAPS). Я был введен в заблуждение: структура BPF_HASH_OF_MAPS обеспечивает функциональность, подобную hashmap?

1 Ответ

2 голосов
/ 14 апреля 2020

Ты прав. b cc не делает различий между BPF_HASH_OF_MAPS и BPF_ARRAY_OF_MAPS, как минимум в том, как они выставлены . В ядре они на самом деле представляют собой две разные структуры данных, и BPF-карты ha sh могут иметь ключи разных размеров.

b cc определяет в жестком коде 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.

...