BPF: перевод контекста программы

Я смотрел на различные типы BPF и заметил, что для разных типов программ контекст передается по-разному.

Пример:

  1. Для типа программы BPF_PROG_TYPE_SOCK_OPS объект типа struct bpf_sock_ops_kern передается. Тем не менее, программа BPF этого типа принимает ссылку на struct bpf_sock_ops, Почему так сделано и откуда перевод bpf_sock_ops_kern в bpf_sock_ops?

  2. Для типа программы BPF_PROG_TYPE_CGROUP_SKB объект типа struct sk_buffпередается (например, в __cgroup_bpf_run_filter_skb), но программа BPF ожидает минимизированную версию, struct __sk_buff,

Итак, я посмотрел на struct bpf_verifier_ops функции обратного вызова, но они, кажется, только корректируют смещения в инструкциях BPF, так как они вызываются верификатором BPF.

Я был бы рад, если бы кто-то мог пролить свет на то, как определяется контекст БНФ. Благодарю.

1 ответ

Решение

Зеркальные объекты (например, struct bpf_sock_ops), передаваемый в качестве аргумента, предоставляет подмножество полей исходного объекта (ов) для программы BPF. Зеркальная структура также может иметь поля из нескольких разных исходных структур; в этом случае зеркальный объект служит агрегатом. Передача исходных объектов в программу BPF также вводит в заблуждение, поскольку пользователь может думать, что у него есть доступ ко всем полям. Например, они могут думать, что имеют доступ к bpf_sock_ops_kern.sk когда это на самом деле не так.

Затем верификатор преобразует доступ к зеркальному объекту в доступ к исходному объекту (ам), прежде чем программа будет выполнена в первый раз. Есть функция преобразования для каждого типа зеркального объекта (например, sock_ops_convert_ctx_access для преобразования доступа к struct bpf_sock_ops). Затем для каждого поля зеркального объекта (т. Е. Для каждого смещения) функция преобразования переписывает инструкцию загрузки или сохранения со смещением в исходное поле.

Обратите внимание, что все исходные поля могут не находиться в одном и том же объекте. Например, в зеркальном объекте struct bpf_sock_ops, поля op а также family получены в bpf_sock_ops_kern.op а также bpf_sock_ops_kern.sk->skc_family соответственно.

Другие вопросы по тегам