PCI 总线与芯片组——i440fx 经典芯片组配置详解
PCI 总线是什么
真实 PC 上,PCI 总线是连接 CPU 和各种扩展设备(显卡、网卡、声卡、磁盘控制器)的"主干道"。CPU 通过 PCI 配置空间(256 字节/设备)枚举每个 PCI 设备、识别它是什么、分配 I/O 端口和内存窗口。
Bochs 的 PCI 模拟完整实现了 PCI 配置空间枚举、基址寄存器(BAR)解析、INTx/MSI 中断路由。bochsrc 里的 pci: 关键字就是控制这个硬件。
bochsrc 里的 pci 关键字
pci: enabled=1, chipset=i440fx, slot1=cirrus, slot2=usb_uhci
| 字段 | 说明 |
|---|---|
enabled | 是否启用 PCI 总线(1 开 0 关) |
chipset | PCI 芯片组型号 |
slot1 ~ slot6 | 各 PCI 槽位插什么设备 |
芯片组选择
| chipset | 真实硬件 | 适用场景 |
|---|---|---|
i440fx | Intel 440FX + PIIX3(Pentium II/III/4 时代) | 最常用;OS 开发、Win98/XP/Linux |
i440bx | Intel 440BX + PIIX4E(Pentium III) | 比 i440fx 略新 |
piix3 / piix4 | 单独声明 PIIX 南桥 | 极少单独用 |
x58 | Intel X58(Core i7 一代) | 现代系统 |
ivybridge / haswell / skylake / coffee / alderlake | 各代 Core 配套芯片组 | 追求最新特性 |
绝大多数场景选 i440fx。它和 Cirrus VGA、NE2000、USB UHCI、ES1370 等 Bochs 常用 PCI 设备兼容完美,是 Bochs 的"默认配置"。
slot 上能插什么
Bochs 预定义了一批可以插入 PCI 槽的设备:
| slot 值 | 设备 | 总线类型 |
|---|---|---|
cirrus | Cirrus Logic GD5446 VGA | PCI |
s3 | S3 Trio 64 VGA | PCI |
ne2k | PCI 版 NE2000 网卡 | PCI |
e1000 | Intel 82540EM 千兆网卡 | PCI |
usb_uhci | UHCI USB 控制器 | PCI |
usb_ehci | EHCI USB 控制器 | PCI |
usb_xhci | xHCI USB 控制器 | PCI |
es1370 | Ensoniq ES1370 声卡 | PCI |
ahci | AHCI SATA 控制器 | PCI |
sb16 | SB16(PCI 模式) | PCI |
注意 SB16 默认是 ISA 设备(通过 sb16: 关键字声明),但 Bochs 也支持把它插到 PCI 槽上(slot=sb16)。两种方式二选一,不要同时用。
slot0 和 slot1 的特殊地位
Bochs 里 slot0 通常被 PCI Host Bridge(Host-PCI)控制器占用——这是芯片组的北桥功能,bochsrc 不需要显式声明,启用 PCI 后自动存在。slot1 最常用于 VGA——i440fx 的 slot1 是 VGA 槽位的传统位置。
推荐的槽位分配:
slot1=cirrus # VGA(最重要,操作系统最先初始化)
slot2=usb_uhci # USB
slot3=es1370 # 声卡(可选)
slot4=e1000 # 网卡(可选)
# slot5、slot6 留空
PCI 在 OS 开发里的意义
枚举 PCI 设备
OS 内核启动时要枚举所有 PCI 设备——通过 I/O 端口 0xCF8/0xCFC(PCI 配置空间访问机制)。Bochs 调试器里可以观察这个过程:
bochs:1> b 0xcf8 # 在 PCI 地址端口下断点
bochs:2> c # 继续执行
bochs:3> xp 0xcf8 # 查看内核写了什么
每次内核往 0xCF8 写值 → 读 0xCFC → 得到设备 ID,调试器都会停住。这是学习 PCI 配置空间枚举的绝佳方式。
调试 PCI BAR
每个 PCI 设备有 6 个 BAR(Base Address Register)——告诉你它的 I/O 端口地址或内存映射窗口位置。内核通过 PCI 枚举拿到 BAR 值后,才能正确访问设备。
在 Bochs 里,PCI BAR 的分配和真实硬件完全一致。如果你在调试一个自己写的 PCI 设备驱动,Bochs 是一个很好的"虚拟硬件"平台。
bochsrc 完整示例
一个典型的 i440fx 芯片组配置(Windows XP 场景):
pci: enabled=1, chipset=i440fx, slot1=cirrus, slot2=usb_uhci, slot3=e1000
# 对应硬件的配套声明
vga: extension=cirrus, update_freq=5
usb_uhci: enabled=1
usb_mouse: enabled=1
e1000: enabled=1, mac=00:40:3c:00:00:02, ethmod=slirp
OS 开发简化版:
pci: enabled=1, chipset=i440fx, slot1=cirrus
vga: extension=std
# USB、网络、声卡全不开——减少变量
PCI 和 ISA 的关系
Bochs 同时模拟 PCI 和 ISA 总线。ISA 设备(老的声卡、网卡)通过桥接挂在 PCI 的 PIIX3 南桥下——PIIX3 本身就是 PCI 设备的一部分,不需要额外声明。
IRQ 路由是 PCI 和 ISA 交互的重要部分。PCI 设备(INTx 中断)通过 PIIX3 的 IRQ 路由表映射到 8259 PIC 的 IRQ 线。Bochs 正确模拟了这个路由——PCI IRQ 路由表可以通过调试器 info pci 查看。