在linux中,模塊是一種能夠向linux內(nèi)核添加設備驅動程序、文件系統(tǒng)以及其他組件的方法,是一些可以作為獨立程序來編譯的函數(shù)和數(shù)據(jù)類型的集合,可以通過靜態(tài)或動態(tài)的方法加載到內(nèi)核空間。
本教程操作環(huán)境:linux7.3系統(tǒng)、Dell G3電腦。
linux模塊是什么意思
模塊是一種能夠向Linux內(nèi)核添加設備驅動程序、文件系統(tǒng)及其他組件的方法,它不需要重新編譯內(nèi)核或者重啟系統(tǒng)。對于內(nèi)核來講,它需要處理的就是模塊的裝載和卸載以及模塊間的依賴關系。因為模塊是在內(nèi)核空間運行的,因此模塊必須使用內(nèi)核提供的函數(shù),我們也可以使用模塊來調(diào)用相應的內(nèi)核函數(shù),這屬于內(nèi)核態(tài)編程的一種方式。模塊文件的本質(zhì)是一種可重定位的二進制文件,一般以*.ko的形式出現(xiàn)。
?Linux模塊可以通過靜態(tài)或動態(tài)的方法加載到內(nèi)核空間,靜態(tài)加載是指在內(nèi)核啟動過程中加載;動態(tài)加載是指在內(nèi)核運行的過程中隨時加載。一個模塊被加載到內(nèi)核中時,就成為內(nèi)核代碼的一部分。模塊加載入系統(tǒng)時,系統(tǒng)修改內(nèi)核中的符號表,將新加載的模塊提供的資源和符號添加到內(nèi)核符號表中,以便模塊間的通信。
模塊的使用
?模塊的組成
Linux內(nèi)核模塊主要由以下幾個部分組成:
模塊加載函數(shù)(必須):當通過insmod命令加載內(nèi)核模塊時,模塊的加載函數(shù)會自動被內(nèi)核執(zhí)行,完成本模塊相關初始化工作;
模塊卸載函數(shù)(必須):當通過rmmod命令卸載模塊時,模塊的卸載函數(shù)會自動被內(nèi)核執(zhí)行,完成與模塊加載函數(shù)相反的功能;
模塊許可證聲明(必須):模塊許可證(LICENSE)聲明描述內(nèi)核模塊的許可權限,如果不聲明LICENSE,模塊被加載時將收到內(nèi)核被污染的警告。
模塊參數(shù)(可選):模塊參數(shù)是模塊被加載的時候可以被傳遞給他的值,它本身對應模塊內(nèi)部的全局變量;
模塊導出符號(可選):內(nèi)核模塊可以導出符號(symbol,對應于函數(shù)或變量),這樣其他模塊可以使用本模塊中的變量或函數(shù);
模塊作者等信息聲明(可選)。
一個模塊的示例:
//內(nèi)核頭文件 #include<linux> #include<linux> #include<linux> //加載函數(shù) static?int?__init?init_hello_module(void){ ????//內(nèi)核打印函數(shù),linux系統(tǒng)使用dmesg命令可以查看打印信息 ????printk(KERN_INFO?"Hello?Worldn"); ????return?0; } //卸載函數(shù) 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");</linux></linux></linux>
模塊對應的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視頻教程》