ebpf開發(fā)bcc之opensnoop方法源碼閱讀(上)
今天一起來閱讀libbpf-tools下使用C語言開發(fā)的工具opensnoop
opensnoop 功能是監(jiān)聽 syscalls 下的open方法的一個調(diào)用,使用此工具進(jìn)行open函數(shù)的可觀測性打印
下面直接開始源碼閱讀
這里只列舉出關(guān)鍵方法,其余方法在視頻中學(xué)習(xí)
opensnoop.bpf.c? 內(nèi)核態(tài)程序,他的作用是程序加載到ebpf虛擬機(jī)之后,當(dāng)發(fā)生系統(tǒng)調(diào)用'open' 后觸發(fā)對應(yīng)的內(nèi)核態(tài)方法執(zhí)行,下面一一列出方法的詳細(xì)說明
這里不得不說下:
以下三個介紹統(tǒng)屬于跟蹤文件系統(tǒng):
tracepoint : 跟蹤點(對于新人來說此時暫且理解ebpf中這個聲明是固定的,他的類型很多我們在別的篇幅中專門對他進(jìn)行學(xué)習(xí))
syscalls: 跟蹤點類型(在 debugfs 中對跟蹤點的類型進(jìn)行了各種的分類,如:TCP,電源,系統(tǒng)調(diào)用,網(wǎng)絡(luò)等等類型這個也在以后章節(jié)中說明)
sys_enter_open: 跟蹤點的名稱(他是由linux內(nèi)核管理者進(jìn)行維護(hù),隨著linux版本的升級跟蹤點名字不會發(fā)生改變,提供了更好的版本兼容性,通俗的說sys_enter_open的聲明對應(yīng)著系統(tǒng)調(diào)用中的 open方法)
SEC("tracepoint/syscalls/sys_enter_open") 的定義意味著如果linux內(nèi)核方法open方法發(fā)生調(diào)用時將觸發(fā)下面的 tracepoint__syscalls__sys_enter_open(struct trace_event_raw_sys_enter* ctx) 方法的執(zhí)行。
與上方相對應(yīng)的還有一個,當(dāng)open 方法執(zhí)行完畢以后會觸發(fā)下方內(nèi)核態(tài)函數(shù)的執(zhí)行
細(xì)心點可以發(fā)現(xiàn)這里使用的跟蹤點名稱是sys_exit_open 他和sys_enter_open"是成對出現(xiàn),在跟蹤系統(tǒng)文件中默認(rèn)這樣定義的,對于我們來說,當(dāng)進(jìn)入(enter) 一個方法時,我們可以拿到方法的參數(shù)信息,當(dāng)退出(exit)一個方法時我們可以得到一個方法返回值信息。
下面我們看以下方法:
trace_exit();
代碼中的注釋寫的很詳細(xì),其中我們重點關(guān)心的方法是
bpf_perf_event_output() 方法 他使用到環(huán)形緩沖區(qū)機(jī)制,更好的達(dá)到了數(shù)據(jù)傳輸?shù)臏?zhǔn)確性(避免打印錯亂,無數(shù)據(jù)大小限制)和性能,將event中當(dāng)前發(fā)生的事件結(jié)果映射到events Array類型的結(jié)構(gòu)體中供用戶態(tài)使用
opensnoop 內(nèi)核態(tài)學(xué)習(xí)到此結(jié)束,下章分享學(xué)習(xí)用戶態(tài)程序的實現(xiàn)方法