操作系统如何获取硬件ID

问题描述

我最近阅读了有关 Windows-Driver-Model 的文档,其中一章说:

Before a driver is installed for a new device,the bus or hub driver to which the device is connected assigns a hardware identifier (ID) to the device.

但是怎么样??

例如,操作系统想要与 USB 设备通信。

它(操作系统)如何获取设备的硬件 ID?

是否有某种协议可以与硬件进行通信,如下所示:

  • 操作系统发送一个信号(或 USB 格式的消息),其正文为“我想知道硬件 ID”
  • 硬件必须使用诸如“我的硬件 ID 是 xxx”之类的正文向操作系统响应此消息

如果有这样的协议,请告诉我这种协议的“标准”。

解决方法

在大多数现代计算机上,每个 USB 集线器都连接到一个 xHCI 控制器 (https://wiki.osdev.org/EXtensible_Host_Controller_Interface)。启动时,BIOS 将在 RAM 中构建 ACPI 表,操作系统将在常规位置查找这些表。操作系统找到这些表后,将查看每个条目以确定哪些设备插入了计算机,包括 xHCI 控制器。如 osdev.org 所述

所有 xHCI 控制器的类 ID 为 0x0C,子类 ID 为 0x03,接口值为 0x30。该器件的配置空间将包含两个基地址寄存器:BAR0 和 BAR1。这两个 32 位地址字段结合起来创建了一个 64 位地址,该地址指向控制器的内存映射寄存器的基地址。

然后使用 xHCI 的内存映射寄存器向 USB 设备发送命令,包括获取 USB 设备的设备描述符的命令。 https://www.intel.com/content/dam/www/public/us/en/documents/technical-specifications/extensible-host-controler-interface-usb-xhci.pdf 上的文档是 xHCI 的规范。因此,如果您想真正了解它的工作原理,那么这是一个值得一看的好地方。