BPF技術學習分享

2021-10-10 00:20:45 字數 2905 閱讀 1791

bpf is a highly flexible and efficientvirtual machine-like constructin thelinux kernelallowing toexecute bytecodeat varioushook pointsin a safe manner.

bpf程式 ----llvm+clang----> bpf位元組碼 ----jit----> bpf指令集;

bpf架構採用一種新的虛擬機器設計,包含支援x86_64, arm64, mips64等架構的指令集,bpf指令集程式可以高效地工作在基於暫存器架構(r0到r10)的cpu上;

linux核心維護者不斷開發hook點,可以在hook點上掛載bpf程式,當hook點對應的事件發生就可以執行bpf程式,bpf程式返回hook點預定義的值,linux核心再根據返回值執行下一步操作(比如xdp型別的bpf程式掛載在指定的網路介面上,有資料報進入該網路介面,bpf程式對資料報進行解析然後根據協議字段進行判斷,如果不符合規則就返回xdp_drop,linux核心根據該返回值就會丟棄該資料報)。

c語言編寫的bpf程式經過llvm+clang編譯生成bpf位元組碼檔案(elf檔案),通過bpf()系統呼叫載入到核心,進入到核心首先經過bpf驗證器(檢查程式是否不包含控制迴圈、程式不會執行超過核心允許的最大指令數等),再經過即時編譯器將bpf位元組碼轉換成bpf在x86_64 cpu架構上的指令集,並掛載到socket send/recv型別的hook點,也就是說當程序執行sendmsg()/recvmsg()系統呼叫都會執行bpf程式,bpf程式可以檢查訊息內容並決定是丟棄該訊息還是將訊息向下傳遞或者是直接**給另外乙個socket。

bpf程式和使用者空間程式通過bpf對映通訊;

bpf對映以鍵/值儲存在核心,可以被任何bpf程式訪問,使用者空間的程式可以通過檔案描述符訪問bpf對映

bpf對映型別:bpf對映支援多種資料結構,從而實現核心內部資料的組織以及使用者態和核心態的通訊,比如雜湊表、陣列、佇列等等

bpf對映用途舉例:

1)在bpf程式不中斷的情況下修改其執行方式,修改對映中bpf程式訪問的配置資料或應用資料,例如黑名單規定的ip列表和網域名稱;

2)執行在核心的bpf程式統計進入指定網路介面的資料報資訊,並將統計資訊儲存到bpf對映,使用者態程式可以通過bpf對映獲取資料報統計資訊;

優點:通過定義和維護bpf輔助函式,由bpf輔助函式維護者處理linux核心版本的迭代更新,對開發者透明,形成穩定的api介面;

bpf輔助函式列表:

示例一:

這段程式的功能:丟棄所有源ip命中黑名單的arp包。

圖中首先定義了乙個bpf對映(可以在核心和使用者態之間傳遞資料)作為資料報黑名單,它的型別是bpf_map_type_hash(雜湊表資料結構),key值定義為ip位址,value值定義為1,雜湊表最大鍵值對數為100000,bpf對映中的內容是由使用者態程式預定義的。右邊通過sec語句宣告了乙個bpf程式,右側四個框的功能為:

初始化以太幀結構體;

如果不是arp資料報,返回xdp_pass,資料報將會交給核心繼續處理,如進入網路協議棧;

如果是arp資料報,解析獲得源ip位址,通過value = bpf_map_lookup_elem(&blacklist, &ip_src);bpf輔助函式訪問bpf對映,根據ip位址查詢對應的值,

a) 如果存在該ip位址,返回值為1,將返回xdp_drop,資料報將被丟棄;

b) 如果不存在該ip位址,返回值為0,將返回xdp_pass,資料報將會交給核心繼續處理;

示例二

參考:xdp-tutorial

判斷icmps報文順序號是否為奇數,如果為奇數返回1,偶數返回0,如果是偶數將返回xdp_drop。

環境準備:

執行make命令將bpf c原始檔編譯成bpf位元組碼檔案:

將bpf程式掛載到package網路介面,當package網路介面接收到資料報將執行該bpf程式:

在veth0介面上通過ping命令向package網路介面傳送icmp資料報,可以觀察到icmp順序號為偶數的資料報被丟棄:

切入口:xdp、tc、socket型別的bpf程式—>讀懂cilium bpf**;

BPF學習之效能分析

效能分析前我們需要先明確目標,有的放矢.明確了目標後,進一步的分析工作就有了上下文,不至於跑偏.一般來說,效能分析的目標是改進使用者最終體驗和降低執行成本.有了目標,最好能將其進行量化 這種量化能夠表明是否已經達到優化的目標,還可以定義離目標的差距有多遠.可測量的指標 終端使用者眼中的效能,是端到端...

研發團隊技術學習與分享

首先,我們需要明確為什麼要做這件事情。這件事情能給大家帶來什麼,預期結果又是什麼,這裡的 大家 主要有3個主體 公司 團隊 個人,每個主體對於技術學習與分享這件事件,都有不同的預期結果,下面總結了幾點目的 了解了目的,我們需要想想如何做,才能達成目的。的學習 培訓是比較難順利推進,繁重的開發任務和人...

mysql可以分享的技術 技術分享 MySQL

1 查詢語句是如何執行的?1 連線 1 建立連線 2 驗證許可權,修改了許可權,建立新的連線才會生效。3 sql執行的臨時記憶體 2 查詢快取 1 先查詢快取,更新操作會導致所有快取失效。2 mysql 8.0功能去掉 3 分析 詞法解析,語法解析 4 優化 1 決定使用哪個索引,比方說根據統計資訊...