Linux设备驱动开发详解--笔记4--Linux内核模块

时间:2022-10-07 17:59:00

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