显然,从这个问题来看,USB 核心是否有一个数组或类似的东西(可能是链接列表),其中存储了所有类驱动程序的信息和 HCD 的信息(名称或某种数字),以便在插入设备时检查并分配所需的信息?
答案1
在 Linux 内核中,当检测到新设备时,模块加载器会被唤醒。它通过一个“情态动词“字符串,用于标识设备,对于 USB 设备,它看起来像这样:
usb:v058Fp6387d0103dc00dsc00dp00ic08isc06ip50in00
您可以找到您的设备情态动词(和 HCD 驱动程序)使用以下命令:
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 支持的特定设备,并且还会尝试支持具有正确(存储)类别的任何设备,无论供应商/设备如何。
USB 模式可以像这样解码:
usb:
v vendor_id (4 hex)
p product_id (4 hex)
d revision (4 hex)
dc class (2 hex)
dsc subclass (2 hex)
dp protocol (2 hex)
ic interface_class (2 hex)
isc interface_subclass (2 hex)
ip interface_protocol (2 hex)
答案2
文件
/var/lib/usbutils/usb.ids
A list of all known USB ID’s (vendors, products, classes,
subclasses and protocols).
仅当存在 USB 设备时该文件才会出现。