簡體   English   中英

BPF:程序上下文的翻譯

[英]BPF: translation of program contexts

我正在查看不同類型的BPF程序,並注意到對於不同的程序類型,上下文的傳遞方式不同。

示例:

  1. 對於程序類型BPF_PROG_TYPE_SOCK_OPS ,傳遞了一個struct bpf_sock_ops_kern類型的對象。 但是,這種類型的 BPF 程序引用了struct bpf_sock_ops 為什么bpf_sock_ops_kern ,從bpf_sock_ops_kernbpf_sock_ops的“翻譯”在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函數 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 ,字段opfamily分別在bpf_sock_ops_kern.opbpf_sock_ops_kern.sk->skc_family中檢索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM