bochs 中文文档 下载 App

USB 控制器与设备——OHCI UHCI EHCI xHCI 四种控制器

Bochs 的 USB 模拟能力

USB 控制器USB 版本速率bochsrc 关键字
UHCI(Universal HCI)USB 1.1Full Speed(12 Mbps)usb_uhci
OHCI(Open HCI)USB 1.1Full Speedusb_ohci
EHCI(Enhanced HCI)USB 2.0High Speed(480 Mbps)usb_ehci
xHCI(Extensible HCI)USB 3.0SuperSpeed(5 Gbps)usb_xhci

基本配置

最小化开 USB 控制器:

usb: enabled=1
usb_uhci: enabled=1

加上一个 USB 鼠标:

usb_mouse: enabled=1, type=mouse

常用的 USB 设备关键字:

关键字设备类型说明
usb_mouseUSB 鼠标和 Bochs 模拟的 PS/2 鼠标二选一
usb_tabletUSB 手写板绝对坐标,比鼠标好用(Windows 7+)
usb_kbdUSB 键盘和 PS/2 键盘二选一
usb_storageUSB 大容量存储U 盘、移动硬盘
usb_e1000USB 网卡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 控制器,功能类似但有区别:

维度UHCIOHCI
发起方Intel开放规范
寄存器复杂度较低较低
内存传输链表式链表式
推荐Intel 主板(经典 PC)AMD 主板兼容

OS 开发学 USB 驱动,选 UHCI 更好——资料多、示例代码丰富,Linux USB 子系统默认优先支持 UHCI。

OS 开发不开 USB

除非你的内核实验主题就是"写 USB 驱动",否则建议不开 USB。原因:

  1. USB 驱动极其复杂——一个完整的 USB 子系统需要处理控制器初始化、端点管理、传输调度、设备枚举、描述符解析、HID 类驱动……工作量比写整个内存管理器大
  2. Bochs 的 USB 实现虽然精度可以,但 USB 协议本身的复杂性决定了调试困难
  3. PS/2 键盘和鼠标在 Bochs 里是"自带"的,不需要额外开——OS 开发用它们就够了

如果需要一个"简单"的输入设备来测试中断处理,PS/2 键盘(IRQ 1)是更好的选择——简单,资料多,大多数内核教学都用它做例子。