![内核模块自动加载](https://linux22.com/image/1101821/%E5%86%85%E6%A0%B8%E6%A8%A1%E5%9D%97%E8%87%AA%E5%8A%A8%E5%8A%A0%E8%BD%BD.png)
当我这样做 rmmod usb_storage
时,dmesg
我可以看到输出显示 usb_storage 已取消注册。但是当我连接闪存驱动器时 dmesg
,它显示
Initializing USB Mass Storage driver...
[16565.129239] scsi41 : usb-storage 1-1:1.0
[16565.130134] usbcore: registered new interface driver usb-storage
[16565.130172] USB Mass Storage support registered.
我不明白它是如何自动加载的?
答案1
在 Linux 内核中,当检测到新设备时,模块加载器会被唤醒。它通过一个“情态动词“字符串,用于标识设备,对于 USB 设备,它看起来像这样:
usb:v058Fp6387d0103dc00dsc00dp00ic08isc06ip50in00
您可以找到您的设备情态动词使用以下命令:
udevadm info --export-db
这是与我的 USB 驱动器相关的部分:
P: /devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0
E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0
E: DEVTYPE=usb_interface
E: DRIVER=usb-storage
E: ID_MODEL_FROM_DATABASE=Flash Drive
E: ID_VENDOR_FROM_DATABASE=Alcor Micro Corp.
E: INTERFACE=8/6/80
E: MODALIAS=usb:v058Fp6387d0103dc00dsc00dp00ic08isc06ip50in00
E: PRODUCT=58f/6387/103
E: SUBSYSTEM=usb
E: TYPE=0/0/0
E: USEC_INITIALIZED=530904794
此字符串包含设备类别(usb)和类别特定信息(供应商/产品/序列号、设备类别等)。每个内核驱动程序都包含一行,例如:
MODULE_ALIAS("usb:...")
必须与 usbalias 匹配(使用通配符来匹配多个设备)。如果 modalias 与驱动程序支持的 modalias 匹配,则加载此驱动程序(或通知新设备,如果新设备已经存在)。
你可以通过以下方式查看支持的设备(按模式)及其相关模块
more /lib/modules/`uname -r`/modules.alias
如果您搜索 usb-storage 设备驱动程序,您会看到它有一些根据供应商和设备 ID 支持的特定设备,并且还会尝试支持具有正确(存储)类别的任何设备,无论供应商/设备如何。