QEMU 全局架构与模块速览
一张图看懂 QEMU
QEMU 的架构可以理解为四层:
┌─────────────────────────────────────────┐
│ QEMU Command Line Interface │ ← 用户通过参数控制
├─────────────────────────────────────────┤
│ Device Emulation (virtio, PCI, ...) │ ← 模拟硬件设备
├─────────────────────────────────────────┤
│ CPU Execution Core (TCG / KVM / HVF) │ ← 指令执行引擎
├─────────────────────────────────────────┤
│ Host OS Integration (Linux/Win/Mac) │ ← 与宿主机内核交互
└─────────────────────────────────────────┘
这个分层设计让 QEMU 同时具备灵活性和高性能——设备模拟始终由 QEMU 负责,而指令执行可以选择不同引擎。
指令执行核心:三种引擎
这是 QEMU 架构中最关键的切换点。
TCG(Tiny Code Generator)
纯软件 JIT 翻译器。它把 Guest CPU 指令翻译成宿主 CPU 指令,分两步:
- 前端翻译:Guest 指令 → TCG IR(中间表示)
- 后端代码生成:TCG IR → 宿主机器码(x86/ARM/RISC-V)
TCG 是 QEMU 实现跨架构模拟的核心机制——不管 Guest 是什么架构,最终都翻译成宿主架构的机器码执行。性能上,TCG 模拟通常是原生性能的 10%~30%。
KVM / HVF / WHPX
硬件加速引擎。当 Guest 和 Host 架构相同时(比如 x86_64 主机跑 x86_64 虚拟机),可以跳过 TCG 翻译,直接把 Guest 指令交给 CPU 的硬件虚拟化扩展(VT-x、AMD-V、HVF)执行。
QEMU 在这种模式下的角色变成:设备模拟 + CPU 状态管理。CPU 指令实际由物理核心执行,性能可达原生的 85%~95%。
切换逻辑
QEMU 会根据 -accel 参数决定用哪个引擎:
# 跨架构模拟,只能用 TCG
qemu-system-aarch64 -accel tcg ...
# 同架构加速,优先 KVM
qemu-system-x86_64 -accel kvm ...
# 自动选择:先 KVM 再 HVF 再 WHPX 最后 TCG
qemu-system-x86_64 -accel auto ...
设备模拟:统一模型
无论用哪种指令引擎,设备模拟部分都是 QEMU 自己负责。QEMU 内置了几百种硬件设备的模拟:
- CPU 型号:qemu64、host、max、epyc、aarch64、riscv64 等
- 主板:pc、q35(x86)、virt(ARM/RISC-V)、mach-virt(ARM)
- 磁盘控制器:ide、ahci、scsi、virtio-blk、virtio-scsi
- 网卡:rtl8139、e1000、virtio-net-pci
- 显卡:cirrus、std、virtio-gpu-pci、qxl
- USB 控制器与设备:xhci、ohci、ehci、USB 键盘鼠标
- 串口/并口:用于内核调试
virtio 系列设备是 QEMU 的核心创新——这是一套半虚拟化设备协议,Guest 知道自己跑在 QEMU 里,直接通过共享内存和宿主通信,跳过大量模拟开销。性能接近物理硬件。
QEMU vs 其他模拟器
| 项目 | 架构灵活性 | 性能 | 设备模拟 | 开源 |
|---|---|---|---|---|
| QEMU | 20+ 架构 | 高(加速后)/ 中(TCG) | 完整 | GPL |
| Bochs | x86 仅 | 低 | 完整 | LGPL |
| Box86/Box64 | x86→ARM/RISC-V | 中等 | 仅用户态 | MIT |
| Rosetta 2 | x86→ARM64 | 很高 | 无(用户态) | 闭源 |
Bochs 是纯 x86 模拟器,性能远低于 QEMU TCG;Box86/Box64 只做用户态指令翻译,不模拟完整机器。QEMU 是唯一能覆盖"全架构 + 全系统 + 用户态 + 硬件加速"四大场景的开源方案。
版本与开发节奏
从 3.0 起 QEMU 采用时间版号:每年第一个发布主版本号(3.0、4.0、5.0…),之后按月迭代小版本(4.1、4.2…)。贡献者超过 2000 人,核心维护者约 50 人,社区活跃度极高。