lsmod 命令可以獲得系統中加載了的所有模塊以及模塊間的依賴關係。
Linux內核模塊主要由以下幾個部分組成:
(1)模塊加載函數(一般需要)
insmod 或 modprobe(這個命令更強大,會同時加載該模塊所依賴的其他模塊)
(2)模塊卸載函數(一般需要)
rmmod 或 modprobe -r filename 這兩個命令與上面對應相反。
(3)模塊許可聲明(必須)
GPL,Linux2.6內核模塊最常見的以 MODULE_LICENSE("Dual BSD/GPL") 語句聲明模塊採用BSD/GPL雙LICENSE。
(4)模塊作者等其他聲明(可選)
其他暫時忽略。。。
內核加載模塊:
加載函數一般以__init標識聲明,eg. static int __init initialization_function(void){.......}
module_init(initialization_function);將這個函數註冊爲加載函數。
內核卸載模塊:
卸載函數一般以__exit標識聲明,eg. stati void __exit cleanup_function(void){.......}
module_exit(cleanup_function);將這個函數註冊爲加載函數。
模塊的編譯 Makefile :
KVERS = $(shell uname -r)
#Kernel modules
obj-m +=hello.o
#Specify flag for the module complication.
#EXTRA_CFLAGS=-g -O0
build: kernel_modules
kernel_modules:
[Tab] make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
[Tab] make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
Makefile文件與源代碼hello.o位於同一目錄,開啓其中的 EXTRA_CFLAGS=-g -O0 可以得到包括調試信息的hello.ko模塊。運行make命令得到的模塊可直接在PC機上運行。
如果包括多個.c文件,則修改:
obj-m :=modulename.o
modulename-objs : file1.o file2.o
得到我們編譯的內核模塊.ko文件放置在目標文件系統的相關目錄中。可用insmod 加載 ,如果要修改加載的模塊,只需要rmmod並insmod即可!