[英]BPF: translation of program contexts
我正在查看不同类型的BPF
程序,并注意到对于不同的程序类型,上下文的传递方式不同。
示例:
对于程序类型BPF_PROG_TYPE_SOCK_OPS
,传递了一个struct bpf_sock_ops_kern
类型的对象。 但是,这种类型的 BPF 程序引用了struct bpf_sock_ops
。 为什么bpf_sock_ops_kern
,从bpf_sock_ops_kern
到bpf_sock_ops
的“翻译”在bpf_sock_ops
?
对于程序类型BPF_PROG_TYPE_CGROUP_SKB
,传递了一个struct sk_buff
类型的对象(例如,在__cgroup_bpf_run_filter_skb
),但 BPF 程序需要一个最小化版本, struct __sk_buff
。
所以我查看了struct bpf_verifier_ops
函数 callbacks ,但它们似乎只调整 BPF 指令中的偏移量,因为它们被 BPF 验证器调用。
如果有人能阐明 BPF 上下文是如何定义的,我会很高兴。 谢谢。
作为参数传递的镜像对象(例如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
中检索。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.