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

模块管理与内核编程
本文介绍了Linux内核模块管理工具modprobe与insmod的区别,重点讲解modprobe的强大功能及其实现原理。此外还探讨了内核编程技巧,包括如何通过 printk 打印日志、查看已加载模块信息的方法以及内核符号表的应用。最后详细说明了模块的编译流程与多文件模块的Makefile编写方式。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值