USB(通用串行总线)是一种通过外部电缆连接到 PC 的高速总线。外部总线电缆有其自己的通信协议,不使用任何 IRQ、I/O 地址(或其他总线资源)。通信通过数据包进行,类似于互联网,只是有时间片分配,以防止任何一个设备在其他设备需要时占用总线。有空闲时隙,允许每个设备向总线控制器发送短消息,而无需总线上的任何 IRQ。
然而,PC 内部的 USB 总线控制器确实在 PCI 总线(或 ISA)上有一个 IRQ 和一个地址,用于 CPU 和 USB 上的所有设备之间的通信。因此,USB 上的各个设备不需要资源分配。也可以将此视为 USB 上的所有设备共享一个中断和一个地址。如果设备在 USB 上,则它需要一个理解 USB 的驱动程序。
但是,USB 上的每个设备都有 ID,就像 PCI 总线上的卡一样。因此,Linux 很可能维护一个这些 ID 的表,以便设备驱动程序可以检查它们来找到它们的设备。USB 也支持“热插拔”。要找出 USB 总线上有什么,您可以使用通用的硬件检测工具,如“discover”或“hwinfo”。
“热插拔”是指您将某物插入 PC(通常通过电缆连接),它会立即被检测到。如果需要,它会被配置总线资源。它的驱动程序也会启动,可能是通过加载一个模块来启动。为了使这工作,使用的硬件必须设计为支持热插拔。可以热插拔某些 PCI 卡(Cardbus)、USB 设备和 IEEE 1394 设备(火线)。
当检测到新设备时,会读取其寄存器以获取设备的 ID 号。然后为了找到驱动程序,Linux 必须维护一个将 ID 号映射到驱动程序的表。直到内核 2.4 才存在这样的表,因为 Linux 曾经避开集中的 PnP。它被命名为:MODULE_DEVICE_TABLE。
“热更换”是指您移除一个旧设备,然后插入一个新设备来替换旧设备。您已经“更换”了设备。现在除了能够检测到已插入新设备之外,还需要检测到旧设备的移除。
通过电缆连接到串行端口的外部设备(例如外部调制解调器)也可以称为即插即用。由于只有串行端口本身需要总线资源(IRQ 和 I/O 地址),因此无需为这种插件设备分配总线资源。在这种情况下,PnP 仅用于识别调制解调器(读取其型号代码)。如果调制解调器是软件调制解调器 (linmodem) 并且需要特殊驱动程序,这可能很重要。对于此类外部串行设备(连接到串行端口的设备)有一个特殊的 PnP 规范。
Linux 尚不支持此功能吗?对于硬件调制解调器,普通的串行驱动程序可以正常工作,因此几乎不需要使用特殊的串行 PnP 来查找驱动程序。您仍然需要告诉通信程序调制解调器在哪个端口上(例如 /dev/ttyS1)。使用 PnP,您甚至不需要这样做。随着拥有 Linux 驱动程序(linmodem)的软件调制解调器的出现,如果能通过 PnP 自动安装相应的驱动程序,那就太好了。