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即可!