Функциональность хэша BPF структуры карт

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


person byrnesj1    schedule 14.04.2020    source источник


Ответы (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