博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MODULE_DEVICE_TABLE (二)【转】
阅读量:7219 次
发布时间:2019-06-29

本文共 2198 字,大约阅读时间需要 7 分钟。

转自:

1. MODULE_DEVICE_TABLE (usb, skel_table);
该宏生成一个名为__mod_pci_device_table的局部变量,该变量指向第二个参数。内核构建时,depmod程序会在所有模块中搜索符号__mod_pci_device_table,把数据(设备列表)从模块中抽出,添加到映射文件/lib/modules/KERNEL_VERSION/modules.pcimap中,当depmod结束之后,所有的PCI设备连同他们的模块名字都被该文件列出。当内核告知热插拔系统一个新的PCI设备被发现时,热插拔系统使用modules.pcimap文件来找寻恰当的驱动程序。 

MODULE_DEVICE_TABLE的第一个参数是设备的类型,如果是USB设备,那自然是usb(如果是PCI设备,那将是pci,这两个子系统用同一个宏来注册所支持的设备)。后面一个参数是设备表,这个设备表的最后一个元素是空的,用于标识结束。例:假如代码定义了USB_SKEL_VENDOR_ID是 0xfff0,USB_SKEL_PRODUCT_ID是0xfff0,也就是说,当有一个设备接到集线器时,usb子系统就会检查这个设备的 vendor ID和product ID,如果他们的值是0xfff0时,那么子系统就会调用这个模块作为设备的驱动。

2. 其他相关宏的定义      

这些宏定义在<linux/module.h>下

1)MODULE_AUTHOR(name) 定义驱动的编程者,name为string

2)MODULE_LICENSE(license) 定义驱动的license,一般为GPL,或相关公司的license

3)MODULE_DESCRIPTION(desc) 对驱动程序的描述,string

4)MODULE_SUPPORTED_DEVICE(name) 驱动程序所支持的设备,string

5)MODULE_PARM(var,type)

提供在运行时通过控制台将参数传递给模块(在insmod时)。如果我们想用这个宏来传递命令行参数,那么在我们的模块中定义一个全局变量.在insmod模块时,便可以用参数的形式,将具体的实参传递给模块中的那个全局变量.

MODULE_PARM(name,type)有两个参数,一个是这个全局变量的名称,另一个是这个全局变量的类型.
而他的类型有一下几种:
b:比特型
h:短整型
i:整型
l:长整型
s:字符串型
在传递字符串型的参数时,这个全局变量需要在模块中用Char *来声明!insmod会自动为其分配内存空间。
例如:
int a = 3;
char *st;
MODULE_PARM(a,”i”);
MODULE_PARM(st,”s”);
在insmod是我们加这样的参数:
insmode a.o “a = 3″, “st = hello world”

这里最重要的是,MODULE_PARM()也支持我们最常用的数组类型。用短线‘-’把两个数字分开,分别表示数组参数中的最小位数和最大位数。例如:
int array[8];
MODULE_PARM(array,”1-8i”);
在命令行我们使用加这样的参数:
insmod a.o “array = 38745,123,4000″ 

在那些模块编程时,我们往往给这些全局变量以默认值,如果我们才insmod时没有传入参数时,模块会使用这些默认值,而如果我们传入参数时,这些默认值便被覆盖掉。

6)MODULE_PARM_DESC(var,desc) 对变量的描述

7)GPL_HEADER()

8)THIS_MODULE 指向全局变量 __this_module (struct module)的指针。

9)系统对每个模块维护一个usage counter,以便决定何时可以安全的卸载模块。

下面的宏用来对该usage counter操作,usage counter可以通过/proc/modules文件查看

MOD_INC_USE_COUNT 

MOD_DEC_USE_COUNT

MOD_IN_USE

MODULE_DEVICE_TABLE

10)EXPORT_SYMTAB 预处理宏,当在程序中用EXPORT_SYMBOL等宏时需要定义该宏。例如,可以在Makefile中定义:-DEXPORT_SYMTAB

 

__EXPORT_SYMBOL(sym,str)

EXPORT_SYMBOL(var)

11)EXPORT_SYMBOL_NOVERS(var) 导出一个符合到内核符号表,导出后,该符合可以供其他模块使用。这个宏有助于编写驱动程序时清楚的划分出层次。可以通过/proc/ksyms文件或ksyms命令查看内核符号表。EXPORT_SYMBOL_NOVERS(var),导出是不带版本信息。在使用该宏时,需定义 EXPORT_SYMBOL_GPL(var)

12)EXPORT_NO_SYMBOLS 显示指出,该模块不向内核符合表导出符号

13)SET_MODULE_OWNER
本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5063532.html,如需转载请自行联系原作者
你可能感兴趣的文章
Riverbed将SD-WAN融入WAN优化
查看>>
信息管税邂逅大数据,加速破解新常态下税收剪刀差
查看>>
从应用角度谈谈初创企业服务器采购建议与解决方案
查看>>
修改CPU 对抗计算机病毒
查看>>
8个方法让你成为更优秀的程序员
查看>>
城市之眼视觉计算技术
查看>>
bd:快速返回某级父目录而不用冗余地输入 “cd ../../..”
查看>>
Wi-FM:借调频无线电信号可大幅提高无线网速
查看>>
IT宕机,和力记易容灾备份能做什么
查看>>
FBI 可能找到了解锁 iPhone 的方法
查看>>
Android用Retrofit 2实现多文件上传实战
查看>>
《C语言课程设计》一1.1 VC 6.0简介
查看>>
警惕新Android木马 涉155个应用280万用户
查看>>
抢滩澳洲布局光伏储能大市场 协鑫集成在下一盘什么棋?
查看>>
思科董事长:法国将成为继美国、以色列、印度之后的另一个创业国度
查看>>
5年内在豫投资超30亿元 重点助力河南智慧城市运营
查看>>
深入浅出事件流处理NEsper(一)
查看>>
云计算时代的运维
查看>>
噪声预测的无监督学习——通往信息最大化的未来
查看>>
处理器利润大跌,联发科学高通卖专利赚钱
查看>>