[英]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.