modprobe命令比insmod命令强大,它在加载某模块时会同时加载该模块所依赖的其他模块。使用modprobe命令加载的模块若以“modprobe –r filename”的方式卸载将同时卸载其依赖的模块。
printk打印到var/log/messages
2.6内核中已加载的信息也存在于/sys/module目录下,加载hello.ko后,内核中将包含/sys/module/hello目录,该目录又包含一个refcnt文件和一个sections目录
/proc/kallsyms文件对应着内核符号表,它记录了符号以及符号所在的内存地址
#include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
int add_integar(int a, int b)
{
return a+b;
}
int sub_integar(int a, int b)
{
return a-b;
}
EXPORT_SYMBOL(add_integar);
EXPORT_SYMBOL(sub_integar);
编译后将模块插入,可以从/pro/kallsyms文件中找出add_integar、sub_integar相关信息
cat /pro/kallsyms |grep integar
try_module_get()与module_put()的引入与使用与Linux2.6内核下的设备模型密切相关。2.6内核为不同类型的设备定义了struct module *owner域,用来指向管理此设备的模块。当开始使用某个设备时,内核使用try_module_get(dev->owner)去增加管理此设备的owner模块的使用计数;当不再使用此设备时,内核使用module_put(dev->owner)减少对管理此设备的owner模块使用计数。这样,当设备在使用时,管理此设备的模块将不能被卸载。只有设备不再被使用时,模块才允许被卸载
开发人员所写的驱动通常是支持某种具体设备的owner模块,对此设备owner模块的计数管理有内核更底层的代码(如总线驱动或是此类设备公用的核心模块)来实现,从而简化了设备驱动的开发
编译步骤:先进入Linux内核所在的目录,并编译出.o文件,运行MODPOST回生成临时的.mod.c文件,而后根据此文件编译出.mod.o,之后连接.o和.mod.o得到模块目标文件.ko,最后离开Linux内核所在目录
如果模块包含多个.c文件(如file1.c、file2.c),Makefile如下:
obj-m := modulename.o
module-objs := file1.o file2.o