TWLKH
Linux kernel
Linux
小弟不是電類的,若以下筆記有錯誤歡迎任何指教,謝謝。
環境
裝置驅動程式是為了隱藏硬體的複雜性和多變性,幫助使用者能夠簡單的呼叫函式即能完成複雜的工作,並和使用者的程式隔離,避免直接存取核心資料結構和硬體裝置。
在本章裝置驅動程式(device driver)、可動態載入模組(loadable module)、可動態載入核心模組(loadable kernel device,LKM)、模組(module),通通都是指核心裝置驅動模組(kernel device driver module),因為好像沒有統一的術語。
linux提供界面方便使用者在開機後動態的移除或加入模組到核心中,當核心完成啟動後,開始安裝動態模組(loadable module),或是透過script安裝模組,當模組需要使用時,才要求載入模組,那麼動態載入模組有什麼好處呢?
當然我們也可以透過重新編譯核心將驅動裝置直接編譯進核心,或是透過Chapter 6 : User Space Initialization將需要的模組和載入模組的script放進Initial RAM Disk這樣就可以直接在開機時啟動模組。
簡略分為兩類
裝置 | 字元裝置(character devices) | 區塊裝置(block devices) |
---|---|---|
讀寫方式 | serial | 以block為單位,進行讀寫 |
舉例 | keyboard,arduino | 硬碟,隨身碟 |
project tree:
hello.c
接下來我們要將寫好的模組加入到kernel中,步驟如下
修改完後就可以在menuconfig看見核心組態檔(Kconfig)的編譯選項
到這邊修改完後我們就可以開始建構驅動程式模組了!
hello.ko模組就是我們的模組
不知道有沒有其他方法可以直接上傳模組到qemu虛擬機裡,或是直接透過qemu掛載模組,小弟這邊是透過NFS掛載於qemu,想知道一般大家都是怎麼做的?
如何掛載NFS可以參考這裡
接下來我們嘗試在qemu上掛載我們編譯好的hello.ko
首先先更改console的級別才能將log的訊息列印到console上
更詳習的規則可以參考這裡
接著掛載module
就可以發現init的message列印於當前console下
移除已掛載的module也很簡單
現在讓我們為模組增加參數,讓其可以透過insmod輸入模組參數
module_param定義於…/include/linux/moduleparam.h中,由modules.h引入,作用是將模組參數向核心模組子系統做註冊
MODULE_PARM_DESC向核心註冊參數說明的字串
接著讓我們看看如何在載入模組時使用引數
也可以直接引入
模組工具在前一小節已經介紹過,如果你想要更詳細的說明請參考manual
insmod 接收一個模組的絕對路徑,並將模組載入核心
將載入到核新的模組清單印出
最右邊的欄位Uesd by表示該模組正在使用中,並列出相依性
modprobe可以幫我們解決模組間相依的問題,舉例來說上例的gf128mul需要lrw模組才能使用,modprobe能幫我解決這個問題,並以正確的順序載入。
會將lrw與gf128mul都載入
則會將兩個模組都移除
使用modeprobe載入module時要先將module複製至/lib/modules/$(uname -r)/kernel 下
modprobe必須依賴modules.dep來知道模組間的相依關係,而depmod負責為我們產生這個檔案,這個檔案內含一份核心建構系統有啟用的模組清單。
這個檔案放至於/lib/modules/4.4.0-($uname -r)/modules.dep 下
格式為
[模組]:[關聯模組]
移除核心中的模組,不需要路徑,不會移除相依的模組
檢視module的詳細資訊
接下來我們將介紹如何由module提供介面函式給user space application
裝置節點是一種特殊的檔案類型,linux用這種檔案來代表裝置,幾乎所有linux distribution都將裝置節點放在/dev下,我們會透過mknod產生裝置節點。
mknod [裝置節點位置] [檔案類型] [主編號] [次編號]
我們透過裝置節點來跟已安裝的驅動程式做銜接,當程式透過open系統呼叫時,核心會透過主編號(此範例中為234)將驅動程式和裝置節點做連接,作業系統並不理會次編號,會把次編號直接傳給驅動裝置,讓一個驅動程式可以處理多個子裝置。
裝置節點一般是透過udev產生,後面章節會介紹到,另外本章的範例是透過手動直接把裝置主編號直接指定在source code中,這樣做並不好,應該透過kernel指定一個給驅動程式,詳細作法Linux Device Drivers的第三章有說明到。
還要再研究
現在我們創立一個use-hello3.c 來運用我們寫的驅動程式
最後執行我們的use-hello
https://www.gnu.org/licenses/quick-guide-gplv3.html
Linux Device Drivers:台灣:Linux 驅動程式, 3/e (Linux Device Drivers, 3/e)
Essential Linux Device Drivers有中文版
Filesystem Hierarchy Standard
Loda's blog
The Linux Kernel Module Programming Guide
開機流程、模組管理與 Loader
本參考資料中也含有模組工具的使用