很难理解MODULE_DEVICE_TABLE(USB,id_table)的使用情况



我很难理解MODULE_DEVICE_TABLE(usb, id_table)的确切用法

AFAIK 这将生成稍后将由modprobe使用的映射文件,每当插入新设备时,它都会将其与这些映射文件匹配,如果匹配,则会加载模块。

但我的误解是"模块无论如何都没有加载吗?

我的意思是我已经加载了它,当我做insmod module-name. 还是我错过了什么?

它通常用于支持热插拔,如果尚未加载,则通过加载/插入设备的驱动程序。

这里有一个类似的问题:在Linux中热插拔时检测设备是否存在

(来自我的安斯)

它的工作原理如下:

  1. 代码中的每个驱动程序使用以下方法公开其供应商/设备 ID:

      MODULE_DEVICE_TABLE(of, omap_mcspi_of_match);
    
  2. 在编译时,生成过程从所有驱动程序中提取此信息并准备设备表。

  3. 插入设备时,内核会引用设备表,如果找到与添加设备的设备/供应商 ID 匹配的条目,则会加载并初始化其模块。

根据Linux设备驱动程序:

  1. MODULE_DEVICE_TABLE用于通过depmod程序生成地图文件;
  2. 当设备热插拔
  3. 时,总线驱动程序会生成热插拔事件。内核调用/sbin/hotplug设置了适当的环境变量;
  4. 给定来自环境的映射文件和信息,/sbin/hotplug决定加载哪个模块并实际加载它。如果模块已加载,则没关系。

我应该再次提到,这种机制只是确保在插入设备时所需的模块就位。这不会将模块与该设备或其他任何东西链接。只需加载模块。

要检查驱动程序是否适用于特定设备,请使用bus_type中的match()功能。

以下是我对事物的理解[Xbuntu 14.04兼容]。

编写模块后,我们可以手动或自动加载它。

  • 手动 -> insmod modulename.ko 或modprob modulename.ko
  • 自动> 有多种方法。

    1. 复制到/lib/modules/'uname -r'/kernel/modulename.ko 并更新/etc/modules。系统将在引导时加载模块。

    2. 编写脚本/命令以加载 module.ko udev规则/etc/udev/rules.d/10-local.rules中的特定 harware add/change/remove 事件。您可以使用此方法执行加载/卸载。

    3. 使用MODULE_DEVICE_TABLE注册对模块进行编码。然后加载一次 modulename.ko 并运行depmod命令 [ sudo depmod -a ] 将新模块添加到/lib/modules/3.16.0-34-generic/modules.alias /lib/modules/3.16.0-34-generic/modules.dep文件中。据我所知,只有在模块未加载时,系统才会加载。

您可以使用 udev 事件通过以下方式监控模块加载/卸载:

Udevadm 监视器

命令。

相关内容

  • 没有找到相关文章

最新更新