在linux中,模組是一種能夠為linux核心添加裝置驅動程式、檔案系統以及其他元件的方法,是一些可以作為獨立程式來編譯的函數和資料類型的集合,可以透過靜態或動態的方法載入到核心空間。
本教學操作環境:linux7.3系統、Dell G3電腦。
模組是一種能夠為Linux核心添加裝置驅動程式、檔案系統及其他元件的方法,它不需要重新編譯核心或重新啟動系統。對於核心來講,它需要處理的就是模組的裝載和卸載以及模組間的依賴關係。因為模組是在核心空間運行的,因此模組必須使用核心提供的函數,我們也可以使用模組來呼叫對應的核心函數,這屬於核心態程式設計的一種方式。模組文件的本質是一種可重定位的二進位文件,一般以*.ko的形式出現。
Linux模組可以透過靜態或動態的方法載入到核心空間,靜態載入是指在核心啟動過程中載入;動態載入是指在核心運作的過程中隨時載入。一個模組被載入到核心中時,就成為核心程式碼的一部分。模組載入入系統時,系統修改核心中的符號表,將新載入的模組提供的資源和符號加入核心符號表中,以便模組間的通訊。
模組的組成
#Linux核心模組主要由以下幾個部分組成:
模組載入函數(必須):當透過insmod指令載入核心模組時,模組的載入函數會自動被核心執行,完成本模組相關初始化工作;
模組卸載函數(必須):當透過rmmod指令卸載模組時,模組的卸載函數會自動被核心執行,完成與模組載入函數相反的功能;
模組許可證聲明(必須):模組許可證(LICENSE)聲明描述核心模組的許可權限,如果不聲明LICENSE,模組被載入時將收到核心被污染的警告。
模組參數(可選):模組參數是模組被載入的時候可以被傳遞給他的值,它本身對應模組內部的全域變數;
模組導出符號(可選):核心模組可以導出符號(symbol,對應於函數或變數),這樣其他模組可以使用本模組中的變數或函數;
模組作者等資訊聲明(可選)。
一個模組的範例:
//内核头文件 #include<linux/module.h> #include<linux/kernel.h> #include<linux/init.h> //加载函数 static int __init init_hello_module(void){ //内核打印函数,linux系统使用dmesg命令可以查看打印信息 printk(KERN_INFO "Hello World\n"); return 0; } //卸载函数 static void __exit exit_hello_module(void){ printk(KERN_INFO "Exit the Hello world Module!\n"); } module_init(init_hello_module); module_exit(exit_hello_module); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Eric"); MODULE_VERSION("v0.1"); MODULE_DESCRIPTION("TEST FOR MODULE");
模組對應的Makefile檔案:
#Makefile obj-m:=hello.o KERNELBUILD:=/lib/modules/$(shell uname -r)/build all: make -C $(KERNELBUILD) M=$(shell pwd) modules clean: make -C $(KERNELBUILD) M=$(shell pwd) clean
相關推薦:《Linux影片教學》
以上是linux模組是什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!