对MODULE_DEVICE_TABLE宏的理解

MODULE_DEVICE_TABLE在/linux/module.h文件下面定义,其展开形式为:

#define MODULE_DEVICE_TABLE(type, name)					\
  extern const struct type##_device_id __mod_##type##__##name##_device_table \
  __attribute__ ((unused, alias(__stringify(name))))

type##_device_id中的##表示连接type和_device_id以字符的形式连接。__mod_##type##__##name##_device_table同上。

1、使用MODULE_DEVICE_TABLE实现的功能:定义一个指向设备列表__mod_##type##__##name##_device_tabletype##_device_id的类型。

2、内核构建时,depmod程序会在所有模块中搜索符号,如__mod_usb__id_table_device_table,把数据(设备列表)从模块中抽出,添加到映射文件/lib/modules/KERNEL_VERSION/modules.usbmap中,当depmod结束之后,所有的设备(如USB)连同他们的模块名字都被该文件列出。当内核告知热插拔系统一个新的设备(如USB)被发现时,热插拔系统使用depmod创建的映射文件文件(如modules.usbmap)来找寻找恰当的驱动程序。

注:文件映射是把存储器里面的文件映射到内存空间地址上,操作文件就不再需要打开、操作、关闭这些过程。文件映射可以处理大文件的数据,可用于解决多个进程共享大容量数据处理问题。

注:内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页文件,而且在对该文件进行操作之前必须首先对文件进行映射,就如同将整个文件从磁盘加载到内存

3、设备列表创建和调用过程:

1) 定义一个设备列表(如platform有platform_device_id、pci_device_id、usb_device_id)

2) 调用MODULE_DEVICE_TABLE宏创建一个指向设备列表的变量(因为depmod程序识别的是MODULE_DEVICE_TABLE宏创建出来的type##_device_id格式的变量)

3) 内核构建过程(就是启动过程),自动调用depmod程序查找(查找过程范围就是在depmod加载的对应模块中),但是调用depmod是每个内核自动加载模块都经历的,所以每个驱动模块支持的设备列表就会通过type##_device_id被查找到并在映射文件(如/lib/modules/KERNEL_VERSION/modules.usbmap)中列出设备以及驱动模块名字。

4) 热拔插事件会唤醒热拔插处理程序,热拔插处理程序会到/lib/modules/KERNEL_VERSION/文件下面查找对应的文件,判断设备列表里面的数据与设备是否匹配,匹配则选择该驱动程序。

4、举例

假如设备列表定义了如USB_SKEL_VENDOR_ID是 0xfff0,USB_SKEL_PRODUCT_ID是0xfff0,当有一个设备接到集线器时,热拔插系统就被唤醒,usb子系统就会检查插入设备的 vendor ID和product ID,如果该设备的值和设备列表匹配,那么子系统就会调用这个模块作为设备的驱动。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值