USB 控制器与设备——OHCI UHCI EHCI xHCI 四种控制器
Bochs 的 USB 模拟能力
| USB 控制器 | USB 版本 | 速率 | bochsrc 关键字 |
|---|---|---|---|
| UHCI(Universal HCI) | USB 1.1 | Full Speed(12 Mbps) | usb_uhci |
| OHCI(Open HCI) | USB 1.1 | Full Speed | usb_ohci |
| EHCI(Enhanced HCI) | USB 2.0 | High Speed(480 Mbps) | usb_ehci |
| xHCI(Extensible HCI) | USB 3.0 | SuperSpeed(5 Gbps) | usb_xhci |
基本配置
最小化开 USB 控制器:
usb: enabled=1
usb_uhci: enabled=1
加上一个 USB 鼠标:
usb_mouse: enabled=1, type=mouse
常用的 USB 设备关键字:
| 关键字 | 设备类型 | 说明 |
|---|---|---|
usb_mouse | USB 鼠标 | 和 Bochs 模拟的 PS/2 鼠标二选一 |
usb_tablet | USB 手写板 | 绝对坐标,比鼠标好用(Windows 7+) |
usb_kbd | USB 键盘 | 和 PS/2 键盘二选一 |
usb_storage | USB 大容量存储 | U 盘、移动硬盘 |
usb_e1000 | USB 网卡 | USB 接口的 E1000 |
什么时候需要开 USB
场景一:Windows 7 及以上
Windows 7 默认不支持 PS/2 设备(虚拟的也行),必须有 USB 鼠标才能正常交互。Bochs 安装 Windows 7/8/10/11 时需要:
usb: enabled=1
usb_ehci: enabled=1
usb_mouse: enabled=1
场景二:OS 开发实验
内核 USB 驱动实验——开 usb_uhci,在调试器里对 UHCI 的 MMIO 寄存器下断点。这是最经典的场景。
场景三:经典系统(DOS / Win95)
不需要 USB——DOS 和 Win95 时代的主板没有 USB 接口。用 PS/2 键盘和鼠标就行,bochsrc 里 mouse: enabled=1 默认是 PS/2。
USB 和 PCI 的关系
Bochs 的 USB 控制器是 PCI 设备——需要插在 PCI 插槽上。bochsrc 里:
pci: enabled=1, chipset=i440fx, slot1=cirrus, slot2=usb_uhci
这样操作系统会在 PCI 枚举阶段发现 USB 控制器并加载驱动。如果只开了 usb_uhci: enabled=1 但没在 PCI 里声明 slot,Bochs 可能会报配置冲突。
UHCI vs OHCI:怎么选
两者都是 USB 1.1 控制器,功能类似但有区别:
| 维度 | UHCI | OHCI |
|---|---|---|
| 发起方 | Intel | 开放规范 |
| 寄存器复杂度 | 较低 | 较低 |
| 内存传输 | 链表式 | 链表式 |
| 推荐 | Intel 主板(经典 PC) | AMD 主板兼容 |
OS 开发学 USB 驱动,选 UHCI 更好——资料多、示例代码丰富,Linux USB 子系统默认优先支持 UHCI。
OS 开发不开 USB
除非你的内核实验主题就是"写 USB 驱动",否则建议不开 USB。原因:
- USB 驱动极其复杂——一个完整的 USB 子系统需要处理控制器初始化、端点管理、传输调度、设备枚举、描述符解析、HID 类驱动……工作量比写整个内存管理器大
- Bochs 的 USB 实现虽然精度可以,但 USB 协议本身的复杂性决定了调试困难
- PS/2 键盘和鼠标在 Bochs 里是"自带"的,不需要额外开——OS 开发用它们就够了
如果需要一个"简单"的输入设备来测试中断处理,PS/2 键盘(IRQ 1)是更好的选择——简单,资料多,大多数内核教学都用它做例子。