由於LINUX裝置驅動以核心模組的形式而存在,因此,掌握這一章的內容是編寫任何類型裝置驅動所必須的。在具體的裝置驅動開發中,將驅動編譯為核心模組也有很強的工程意義,因為如果將正在開發中的驅動直接編譯入核心,而開發過程中會不斷修改驅動的代碼,則需要不斷地編譯核心並重啟核心,但是如果編譯為模組,則只需要rmmod並insmod即可,開發效率大為提高。下面說明如何添加、編譯並允許LINUX模組。
LINUX的模組主要由6部分組成:
1、模組的載入函數(必須)
當通過insmod或modprobe命令載入核心模組時,模組的載入函數會自動被核心執行,完成本模組的相關初始化工作。
2、模組的卸載函數(必須)
當通過rmmod命令卸載某模組時,模組的卸載函數會自動被核心執行,完成與模組載入函數相反的功能。
3、模組許可證聲明
模組許可證(LICENSE)聲明描述核心模組的的許可許可權,如果不聲明LICENSE,模組被載入時,將接到核心被汙染的警告。
4、模組參數(可選)
模組參數是模組被載入的時候可以被傳遞給它的值,它本身對應模組內部的全域變數。
5、模組匯出符號(可選)
核心模組可以匯出符號(symbol,對應於函數或者是變數),這樣其他模組就可以使用本模組中的變數或者是函數。
6、模組作者等資訊聲明(可選)
知道了LINUX模組的組成後,我們來編寫一個簡單的LINUX核心模組hello.c
在核心原始碼樹形目錄的drivers目錄下建立一個檔案夾,名字為testmod,然後進入此檔案夾中,建立我們的.c源檔案,hello.c
原始碼編寫完之後,接下來我們添加MAKFILE編譯檔案,首先修改drvier目錄下的MAKEFILE檔案,添加testmode目錄到此MAKEFILE
檔案中,drvier目錄下修改的MAKEFILE檔案如下所示:
然後在testmode目錄下,添加一個MAKEFILE 檔案,檔案的內容為:
做好上面的準備工作之後,我們開始編譯模組檔案,使用如下的編譯命令:
make -C /usr/src/linux-2.6.35.13 M=/usr/src/linux-2.6.35.13/drivers/testmod modules
輸入以上命令之後,我們將會成功得到模組檔案,hello.ko
當模組檔案產生之後,使用命令insmod hello.ko,我們將看到螢幕上列印Hello World enter
使用命令rmmod hello,ko,我們將在螢幕看到列印Hello World exit.