介绍
i440fx是intel在90年代发布的主板芯片组,是比较经典的芯片架构。20世纪初,intel推出了更先进的q35芯片组。QEMU主要支持对i440fx和q35的模拟,使用i440fx作为默认架构。本文简单分析QEMU如何模拟i440fx架构。
模拟一款设备,首先要看它的ds,从i440fx的ds,可以看到它的架构图如下:
可以看到,这是一个经典的南北桥架构。北桥包括PMC和DBX,主要用来连接CPU/内存等。南桥主要是是piix3,用来桥接pci-isa,连接usb,ide等。南北桥通过PCI总线连接。值得注意的是,中断控制器 I/O APIC 是直接连接到CPU的,意味着设备产生的终端可以直接发送给CPU。
查看QEMU的设备结构
bus: main-system-bus
type System
dev: hpet, id ""
gpio-in "" 2
...
dev: ioapic, id ""
gpio-in "" 24
version = 32 (0x20)
mmio 00000000fec00000/0000000000001000
dev: i440FX-pcihost, id ""
pci-hole64-size = 2147483648 (2 GiB)
...
bus: pci.0
type PCI
dev: PIIX4_PM, id "" #设备用于电源管理
smb_io_base = 1792 (0x700)
disable_s3 = 0 (0x0)
...
dev: piix3-ide, id "" #IDE设备的控制器,下面可以挂IDE总线,
addr = 01.1 #IDE总线下面可以挂IDE设备,如硬盘等
romfile = ""
romsize = 4294967295 (0xffffffff)
...
dev: e1000, id ""
mac = "52:54:00:12:34:56"
netdev = "hub0port0"
...
dev: VGA, id ""
vgamem_mb = 16 (0x10)
mmio = true
qemu-extended-regs = true
...
dev: PIIX3, id ""
addr = 01.0
romfile = ""
romsize = 4294967295 (0xffffffff)
...
bus: isa.0
type ISA
dev: port92, id ""
代码分析
首先要把设备注册到QOM。
设备注册是通过DEFINE_I440FX_MACHINE进行的,定义在pc_piix.c里面。这个函数会调用到pc_init1(), 这是虚拟机初始化的核心函数。
pc_init1主要功能有内存计算/CPU初始化/内存初始化/i440fx初始化/中断初始化。
CPU初始化
在开启kvm的情况下,最终会调用到qemu_init_vcpu -> kvm_start_vcpu_thread,为每个vcpu创建一个线程。
i440fx_init
用于对主板初始化。主要实现的功能如下: