QEMU支持的架构非常少,在Q35出现之前,就只有诞生于1996年的i440FX + PIIX一个架构在苦苦支撑。一方面是Intel不断推出新的芯片组,搞出了PCIe、AHCI等等新东西。i440FX已经无法满足需求,为此在 KVM Forum 2012 上Jason Baron带来了PPT:A New Chipset For Qemu - Intel's Q35。Q35是Intel在2007年6月推出的芯片组,最吸引人的就是其支持PCI-e。
根据Intel Q35文档,Q35的拓扑结构如图所示:
可见其北桥为MCH,南桥为ICH9。CPU 通过 前端总线(FSB) 连接到 北桥(MCH),北桥为内存、PCIE等提供接入,同时连接到南桥(ICH9)。南桥为 USB / PCIE / SATA 等提供接入。
Q35 拓扑结构
那么在QEMU中实现的Q35拓扑结构是否真的如上图所示呢?我们在 QEMU 中通过 info qtree 查询,简化后的结构为:
(qemu) info qtree
bus: main-system-bus
dev: hpet, id ""
gpio-in "" 2
gpio-out "" 1
gpio-out "sysbus-irq" 32
dev: ioapic, id ""
gpio-in "" 24
version = 32 (0x20)
dev: q35-pcihost, id ""
bus: pcie.0
type PCIE
dev: e1000, id ""
dev: VGA, id ""
dev: ICH9 SMB, id ""
dev: ich9-ahci, id ""
bus: ide.5
type IDE
bus: ide.4
type IDE
bus: ide.3
type IDE
bus: ide.2
type IDE
dev: ide-cd, id ""
bus: ide.1
type IDE
bus: ide.0
type IDE
dev: ide-hd, id ""
drive = "ide0-hd0"
dev: ICH9-LPC, id ""
gpio-out "gsi" 24
bus: isa.0
type ISA
dev: i8257, id ""
dev: i8257, id ""
dev: port92, id ""
gpio-out "a20" 1
dev: vmmouse, id ""
dev: vmport, id ""
dev: i8042, id ""
gpio-out "a20" 1
dev: isa-parallel, id ""
dev: isa-serial, id ""
dev: isa-pcspk, id ""
iobase = 97 (0x61)
dev: isa-pit, id ""
gpio-in "" 1
gpio-out "" 1
dev: mc146818rtc, id ""
gpio-out "" 1
dev: isa-i8259, id ""
gpio-in "" 8
gpio-out "" 1
master = false
dev: isa-i8259, id ""
gpio-in "" 8
gpio-out "" 1
master = true
dev: mch, id ""
dev: fw_cfg_io, id ""
dev: kvmclock, id ""
dev: kvmvapic, id ""
注意dev和bus是交替出现的,更加简化的设备图如下:
bus dev bus dev bus dev
main-system-bus - ioapic
- q35-pcihost - pcie.0 - mch
- ICH9-LPC - isa.0 - isa-i8259
- ICH9 SMB
- ich9-ahci
- VGA
- e1000
- ...
由于对硬件和架构的不熟悉,这里反反复复研究了一天才有点眉目。我的理解如下:
main-system-bus 就是系统总线,ioapic直接连到系统总线上,符合我们对IOAPIC的认知,在q35架构图CPU为 Core 和 Pentium Pentium E2000 系列,而根据文档,Intel自从Pentium4/Xeon后就取消了APIC bus,换用系统总线。
但让我纠结的是,mch为什么会连到 pcie.0 上ÿ