
摘要本文系统梳理 QEMU 源码的目录结构从顶层目录概览、核心子目录详解、构建系统与辅助目录三个层面展开。重点介绍 target/、tcg/、hw/、softmmu/、include/、qom/ 与 qapi/ 等关键目录的职责划分帮助开发者快速定位代码、理解模块间依赖关系为源码阅读与二次开发打下基础。1. 引言QEMU 是一款功能强大的开源模拟器与虚拟机监控器支持多种 CPU 架构与设备模拟被广泛应用于系统开发、嵌入式调试、云计算与虚拟化测试等场景。对于希望深入理解 QEMU 工作原理、参与二次开发或进行源码阅读的开发者来说熟悉其源码目录结构是第一步。QEMU 的源码规模庞大、模块众多目录组织方式直接反映了其架构设计思路target/承载架构差异tcg/负责动态翻译hw/实现设备模拟softmmu/提供系统级公共逻辑qom/与qapi/则构成对象模型与管理接口。本文将从顶层目录、关键子目录和核心模块三个层面系统梳理 QEMU 源码的组织方式帮助读者建立整体认知为后续的源码阅读与二次开发打下坚实基础。2. 顶层目录概览QEMU 源码根目录下包含多个顶层目录与文件它们各自承担不同的职责。下表列出了主要顶层目录及其作用目录/文件作用accel/加速器相关代码如 KVM、TCG、Hax 等audio/音频后端与音频设备模拟block/块设备层包括块驱动、I/O 调度与快照chardev/字符设备模拟如串口、并口configs/各目标架构的默认配置文件crypto/加密与哈希相关实现disas/反汇编器用于调试输出docs/开发文档与用户手册fsdev/文件系统设备9p相关代码gdb-xml/GDB 远程调试所需的 XML 描述文件hw/硬件设备模拟按总线与设备类型划分include/公共头文件按模块分子目录io/通用 I/O 通道与网络服务框架libdecnumber/十进制浮点运算库linux-headers/Linux 内核头文件副本用于编译migration/虚拟机迁移与快照保存/恢复monitor/QEMU 监视器HMP/QMP实现nbd/NBDNetwork Block Device客户端与服务端net/网络后端与网络设备模拟pc-bios/预编译的固件与 BIOS 镜像plugins/TCG 插件接口与示例python/QEMU 自带的 Python 工具与库qapi/QAPI 定义文件用于生成 QMP 接口qobject/QEMU 对象模型QOM基础数据结构qom/QEMU 对象模型核心实现replay/执行记录与回放record/replayroms/外部固件与 BIOS 源码子模块scripts/构建、测试与辅助脚本scsi/SCSI 子系统相关代码semihosting/半主机semihosting支持slirp/用户态网络协议栈libslirpsoftmmu/系统模式softmmu公共代码storage-daemon/QEMU 存储守护进程入口target/各目标 CPU 架构的翻译与执行逻辑tcg/Tiny Code Generator动态二进制翻译核心tests/单元测试、集成测试与工具测试tools/辅助工具如 qemu-img、qemu-nbdtrace/跟踪trace框架ui/用户界面后端如 GTK、SDL、VNC、SPICEutil/通用工具函数如内存分配、字符串处理3. 核心子目录详解在顶层目录中有几个目录对理解 QEMU 的架构最为关键下面逐一展开说明。3.1 target/CPU 架构支持target/目录按 CPU 架构分子目录每个子目录包含该架构的 CPU 定义、指令翻译规则、系统寄存器模拟等代码。常见的子目录包括target/i386/x86 与 x86-64 架构支持。target/arm/ARM 与 AArch64 架构支持。target/riscv/RISC-V 架构支持。target/loongarch/LoongArch 架构支持。target/mips/MIPS 架构支持。target/ppc/PowerPC 架构支持。每个架构子目录下通常包含cpu.h、helper.c、translate.c等文件分别负责 CPU 状态定义、辅助函数和指令翻译。3.2 tcg/动态二进制翻译核心tcg/是 QEMU 动态翻译引擎的核心负责将目标架构的指令翻译为宿主机可执行的中间代码。其主要子目录包括tcg/i386/、tcg/aarch64/等宿主机后端代码生成。tcg/optimize.c中间代码优化。tcg/tcg.cTCG 核心逻辑包括基本块管理、寄存器分配等。3.3 hw/硬件设备模拟hw/目录按设备类型和总线组织是设备模拟代码的集中地。常见子目录包括hw/arm/、hw/riscv/等特定架构的板级设备。hw/block/块设备如 virtio-blk、NVMe。hw/char/字符设备如串口。hw/net/网络设备如 virtio-net、e1000。hw/pci/PCI 总线与 PCI 设备。hw/virtio/virtio 设备家族。hw/display/显示设备如 VGA、virtio-gpu。3.4 softmmu/系统模式公共代码softmmu/目录包含系统模拟模式下的公共逻辑例如内存管理、中断控制器、设备总线初始化等。它是连接 CPU 核心、设备模拟和监视器的枢纽。3.5 include/公共头文件include/目录存放所有模块共享的头文件其子目录结构与源码目录基本对应。例如include/hw/设备模拟相关头文件。include/qemu/通用工具与数据结构头文件。include/qom/对象模型头文件。include/sysemu/系统模拟相关头文件。3.6 qom/ 与 qapi/对象模型与接口定义qom/实现了 QEMU 对象模型QOM这是设备与对象动态创建、属性访问的基础框架。qapi/则存放 QAPI 模式定义文件用于自动生成 QMPQEMU Machine Protocol的服务器端与客户端代码是外部管理 QEMU 的主要接口。4. 构建系统与辅助目录QEMU 使用 Meson 作为构建系统根目录下的meson.build是构建入口。此外以下几个目录在开发过程中也经常涉及scripts/包含代码格式化、补丁检查、构建辅助等脚本。tests/包含qtest、unit、avocado等测试框架与用例。tools/提供qemu-img、qemu-nbd、qemu-io等命令行工具。docs/包含开发者文档、系统架构说明与用户手册。5. 总结QEMU 的源码目录结构体现了其模块化设计思想target/负责架构差异tcg/负责动态翻译hw/负责设备模拟softmmu/负责系统级公共逻辑qom/与qapi/提供对象模型与管理接口。理解这些目录的职责划分有助于快速定位代码、理解模块间依赖关系并为后续的二次开发打下坚实基础。6. 参考资料以下资料覆盖 QEMU 官方文档、源码仓库以及架构分析类技术文章可作为进一步阅读与深入研究的入口QEMU 官方文档https://www.qemu.org/docs/涵盖系统模拟、用户模式、设备模拟与开发指南等权威说明是查阅目录结构与模块职责的第一手资料。QEMU 源码仓库QEMU / QEMU · GitLab官方主仓库可结合本文目录梳理直接阅读各模块源码验证目录职责划分。QEMU Internals 系列QEMU 官方 WikiMaking sure youre not a bot!从整体架构角度介绍 TCG、设备模拟与系统模式等核心机制有助于理解目录背后的设计动机。《QEMU, a Fast and Portable Dynamic Translator》Fabrice Bellard 论文https://www.usenix.org/legacy/event/usenix05/tech/general/full_papers/bellard/bellard.pdfQEMU 作者关于动态二进制翻译的经典论文是理解 tcg/ 目录设计原理的重要参考。QEMU 架构分析技术博客QEMU 源码分析系列https://www.qemu.org/community/社区博客与邮件列表汇聚了大量源码分析文章可帮助读者从实战角度理解各目录的协作方式。