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

sil*_*hts 20 linux linux-device-driver linux-kernel

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

AFAIK这将生成将在以后modprobe插入新设备时使用的映射文件,它将与这些映射文件匹配并在模块匹配时加载模块.

但我的误解是"不是模块加载了吗?"

我的意思是我已经装好了insmod module-name.还是我错过了什么?

bro*_*oot 22

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

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

(来自我的ans)

它的工作原理如下:

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

      MODULE_DEVICE_TABLE(of, omap_mcspi_of_match);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在编译时,构建过程从所有驱动程序中提取此信息并准备设备表.

  3. 当插入该装置时,设备表是由内核称为,并且如果发现了一个条目相匹配的添加的装置的装置/供应商ID,那么它的模块被加载并初始化.

  • 不,没有.负荷=插入.插入模块有两种方法:1.手动使用(insmod/modprobe),2.自动通过内核 - "热插拔"(内核从设备表中找到设备驱动程序后执行insmod/modprobe). (4认同)
  • 如果驱动程序已经是`insmod`d,那么当你插入设备时就不会调用`module_init`,如果驱动程序还不是'insmod`d,内核将insmod驱动程序.换句话说,当内核热插拔时,`kernel`也会调用`insmod driver.ko`.`insmod`一个已经``insmod`的驱动程序不会引起任何问题,它只是表示已经插入驱动程序的警告. (2认同)

Ale*_*lko 11

根据Linux设备驱动程序:

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

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

要检查特定设备的驱动程序是否正常,请使用match()function from bus_type.


Cha*_*ara 7

这是我理解事物的方式[Xbuntu 14.04兼容].

编写模块后,我们可以手动加载,也可以自动加载.

  • 手动 - > insmodmodulename.ko或modprobmodulename.ko
  • 自动 - >有多种方式.

    1. 复制到/ lib/modules /`uname -r`/kernel/modulename.ko并更新/etc/modules.系统将在启动时加载模块.

    2. 写一个脚本/命令加载module.ko一个特定harware add/ change/ remove在一个活动udev规则/etc/udev/rules.d/10-local.rules.您可以使用此方法进行加载/卸载.

    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监视器

命令.

  • 稍微修正一下:要将新模块添加到modules.alias,您不需要加载模块,而只需在运行“depmod”之前将其放置在“/lib/module/\`uname -r\”/kernel”中-a` (2认同)
  • 最好将其放在 `/lib/module/`uname -r`/extra` 中。 (2认同)