一、 理解模塊原理緩存
二、 編寫模塊代碼函數
三、 編譯模塊測試
四、 加載模塊3d
五、 測試模塊指針
六、 卸載模塊blog
Linux模塊是一些能夠做爲獨立程序來編譯的函數和數據類型的集合。之因此提供模塊機制,是由於Linux自己是一個單內核。單內核因爲全部內容都集成在一塊兒,效率很高,但可擴展性和可維護性相對較差,模塊機制可彌補這一缺陷。進程
Linux模塊能夠經過靜態或動態的方法加載到內核空間,靜態加載是指在內核啓動過程當中加載;動態加載是指在內核運行的過程當中隨時加載。內存
一個模塊被加載到內核中時,就成爲內核代碼的一部分。模塊加載入系統時,系統修改內核中的符號表,將新加載的模塊提供的資源和符號添加到內核符號表中,以便模塊間的通訊。資源
模塊構造函數:原型
執行insmod或modprobe指令加載內核模塊時會調用的初始化函數。函數原型必須是module_init(),括號內是函數指針
模塊析構函數:
執行rmmod指令卸載模塊時調用的函數。函數原型是module_exit()
模塊許可聲明:
函數原使用的許可證,否則在加載時它會提示該模塊污染內核。通常會寫GPL。
模塊參數(可選)
模塊導出符號(可選)
模塊做者信息聲明(可選)
頭文件module.h,必須包含此文件;
頭文件kernel.h,包含經常使用的內核函數;
頭文件init.h包含宏_init和_exit,容許釋放內核佔用的內存。
編寫一個helloword向內核輸出,代碼以下:
而後uname -r 查看本身的內核版本
據此編寫本身的Makefile
obj-m:後面接要編譯的文件名.o,CURRENT_PATH是當前路徑,LINUX_KERNEL_PATH是前面查到的所使用內核的路徑,
make -C $(LINUX_KERNEL_PATH) 指明跳轉到內核源碼目錄下讀取那裏的Makefile,
M=$(CURRENT_PATH) 代表返回到當前目錄繼續執行當前的Makefile。
而後執行make
可見在當前目錄下生成了printname.ko文件
隨後加載模塊:
輸入命令:sudo insmod printname.ko
模塊加載成功,由於模塊使用的輸出是直接輸出到內核緩存,可使用dmesg查看相關信息
而後可使用sudo rmmod printname.ko
再次查看顯示模塊已退出
利用模塊還能夠實現一些較爲複雜的功能,由於能力問題,我借用了學長的代碼,功能是打印當前進程信息,代碼以下:
而後須要把Makefile中的文件名修改爲本文件名,其他不變
加載和卸載過程同printname同樣,再也不贅述。
本次實驗相較上次,操做難度有所減小,但那是創建在使用前人代碼的前提下,模塊代碼的編寫與普通C語言很是相似,但又不盡相同,本次實踐使用輸出函數再也不是printf而是printk與KERN_INFO的組合,輸出也並不是顯示在屏幕上而是在內核信息中。距離獨立編寫出具備複雜功能的內核模塊代碼還有很長的距離。