Это продолжение кто создает карту в BPF, поскольку мой новый вопрос не напрямую актуальной этой ветки.
Итак, мне кажется, что должна быть одна точка, где создается карта BPF, либо это программа bpf, либо пользовательская программа, которая загружает bpf и т. д.
Программа BPF должна знать тип карт, с которыми она будет работать, во время компиляции, поэтому нам нужно:
struct bpf_map_def SEC("maps") my_map = {
...
};
Таким образом, это означает, что пользовательская программа, например bpftool
, инициирует создание карт, найденных в разделах bpf ELF, как показано в кто создает карту в потоке BPF.
С другой стороны, пользовательское приложение должно будет добавлять/удалять записи на карте. Чтобы это произошло, он должен знать ID
карты, чтобы получить fd карты с bpf_map_get_fd_by_id()
из libbpf
. После этого мы можем наслаждаться bpf_map_update_elem()
и подобными API.
С другой стороны, если мы объявили раздел карты в программе BPF и используем API карты, карты будут сохранены в ядре и им будут присвоены идентификаторы.
Итак, в этом случае у нас будет две карты с двумя разными идентификаторами: одна создана в результате bpf_prog_load()
из bpftool
, а другая из пользовательского приложения bpf_create_map()
(при условии, что приложение продолжает работать, например, обновляет карты, и не вернуться в оболочку).
Должен ли быть способ обойти эту двусмысленность?