Да, это вполне возможно. Карта eBPF не привязана к интерфейсу, она создается в ядре, а затем на нее ссылается один или несколько из:
- Дескриптор файла из приложения, создавшего карту,
- Программа eBPF, использующая карту,
- Ссылка на другую карту выделенного типа (массив карт, хэш-карт),
- Закрепленный путь в виртуальной файловой системе eBPF.
Карты eBPF могут быть разделены между последовательными запусками программы, между ядром и пользовательским пространством или, что касается вашего варианта использования, между различными программами eBPF, независимо от того, к каким интерфейсам они подключены. Обратите внимание, что данная программа может быть даже отсоединена, а затем снова присоединена к другому интерфейсу.
Для повторного использования карты для нескольких программ это делается путем указания на одну и ту же карту при загрузке ваших программ: что происходит, когда вы загружаете одну карту, так это то, что вы получаете дескриптор карты (например, ее идентификатор или закрепленный путь), получить дескриптор файла для карты из этого дескриптора и поместить этот дескриптор файла в байт-код eBPF перед его загрузкой. Затем ядро переводит дескриптор файла в соответствующий адрес памяти.
На практике чаще всего происходит то, что этот шаг «перемещения» (помещение файлового дескриптора в байт-код) обрабатывается за вас инфраструктурой, которую вы используете для загрузки своих программ, такой как инструменты libbpf или bcc. Например, в libbpf есть функция bpf_map__reuse_fd(struct bpf_map *map, int fd)
для явного повторного использования заданного дескриптора файла для конкретной карты, используемой программой, после разбора объектного файла для извлечения байт-кода, но перед его загрузкой.
person
Qeole
schedule
11.01.2021