我很难理解MODULE_DEVICE_TABLE(usb, id_table)
的确切用法
AFAIK 这将生成稍后将由modprobe
使用的映射文件,每当插入新设备时,它都会将其与这些映射文件匹配,如果匹配,则会加载模块。
但我的误解是"模块无论如何都没有加载吗?
我的意思是我已经加载了它,当我做insmod module-name
. 还是我错过了什么?
它通常用于支持热插拔,如果尚未加载,则通过加载/插入设备的驱动程序。
这里有一个类似的问题:在Linux中热插拔时检测设备是否存在
(来自我的安斯)
它的工作原理如下:
-
代码中的每个驱动程序使用以下方法公开其供应商/设备 ID:
MODULE_DEVICE_TABLE(of, omap_mcspi_of_match);
-
在编译时,生成过程从所有驱动程序中提取此信息并准备设备表。
-
插入设备时,内核会引用设备表,如果找到与添加设备的设备/供应商 ID 匹配的条目,则会加载并初始化其模块。
根据Linux设备驱动程序:
-
MODULE_DEVICE_TABLE
用于通过depmod
程序生成地图文件;
当设备热插拔 - 时,总线驱动程序会生成热插拔事件。内核调用
/sbin/hotplug
设置了适当的环境变量; - 给定来自环境的映射文件和信息,
/sbin/hotplug
决定加载哪个模块并实际加载它。如果模块已加载,则没关系。
我应该再次提到,这种机制只是确保在插入设备时所需的模块就位。这不会将模块与该设备或其他任何东西链接。只需加载模块。
要检查驱动程序是否适用于特定设备,请使用bus_type
中的match()
功能。
以下是我对事物的理解[Xbuntu 14.04兼容]。
编写模块后,我们可以手动或自动加载它。
- 手动 ->
insmod
modulename.ko 或modprob
modulename.ko -
自动> 有多种方法。
-
复制到/lib/modules/'uname -r'/kernel/modulename.ko 并更新
/etc/modules
。系统将在引导时加载模块。 -
编写脚本/命令以加载 module.ko
udev
规则/etc/udev/rules.d/10-local.rules
中的特定 harwareadd
/change
/remove
事件。您可以使用此方法执行加载/卸载。 - 使用
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 监视器
命令。