內核模塊編譯實踐


實驗目的

1、  理解模塊原理

2、  編寫模塊代碼

3、  編譯模塊

4、  加載模塊

5、  測試模塊

6、  卸載模塊

實驗步驟

1、實驗原理

Linux模塊是一些可以作為獨立程序來編譯的函數和數據類型的集合。之所以提供模塊機制,是因為Linux本身是一個單內核。單內核由於所有內容都集成在一起,效率很高,但可擴展性和可維護性相對較差,模塊機制可彌補這一缺陷。

Linux模塊可以通過靜態或動態的方法加載到內核空間,靜態加載是指在內核啟動過程中加載;動態加載是指在內核運行的過程中隨時加載。

一個模塊被加載到內核中時,就成為內核代碼的一部分。模塊加載入系統時,系統修改內核中的符號表,將新加載的模塊提供的資源和符號添加到內核符號表中,以便模塊間的通信。

2、編寫模塊代碼

模塊構造函數:

執行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的組合,輸出也並非顯示在屏幕上而是在內核信息中。距離獨立編寫出具有復雜功能的內核模塊代碼還有很長的距離。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM