contributed by < chiacyu
>
XDP(Express Data Path)是一種基於 ebpf (Extended Berkeley Packet Filter) 的高速資料傳輸技術,可提供高效率的封包處理服務。
ebpf (Extended Berkeley Packet Filter) 則是運行於 Linux 核心內部的虛擬機器(virtual machine)使用者可自行撰寫 ebpf 程式並透過相關 API 載入。不同 program type
則提供不同的功能,有些可用於系統功能的量測與紀錄系統呼叫的次數等等。
編譯過後的 bpf program
需要透過一些工具來將程式載入,可以使用 bpf system call外, 也可以用int bpf(int cmd, union bpf_attr *attr, unsigned int size);
透過傳入的參數來定義後續的行為,可以看到 union bpf_attr *attr
的內容
其中透過 prog_type
可以將 ebpf program 分成幾種類型,每一種則對應到不同的事件,當該事件發生時已載入的 ebpf program
也會被啟動。更詳細的 program type
可以參考
除了撰寫客製化的 bpf program 之外也可以使用 bcc
提供的許多現成的工具
從 bcc/tools/ 可以看到許多現成的工具可以使用,首先需要針對作業系統的版本安裝所需的套件。 先將 bcc 專案複製到本機端並進入 tools
資料夾執行 sudo python opensnoop.py
可以看到
opensnoop.py
這個檔案內容可以看到 syscall__trace_entry_open
就是將程式對 open
這個 系統呼叫做 hook
,當 open
被呼叫時 bpf program
就會被啟動。
撰寫 XDP program
可以參考 xdp-tutorial 的內容。
接著透過 llvm-objdump
可以看到內容為
其中 section xdp 透過 SEC
巨集來定義,可以看到 0000000000000000
的 section 出現先前定義的程式 xdp_prog_simple,而 SEC
的實做可以詳見 /tools/lib/bpf/bpf_helpers.h
看到