Chinaunix首页 | 论坛 | 博客

apt

  • 博客访问: 392902
  • 博文数量: 121
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-10 15:52
文章分类

全部博文(121)

文章存档

2017年(2)

2016年(23)

2015年(96)

我的朋友

分类: LINUX

2017-02-23 16:19:47

原文地址:MODULE_DEVICE_TABLE宏的作用 作者:wh2010td

1、MODULE_DEVICE_TABLE(mdio, realtek_tbl);
    
该宏定义在文件中,原型为:

点击(此处)折叠或打开

  1. #define MODULE_GENERIC_TABLE(gtype,name)            \
  2. extern const struct gtype##_id __mod_##gtype##_table        \
  3.   __attribute__ ((unused, alias(__stringify(name))))
  4.   
  5. #define MODULE_DEVICE_TABLE(type,name)        \
  6.   MODULE_GENERIC_TABLE(type##_device,name)

    生成一个名为__mod_mdio_device_id_table,内核构建时,depmod程序会在所有模块中搜索符号__mod_mdio_device_id_table,把数据(设备列表)从模块中抽出,添加到映射文件 /lib/modules/KERNEL_VERSION/modules.pcimap 中,当depmod结束之后,所有的MDIO设备连同他们的模块名字都被该文件列出。在需要驱动的时候,由modules.pcimap文件来找寻恰当的驱动程序。
    MODULE_DEVICE_TABLE的第一个参数是设备的类型,如果是PHY设备,那自然是MDIO(如果是PCI设备,那将是pci,这两个子系统用同一个宏来注册所支持的设备)。后面一个参数是设备表,这个设备表的最后一个元素是空的,用于标识结束。ex:
    

点击(此处)折叠或打开

  1. static struct mdio_device_id __maybe_unused realtek_tbl[] = {
  2.     { 0x001cc912, 0x001fffff },
  3.     { }
  4. };

2、其他相关宏的定义

这些宏定义在
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会自动为其分配内存空间。
例如: 

点击(此处)折叠或打开

  1. int a = 3;
  2. char *st;
  3. MODULE_PARM(a,”i”);
  4. MODULE_PARM(st,”s”);

在insmod是我们加这样的参数:

点击(此处)折叠或打开

  1. insmode a.o “a = 3″, “st = hello world”

    这里最重要的是,MODULE_PARM()也支持我们最常用的数组类型。用短线‘-’把两个数字分开,分别表示数组参数中的最小位数和最大位数。例如: 

点击(此处)折叠或打开

  1. int array[8];
  2. MODULE_PARM(array,”1-8i”);

在命令行我们使用加这样的参数: 

点击(此处)折叠或打开

  1. 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
阅读(5384) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~