BPF: перевод контекста программы
Я смотрел на различные типы BPF
и заметил, что для разных типов программ контекст передается по-разному.
Пример:
Для типа программы
BPF_PROG_TYPE_SOCK_OPS
объект типаstruct bpf_sock_ops_kern
передается. Тем не менее, программа BPF этого типа принимает ссылку наstruct bpf_sock_ops
, Почему так сделано и откуда переводbpf_sock_ops_kern
вbpf_sock_ops
?Для типа программы
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
соответственно.