我很难理解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
决定加载哪个模块并加载它。 如果该模块已经加载,那就OK了。 我应该再次提到,这种机制只是确保当设备插入时所需的模块就位。 这不会链接模块与该设备或其他任何东西。 只需加载模块。
要检查驱动程序是否适用于特定设备,请使用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
特定的harware add
/ change
/ remove
事件。 你可以使用这个方法来加载/卸载。
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监视器
命令。