gpt4 book ai didi

linux - BPF:程序上下文的翻译

转载 作者:太空狗 更新时间:2023-10-29 11:49:04 24 4
gpt4 key购买 nike

我查看了不同类型的 BPF 程序,并注意到对于不同的程序类型,上下文的传递方式不同。

例子:

  1. 对于程序类型BPF_PROG_TYPE_SOCK_OPS,类型为struct bpf_sock_ops_kern的对象通过了。但是,这种类型的 BPF 程序引用了 struct bpf_sock_ops。 .为什么这样做,从 bpf_sock_ops_kernbpf_sock_ops 的“翻译”在哪里?

  2. 对于程序类型 BPF_PROG_TYPE_CGROUP_SKB,类型为 struct sk_buff 的对象已通过(例如,在 __cgroup_bpf_run_filter_skb 中),但 BPF 程序需要一个最小化版本,struct __sk_buff .

所以我查看了the struct bpf_verifier_ops function 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 ,字段 opfamilybpf_sock_ops_kern.op 中检索和 bpf_sock_ops_kern.sk->skc_family分别。

关于linux - BPF:程序上下文的翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49051729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com