三、準備開發裝置驅動程式



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" 即可找到。
arrow
arrow
    全站熱搜

    silverfoxkkk 發表在 痞客邦 留言(0) 人氣()