linux 驅動有兩種執行方式,第一種就是將驅動編譯進 linux 核心中,這樣當 linux 核心啟動的時候就會自動執行驅動程式。第二種就是將驅動編譯成模組(linux 下模組擴充套件名為.ko),在linux 核心啟動以後使用「insmod」命令載入驅動模組。在除錯驅動的時候一般都選擇將其編譯為模組,這樣我們修改驅動以後只需要編譯一下驅動**即可,不需要編譯整個 linux **。而且在除錯的時候只需要載入或者解除安裝驅動模組即可,不需要重啟整個系統。總之,將驅動編譯為模組最大的好處就是方便開發,當驅動開發完成,確定沒有問題以後就可以將驅動編譯進linux 核心中,當然也可以不編譯進 linux 核心中,具體看自己的需求。模組有載入和解除安裝兩種操作,我們在編寫驅動的時候需要註冊這兩種操作函式,模組的載入和解除安裝註冊函式如下:
module_init(***_init); //註冊模組載入函式module_init 函式用來向 linux 核心註冊乙個模組載入函式,引數 ***_init 就是需要註冊的具體函式,當使用「insmod」命令載入驅動的時候, ***_init 這個函式就會被呼叫。 module_exit()函式用來向 linux 核心註冊乙個模組解除安裝函式,引數 ***_exit 就是需要註冊的具體函式,當使用「rmmod」命令解除安裝具體驅動的時候 ***_exit 函式就會被呼叫。字元裝置驅動模組載入和解除安裝模板如下所示:module_exit(***_exit); //註冊模組解除安裝函式
1
/* 驅動入口函式 */
2static
int __init ***_init
(void)3
78/* 驅動出口函式 */
9static
void __exit ***_exit
(void)10
1314
/* 將上面兩個函式指定為驅動的入口和出口函式 */
15module_init
(***_init);16
module_exit
(***_exit)
;
第 2 行,定義了個名為 ***_init 的驅動入口函式,並且使用了「__init」來修飾。
第 9 行,定義了個名為 ***_exit 的驅動出口函式,並且使用了「__exit」來修飾。
第 15 行,呼叫函式 module_init 來宣告 ***_init 為驅動入口函式,當載入驅動的時候 ***_init函式就會被呼叫。
第16行,呼叫函式module_exit來宣告***_exit為驅動出口函式,當解除安裝驅動的時候***_exit函式就會被呼叫。
驅動編譯完成以後擴充套件名為.ko,有兩種命令可以載入驅動模組: insmod和 modprobe, insmod是最簡單的模組載入命令,此命令用於載入指定的.ko 模組,比如載入 drv.ko 這個驅動模組,命令如下:
insmod drv.ko
insmod 命令不能解決模組的依賴關係,比如 drv.ko 依賴 first.ko 這個模組,就必須先使用insmod 命令載入 first.ko 這個模組,然後再載入 drv.ko 這個模組。但是 modprobe 就不會存在這個問題, modprobe 會分析模組的依賴關係,然後會將所有的依賴模組都載入到核心中,因此modprobe 命令相比 insmod 要智慧型一些。 modprobe 命令主要智慧型在提供了模組的依賴性分析、
錯誤檢查、錯誤報告等功能,推薦使用 modprobe 命令來載入驅動。 modprobe 命令缺省會去/lib/modules/目錄中查詢塊,比如本書使用的 linux kernel 的版本號為 4.1.15,因此 modprobe 命令缺省會到/lib/modules/4.1.15 這個目錄中查詢相應的驅動模組,一般自己製作的根檔案系統中是不會有這個目錄的,所以需要自己手動建立。
驅動模組的解除安裝使用命令「rmmod」即可,比如要解除安裝 drv.ko,使用如下命令即可:
rmmod drv.ko
也可以使用「modprobe -r」命令解除安裝驅動,比如要解除安裝 drv.ko,命令如下:
modprobe -r drv.ko
使用 modprobe 命令可以解除安裝掉驅動模組所依賴的其他模組,前提是這些依賴模組已經沒有被其他模組所使用,否則就不能使用 modprobe 來解除安裝驅動模組。所以對於模組的解除安裝,還是推薦使用 rmmod 命令。 驅動 載入 解除安裝
載入過程 bool cloadsysdlg loaddriver lpctstr lpservicename,lpctstr lppathname sc createhanle createservice scmanagerhandle,lpservicename,用於建立登記資料庫中的關鍵字 lp...
linux驅動載入命令和驅動模組資訊檢視
驅動操作命令 insmod modprobe 載入驅動 rmmod 解除安裝驅動 lsmod 檢視系統中所有已經被載入了的所有的模組以及模組間的依賴關係 modinfo 獲得模組的資訊 檢視已經載入的驅動模組的資訊 lsmod 能夠顯示驅動的大小以及被誰使用 cat proc modules 能夠顯...
模組的編寫 編譯 載入和解除安裝
以最簡單的hello world模組為例 1.編寫模組 my module.c include include include static int hello init void static void hello exit void module init hello init module e...