準備開發裝置驅動程式

3-1、開發驅動程式的要點

  • 建構(build)

將原始碼編譯之後只會得到目的檔(.o),這不是可以直接執行的形式。 開發應用程式的時候,會在編譯好之後「連結」,建立執行格式(ELF)的檔案。 編譯與連結動作加起來稱為「建構(build)」。 而驅動程式沒有連結需求,以預先準備好的 Makefile 建立驅動程式專用的物件檔(.ko)即可。 .ko 檔也是 ELF(Executable and Linking Format)格式,但不能直接執行,只能以 insmod 指令載入並嵌入 kernel。

  • 能否使用 printf

驅動程式是在與 kernel 的連結狀態下運作的,而這個環境下沒有「標準輸出」的觀念,所以 Linux 準備了 「printk()」這個與 printf 十分類似的函式。 printk() 會向稱為「kernel buffer」的一小塊資料空間(128KB)寫入訊息,其中 kernel buffer 為 ring buffer。

想檢查 kernel buffer 的內容時,可以執行 dmesg 指令,或是直接查詢 syslog 訊息紀錄(/var/log/messages),或是直接以 cat /proc/kmsg 得知即時訊息。

Kernel Module 相關指令介紹:

  • 驅動程式的載入與卸載

透過 insmod 指令可以載入 module。 lsmod 指令可以列出現在載入的所有 kernel module。 卸載驅動程式的工作可由 rmmod 指令完成。 「cat /proc/modules」會列出所有已載入的驅動程式。

modprobe

modprobe 同樣可用來載入驅動程式,但有一些不同: 引數不是檔名,而是「module name」。 會自動到 /lib/modules/'uname -r' 搜尋檔案。 會參考 /lib/modules/'uname -r'/modules.dep ,如果有需要用到其它的 modules,就會自動一起載入。

modinfo

如果要檢視 Linux 下 kernel module 的版本,可以透過 modinfo 指令實現,引數同樣是「module name」。

有關 module name 可以在 driver 的 makefile 中,搜尋 "MODNAME" 即可找到。