這一章已經超過了單純driver,還包含到了kerenel debug的技巧,首先介紹一些在kernel hacking裡面的選項,為了debug有時候是必須打開的,接著介紹不同的技巧以及他們應用的時機
printk() : 最簡單最直接的一種,大致上分成八個level只有當設定的訊息的level小於console_loglevel的時候,訊息才會直接被送到console,作者還介紹了一個小工具程式,讓我們可以設定輸出的console。接著printk的問題就是如果在code裡面埋了一堆debugger information,要如何在編譯階段可以清理掉,作者定義了幾個macro來處理這件事情
/proc : 從2.6開始procfs被引入作為顯示系統狀態的vfs,如果老是使用printk在動作很多的時候,訊息量可以淹沒整個console畫面,反過來如果可以在適當時機將需要的資料拿出來看,這樣除錯就可以輕鬆許多,要在/proc底下註冊建立/proc檔案需要用到
struct proc_dir_entry *create_proc_read_entery(const char *name, mode_t mode, struct proc_dir_entry *base, read_proc_t *read_proc, void *data)
這一個function,可以註冊需要的路徑跟虛擬裝置,同時要提供可以讀取資料的函數(跟自己寫的module在同一檔案/空間之中),將目前module的狀態讓使用者可以用類似cat /proc/scullmem的方式取出。這種方式有個限制就是基本上是以page size,在運作,操作複雜結構的資訊並不是很容易,另外就是/proc已經開始有濫用的趨勢,/proc已經不只是讀取,還可以寫入,有點跟/dev一樣的問題。linux已經開始引入sysfs來處理這樣的問題,他要求更有架構性的資料
ioctl() : 最靈活的方式,但是程式設計師必須自行處理,在此章節作者也還不打算詳細介紹,他另外有個好處就是code獨立,不是類似printk會"汙染"到原本的code,所以忘記把它拿掉只是佔據記憶體空間:P
strace : 用來追蹤一些system call的次序,但是可讀性低於printk,有許多參數,如-o表示將輸出轉移到檔案內
strace -o /tmp/x1 ls -R > /dev/scull0
Ooops information : 當系統fault的時候(不是panic/死當),會產生類似coredump檔案的輸出,包含了CPU register等等information(P.S>我不大清楚它會產生到哪裡去@@a)
magic SysRq key : 一些特殊的組合鍵,讓使用者可以做一些事情,請參考書內內容
debugger tools : gdb、kdb、kgdb、Linux Trace Toolkit (LTT)、Dynamic Probes
裡面有提到一個有趣的User-Mode Linux,這是一個虛擬機器的機構,但是她不能讓使用者直接存取硬體
最後,其實作者的sample code的scull包含了chapter 3跟4,所以如果光看了chapter 3就去看code會感到怎麼還有很多多出來的東西
參考資料:
http://zh.wikipedia.org/wiki/Sysfs
http://blog.linux.org.tw/~asho/archives/001816.html
http://184.82.2.112/wordpress/?p=505
沒有留言:
張貼留言