bochs 中文文档 下载 App

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 关)
chipsetPCI 芯片组型号
slot1 ~ slot6各 PCI 槽位插什么设备

芯片组选择

chipset真实硬件适用场景
i440fxIntel 440FX + PIIX3(Pentium II/III/4 时代)最常用;OS 开发、Win98/XP/Linux
i440bxIntel 440BX + PIIX4E(Pentium III)比 i440fx 略新
piix3 / piix4单独声明 PIIX 南桥极少单独用
x58Intel X58(Core i7 一代)现代系统
ivybridge / haswell / skylake / coffee / alderlake各代 Core 配套芯片组追求最新特性

绝大多数场景选 i440fx。它和 Cirrus VGA、NE2000、USB UHCI、ES1370 等 Bochs 常用 PCI 设备兼容完美,是 Bochs 的"默认配置"。

slot 上能插什么

Bochs 预定义了一批可以插入 PCI 槽的设备:

slot 值设备总线类型
cirrusCirrus Logic GD5446 VGAPCI
s3S3 Trio 64 VGAPCI
ne2kPCI 版 NE2000 网卡PCI
e1000Intel 82540EM 千兆网卡PCI
usb_uhciUHCI USB 控制器PCI
usb_ehciEHCI USB 控制器PCI
usb_xhcixHCI USB 控制器PCI
es1370Ensoniq ES1370 声卡PCI
ahciAHCI SATA 控制器PCI
sb16SB16(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 查看。