一、實驗目的
對Linux核心模組進行瞭解。
二、實驗內容
建立一個核心模組,在載入和卸載模組時在核心中列印相關資訊。
三、背景知識:
一、什麼是核心模組?
核心模組是Linux核心向外部提供的一個插口,其全稱為動態可載入核心模組(Loadable Kernel Module,LKM),我們簡稱為模組。Linux核心之所以提供模組機制,是因為它本身是一個單核心(monolithickernel)。單核心的最大優點是效率高,因為所有的內容都整合在一起,但其缺點是可擴充性和可維護性相對較差,模組機制就是為了彌補這一缺陷。
模組是具有獨立功能的程式,它可以被單獨編譯,但不能獨立運行。它在運行時被連結到核心作為核心的一部分在核心空間運行,這與運行在使用者空間的進程是不同的。模組通常由一組函數和資料結構組成,用來實現一種檔案系統、一個驅動程式或其他核心上層的功能。
總之,模組是一個為核心(從某種意義上來說,核心也是一個模組)或其他核心模組提供使用功能的代碼塊。
二、核心模組編寫
編寫核心模組時必須要有的兩個函數 :
__init 和 __exit 是 Linux 核心的一個宏定義,使系統在初始化完成後釋放該函數,並釋放其所佔記憶體。因此它的優點是顯而易見的。建議在編寫入口函數和出口函數時採用後面的方法。
還有,在核心編程時所用的庫函數和在使用者態下的是不一樣的。如模組程式中使用的printk函數,對應於使用者態下的printf函數,printk 是核心態資訊列印函數,功能和printf類似但 printk還有資訊列印層級。
載入模組和卸載模組:
1>module_init(hello_init)
a. 告訴核心你編寫模組程式從那裡開始執行。
b.module_init() 函數中的參數就是註冊函數的函數名。
2>module_exit(hello_exit)
a. 告訴核心你編寫模組程式從那裡離開。
b.module_exit() 中的參數名就是卸載函數的函數名。
三、核心模組編譯:
第一步:模組原始碼,如果使用vi更好,直接wq儲存退出即可!
第二步:寫一個Makefile檔案。
Makefile檔案所做的工作是編譯產生.o,.ko等模組相關檔案!
四、實驗步驟:
一、編寫模組代碼HelloWorld.c
二、編寫Makefile檔案
三、編譯模組
四、載入卸載HelloWorld模組
五、查看模組資訊
六、卸載HelloWorld模組
七、查看模組資訊
五、實驗示範:
進入Linux終端控制台,建立HelloWorld.c檔案,可用vi HelloWorld.c建立並編寫內容。
// HelloWorld.c:
圖2-1 模組HelloWorld代碼
建立Makefile檔案(注意檔案名稱大小寫區分)
圖2-2 模組HelloWorld的Makefile設定檔
注意:
“make –C/lib ......”語句
make語句前面的空格為定位字元(按tab鍵),-C 中的C為大寫,不能為小寫
儲存好後在終端目前的目錄執行make操作進行編譯,如:
圖2-3 對模組HelloWorld執行make操作
編譯好後會產生許多檔案:
圖2-4 模組HelloWorld編譯後的內容
最後對模組進行載入和卸載測試:
終端在目前的目錄下,輸入命令 insmod ./HelloWorld.ko;
輸入命令 lsmod,能找到名為HelloWorld 的模組,說明模組已經載入;
圖2-5 模組HelloWorld已經載入到核心
輸入命令 dmesg,查看最後一行,會有模組載入時調用的函數輸出;
輸入命令 rmmod HelloWorld ,卸載模組(注意與載入時不同),然後輸入lsmod,已經找不到HelloWorld模組,說明模組已經卸載;
輸入命令 dmesg,查看模組卸載是調用的函數輸出。
圖2-6 模組HelloWorld載入以及卸載時核心模組的記錄
六、實驗小結:
l Makefile 是一種指令碼,這種指令碼主要是用於多檔案的編譯
l make 程式可以維護具有相互依賴性的源檔案,但某些檔案發生改變時,它能自動識別出,並只對相應檔案進行自動編譯。
上述簡單例子中的Makefile檔案的內容為:obj-m:=helloworld.o,在這我要提醒大家,在網上有許多種Makefile檔案的寫法,但都太麻煩了,如果寫的是核心模組,obj-m:=*.o足矣(*是你的模組檔案名稱,比如上面的hellworld.c檔案).之後使用
make -Wall -C /lib/modules/`uname -r`/build M=`pwd`modules
命令產生helloworld.o,helloworld.ko等檔案,有的人直接使用
make -C /lib/modules/`uname -r`/build M=`pwd` modules
中間省略了-Wall,Wall可以看成 W+all,而W代表Warning,所以使用 -Wall 即是顯示所有警告!
l 載入模組命令:insmod helloworld.ko
l 卸載模組命令:rmmod helloworld.ko
查看模組資訊:dmesg