从 CPU 或其附带的芯片组(例如 Intel PCH)开始,将读/写转换为磁盘涉及哪些硬件组件,它们的作用是什么?
具体来说,我对以下角色感到困惑:
- 主控制器
- 设备控制器
- 主机总线适配器
据我所知:
- 主机控制器:主板上的电路。包括驱动程序与之交互的寄存器级接口。负责将来自其寄存器的请求转换为操作:直接读取/写入连接的设备。例如,USB。也可能包含 DMA 功能。
设备控制器:与主机控制器相同,但存在于外部设备上,例如 HDD 上的磁盘控制器。
主机总线适配器:将外部总线协议转换为内部协议。对软件透明。例如,想要读取/写入通过 SATA 或 Infiniband 连接的外部 HDD 磁盘控制器 HDD 上的寄存器的驱动程序。
那么,通过 USB 连接的外部键盘等设备将如何工作?在软件级别,驱动程序似乎仍在与特定寄存器通信;但是,有 2 个控制器在起作用。
答案1
主控制器,主机总线适配器甚至主机适配器只是同一事物的不同名称(参见维基百科):连接主机(您的 PC)和设备(您的外部硬盘)之间的总线和主机的内部总线(PCIe)的硬件。
因此,对于通过 SATA 的硬盘:
<--------- PC ---------> <------ Harddisk ------>
PC south- SATA host SATA device Device
bridge ---- controller ....... controller ---- SoC
^^ ^^ ^^
PCIe-Bus SATA-Bus Some kind of bus
主机控制器可以存在于主板上,也可以作为单独的卡。PC 可以读取/写入主机控制器的寄存器,或执行 DMA,主机控制器将这些转换为 SATA 总线上的操作(或将 SATA 总线上的操作转换为相应的寄存器值或 DMA 操作)。
从这个意义上讲,像“主机总线适配器”这样对软件透明的东西并不存在,尽管当然可以设计一些模拟另一个设备的设备(例如,USB 棒模拟硬盘,使用与硬盘相同的协议)。
对于通过 USB 连接的键盘,图片相同:
<--------- PC ---------> <------ Keyboard ------>
PC south- USB host USB device Device
bridge ---- controller ....... controller ---- SoC
^^ ^^ ^^
PCIe-Bus USB-Bus Internal bus
虽然这里 USB 设备控制器将与键盘嵌入式控制器集成在单个芯片上,并且总线是内部的,打开键盘时不会看到它。
通常,软件堆栈比您描述的更复杂;在总线协议本身之上还有其他协议甚至协议栈,例如,在基本 USB 协议之上提到的“USB 存储”协议(类似于 SCSI),或在基本 USB 协议之上用于键盘的“USB HID”协议。
答案2
仅限此问题:
那么,通过 USB 连接的外部键盘等设备如何工作?
当设备插入时,Windows 会发出“请确认您的身份”命令,并且要求所有 USB 设备对其做出响应。
Windows 查询其内部数据库以查找驱动程序并配置设备。然后驱动程序接管责任。
即使是一个简单的 USB 键盘也会转储大量信息。注意:它有一个总线号,以及该总线上的设备号,用于识别它连接的位置。
然后它有一个唯一的 ID 号。前 4 位表示哪个制造商生产了该设备,后面是该制造商的唯一设备编号。
Bus 008 Device 003: ID 03f0:0024 Hewlett-Packard KU-0316 Keyboard
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x03f0 Hewlett-Packard
idProduct 0x0024 KU-0316 Keyboard
bcdDevice 3.00
iManufacturer 1 CHICONY
iProduct 2 HP Basic USB Keyboard
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 34
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xa0
(Bus Powered)
Remote Wakeup
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 1 Boot Interface Subclass
bInterfaceProtocol 1 Keyboard
iInterface 0
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.10
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 65
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 10
Device Status: 0x0000
(Bus Powered)