一. 为什么要使用模块
linux属于微内核操作系统,整个内核都运行在内核空间,但是linux的功能是可以动态加载的,加载机制就是使用模块来实现的。
linux使用模块机制可以实现以下特点:
(1)模块可以动态加载和卸载。
(2)模块加载后,完全与内核融为一体。
二. 最简单的模块实例
/***********************************************************************
* File: hello.c
* Author: Ting
* Desc: hello module code
* History: June 27th 2012
***********************************************************************/
#include <linux/init.h>
#include <linux/module.h>
static int __init hello_init(void)
{
printk(KERN_ALERT "Hello world\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT " Hello world exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("Ting");
MODULE_LICENSE("Dual BSD/GPL");
MODULE_DESCRIPTION("A hello world Module");
MODULE_ALIAS("Hello World Module");
三. 模块程序结构
(1) 模块加载和卸载函数。通过module_init 和module_exit 这两个函数来限定某个函数是加载或卸载函数,加载和卸载函数分别在模块加载和卸载时被内核自动调用执行。
(2) 模块许可证声明。使用MODULE_LICENSE来声明,一般使用“Dual BSD/GPL”.
(3) 模块参数。模块加载时传给模块的全局变量。
(4) 模块导出符号。使用EXPORT_SYMBOL(符号名) 或 EXPORT_SYMBOL_GPL(符号名)来声明该符号名可以被别的模块使用。符号名可以是一个变量或函数,linux提供的驱动模型很多是采用模块导出符号来供别的驱动使用。在/proc/kallsyms文件中对应则会内核符号表。
(5) 模块描述。使用 MODULE_DESCRIPTION 声明。
(6) 模块作者。使用 MODULE_AUTHOR 声明。
(7) 模块别名。使用 MODULE_ALIAS 声明。
(8) 模块版本。使用 MODULE_VERSION 声明。
(9) 模块设备表。使用 MODULE_DEVICE_TABLE 声明。
四. 模块操作
insmod xx_oo.ko ------ 加载模块
insmod xx_oo.ko 参数名=参数值 ------ 加载模块并传递模参数
rmmod xx_oo -----卸载模块
lsmod -----显示加载的模块信息,该命令实际是读取/proc/modules文件,另外内核已加载的模块信息也位于/sys/module目录下。
modprobe -----加载该模块以及该模块依赖的其他模块
modprobe -r xx_oo ------卸载该模块以及该模块依赖的其他模块
modinfo xx_oo.ko ------显示模块信息
request_module(module_name); ------在内核中使用这个函数来动态加载一个模块
request_module( “char-major-%d-%d”,MAJOR(dev),MINOR(dev) ); -----在内核中使用这个函数来动态加载一个模块
五. 模块编译
若模块由一个源文件组成,makefile模板如下:
ifneq ($(KERNELRELEASE),)
obj-m := xx_oo.o
else
KDIR := /home/Ting/linux-2.6.32.2
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers modul*
endif
如果模块式由多个源文件组成,只有将上面的 obj-m := xx_oo.o 改成下面这样就可以了:
obj-m := xx_oo.o
xx_oo-objs := file1.o file2.o
注:本内容为本人原创,仅仅为了及时总结知识点以免忘记,所以内容不保证完全正确,如有不同意见,欢迎指正,以使我的及时纠正!