SystemTap----將SystemTap腳本編譯成內核模塊

  當運行SystemTap腳本時,會根據腳本生成一個內核模塊,然後插入到系統中執行後退出。這個過程總共分爲5個階段:parse, elaborate, translate, compile, run,對應的編號爲1-5.stap命令的-p選項可以用來指定在哪個階段停止,利用這個選項可以將腳本編譯成內核模塊。
正常情況下,SystemTap腳本只能在部署了SystemTap執行環境(安裝內核的開發包和debuginfo包)的機器,如果要在十臺機器上執行,就要在這些機器上都部署這樣的環境。如果將腳本編譯成內核模塊,藉助staprun命令(需要systemtap-runtime包)就可以像直接使用stap命令執行腳本一樣。當然,也可以直接使用insmod或modprobe命令直接將內核模塊插入到系統中運行。除此之外,還可以利用生成的內核模塊來修改系統的一些行爲,具體可以參考褚霸的文章《Systemtap輔助設置tcp_init_cwnd,免對操作系統打Patch》。
下面介紹一下具體的步驟:
1、編寫腳本
示例腳本如下:
probe begin {
%{ printk(KERN_ALERT "Hello, World!\n") %};
exit();
}
在上面的腳本中嵌入了C代碼,將“hello World"輸入到系統日誌,這個腳本其實很簡單,之所以貼出來,是因爲在分別使用insmod和staprun命令來執行生成的內核模塊時,表現不一樣,後面再說。將腳本保存爲hello.stp。
2、生成內核模塊
命令如下:
stap -p4 -gu -m hello hello.stp
-p選項用來指定在哪個階段停止,這裏是在compile階段。
因爲在腳本中嵌入了C代碼,所以要指定-g選項進入guru模式,-u選項是禁止優化的選項,可選。
-m是指定生成的內核模塊名稱,這裏生成的內核模塊就是hello.ko。如果不使用-m選項,systemtap會將生成的內核模塊放在用戶目錄的.systemtap目錄下。沒有指定的情況下,我的機器上生成的路徑爲/root/.systemtap/cache/e9/stap_e9ff1bc604b35641b8cec15699c7bfa0_791.ko,所以你懂的,最好要指定一下哦。
3、運行內核模塊
命令如下:
staprun hello.ko
這裏生成的hello.ko模塊在使用staprun命令運行的時候,會在系統日誌中顯示"Hello,World!",但是直接使用insmod時,則沒有看到,具體原因目前不詳,有知道的希望不吝賜教,拜謝。
除非必須,不要把日誌輸出到系統日誌,特別是量比較大的時候,否則會將重要的系統信息給沖掉。還是建議大家在使用的時候使用staprun命令來執行生成的內核模塊,不要使用insmod或modprobe。在使用staprun的時候還可以使用-o選項來指定的輸出的文件,如果不指定的話,腳本中的printf函數輸出的信息是看不到的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章