在理解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. 设备热插拔时,总线驱动程序会生成热插拔事件。 内核调用/sbin/hotplug设置适当的环境变量;
  3. 给定映射文件和来自环境的信息, /sbin/hotplug决定加载哪个模块并加载它。 如果该模块已经加载,那就OK了。

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

要检查驱动程序是否适用于特定设备,请使用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注册对模块进行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监视器

命令。