21.8 strace
在linux系統中,strace是一種相當有效的跟蹤工具,strace的主要特點是可以被用來監視系統呼叫。不僅可以用strace除錯乙個新開始的程式,也可以除錯乙個已經在執行的程式(這意味著把strace繫結到乙個已有的pid上)。對於第6章的globalmem字元裝置檔案,以strace方式執行如**清單21.8所示的使用者空間應用程式globalmem_test(使用gcc命令編譯globalmem_test.c檔案 gcc globalmem_test.c -o test),以strace ./test的方式執行結果如下:
execve("./globalmem_test", ["./globalmem_test"], [/* 24 vars */]) = 0
...open("/dev/globalmem", o_rdwr) = 3 /* 開啟的/dev/globalmem的fd是3 */
ioctl(3, fibmap, 0) = 0
read(3, 0xbff17920, 200) = -1 enxio (no such device or address)/* 讀取失敗 */
fstat64(1, ) = 0
mmap2(null, 4096, prot_read|prot_write, map_private|map_anonymous, -1, 0) = 0xb7f04000
write(1, "-1 bytes read from globalmem\n", 29-1 bytes read from globalmem
) = 29 /* 向標準輸出裝置(fd為1)寫入printf中的字串 */
write(3, "this is a test of globalmem", 27) = 27
write(1, "27 bytes written into globalmem\n", 3227 bytes written into globalmem
) = 32
...輸出的每一行對應一次linux系統呼叫,其格式為「左邊=右邊」,等號左邊是系統呼叫的函式名及其引數,右邊是該呼叫的返回值。
**清單21.8 使用者空間應用程式globalmem_test
#include ...
#define mem_clear 0x1
void main(void)
}使用strace雖然無法直接追蹤到裝置驅動中的函式,但是足以幫助工程師進行推演:
如從open(「/dev/globalmem」,o_rdwr)=3的返回結果知道/dev/globalmem的fd為3,之後對fd為3的檔案進行read()、write()和ioctl()系統呼叫,最終會使globalmem裡file_operations中的相應函式被呼叫,通過系統呼叫的結果就可以知道驅動中globalmem_read()、globalmem_write()和globalmem_ioctl()的執行結果。
第1章Linux裝置驅動簡介二
1.2 劃分核心 在 unix 系統中,幾個併發的程序專注於不同的任務.每個程序請求系統資源,比如計算能力,記憶體,網路連線,或者一些別的資源.核心是個大塊的可執行檔案,負責處理所有這樣的請求.儘管不同核心任務間的區別常常不是能清楚劃分,核心的角色可以劃分成下列幾個部分 如圖1.1 1 程序管理 核...
第1章 裝置驅動概述
本文摘自 偶有較小改動 linux 裝置驅動開發詳解 宋寶華 編著 人民郵電出版社 留作紀念。living park 第1章 裝置驅動概述 1.1 裝置驅動的作用 沒有硬體的軟體是空中樓閣,而沒有軟體的硬體則是一堆廢鐵。計算機系統的軟硬體互相成就了對方。對裝置驅動最通俗的解釋就是 驅動硬體裝置行動 ...
第19章 Flash裝置驅動
本文摘自 偶有較小改動 linux 裝置驅動開發詳解 宋寶華 編著 人民郵電出版社 留作紀念。living park 第19章 flash裝置驅動 19.1 linux flash驅動結構 19.1.1 linux mtd系統層次 在linux系統中,提供了mtd memory technology...