контекст для каждого типа программы ebpf

Я видел, что для каждого типа программы ebpf есть разные входные данные (контекст) для программы. Например, в случае программы BPF_PROG_TYPE_SOCKET_FILTER в качестве аргумента передается указатель на структуру __sk_buff. Где определяются контексты для каждого типа программы?


person Maicake    schedule 26.08.2019    source источник


Ответы (1)


Где определяются контексты для каждого типа программы?

Они определены в ядре, как правило, в заголовках ядра. Точное местоположение зависит от типа программы. Например, __sk_buff используется несколькими типами программ и определен в linux/bpf.h.

Чтобы узнать, какой контекст ожидает каждая программа, вы можете просмотреть образцы BPF в ядре или попытаться найти xxxx_convert_ctx_access для данного типа программы. Эти функции переводят доступ к объекту контекста в доступ к реальному объекту ядра (например, __sk_buff является зеркальным отображением sk_buff). Например, программы XDP ожидают контекст введите struct xdp_md.

Как отметил @Qeole в комментариях, Oracle опубликовала сообщение в блоге от января 2019 года, в котором перечисляет ожидаемый контекст для каждого типа программы.

person pchaigno    schedule 26.08.2019
comment
Хороший ответ. В качестве дополнения в этой записи блога перечислены контексты для всех ( существующие на тот момент) типы программ и могут представлять интерес. - person Qeole; 27.08.2019
comment
Ах, здорово! Я добавил это в ответ. Спасибо! - person pchaigno; 27.08.2019
comment
В статье про BPF_PROG_TYPE_TRACEPOINT написано Какой контекст предоставляется? Контекст, предоставленный конкретной точкой трассировки; аргументы и типы данных связаны с определением точки трассировки. Внутри /include/trace/events/syscalls.h есть TRACE_EVENT_FN(sys_enter, TP_PROTO(struct pt_regs *regs, long id), TP_ARGS(regs, id), TP_STRUCT__entry( __field(long, id) __array(unsigned long, args, 6 ) ), .... Как я могу точно понять, что такое контекст? - person Maicake; 27.08.2019
comment
А также. Я видел здесь github .com/torvalds/linux/blob/ определен параметр bpf_raw_tracepoint_args, который используется с программами raw_tracepoint. Но я не могу найти контекст только для tracepoint . - person Maicake; 27.08.2019
comment
Для точек трассировки структура контекста специфична для каждого тестового сайта (например, block:block_getrq и block:block_plug будут иметь разные структуры контекста). См. этот ответ StackOverflow, чтобы узнать, как получить содержимое каждой структуры. Вам нужно будет самостоятельно объявить эту структуру с соответствующими полями (хотя bcc сделает это за вас). - person pchaigno; 27.08.2019
comment
Большое спасибо, осмотревшись, я прочитал, что в этом примере github.com/torvalds/linux/blob/master/samples/bpf/. В любом случае, я хотел бы понять, как я могу построить структуру, начиная с вывода формата. В моем случае вывод /sys/kernel/debug/tracing/events/syscalls/sys_enter_open/format . Потому что обычно я не вижу сопоставления 1 к 1, как я видел между этим /sys/kernel/debug/tracing/events/power/cpu_idle/format (6 полей) и github.com/torvalds/linux/blob/master/samples/bpf/ (здесь структура имеет 3 поля) - person Maicake; 28.08.2019