Я пишу инструмент BPF, который поддерживает трассировку для каждого процесса, а это значит, что мне понадобится какая-то двумерная структура данных. Чтобы обойти ограничение в 512 байт, я решил, что лучше всего использовать поддерживаемые структуры (карты). Взглянув на документацию iovisor, казалось, что BPF_HASH_OF_MAPS
была той структурой, которая мне была нужна. Я предположил, что эта структура предлагает пару ключ-значение, где «значение» было другой картой BPF. Однако, исходя из принимаемых параметров, «внешняя» структура кажется массивом (лично, из документации github, я не могу отличить BPF_HASH_OF_MAPS
от BPF_ARRAY_OF_MAPS
). Меня ввели в заблуждение: обеспечивает ли структура BPF_HASH_OF_MAPS
функциональность, подобную хэш-карте?
Функциональность хэша BPF структуры карт
Ответы (1)
Вы правы. Скрытая копия не делает различий между 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
.
person
pchaigno
schedule
14.04.2020