代码库
本节介绍 QEMU 的各个组成部分及代码库的组织方式。 除了简要说明,也提供指向相关文档和源码的链接。
以下两个视频是了解代码库的良好入口:
子系统
完整子系统及关联文件列表见 MAINTAINERS。
主要子系统包括:
更多子系统文档见 内部子系统信息。
目录导览
下面简要介绍源码顶层各目录的内容。
目录名链接指向 GitLab 仓库中的对应目录。 其他链接指向已有的更详细子系统文档。 并非所有子系统都有文档,部分情况下只能直接阅读源码。
accel: QEMU 各种 加速器 (TCG、KVM、hvf、whpx、xen、nvmm、mshv) 相关基础设施和架构无关代码,包含需要各 目标架构 实现的操作接口。
audio: 主机音频支持。
backends: 访问主机资源的各种后端,例如随机数生成、内存支持和密码学功能。
build: 默认构建输出位置,也可以要求构建系统使用其他任意位置。
chardev: 字符设备使用的各种后端。
common-user: 处理系统调用期间信号的用户模式汇编代码。
configs: 定义 QEMU 构建配置的 Makefile。
contrib: 社区贡献的设备、插件和工具。
crypto: QEMU 使用的密码学算法。
disas: 目标架构代码使用的反汇编函数。
docs: QEMU 文档。
dump: 转储运行中虚拟机内存的代码。
ebpf: eBPF 程序支持,virtio-net RSS 使用它。
fpu: 浮点软件模拟。
host: 各架构专用头文件,包括密码学、原子操作和内存操作。
linux-headers: 从 Linux 内核导入的部分头文件,用于 KVM 和用户模式实现。
linux-user: 用户模式 实现,每个目标架构有独立子目录。
.gitlab-ci.d: 持续集成 的 YAML 和脚本。
include: 各子系统头文件,目录层级对应源码的组织和命名。
libdecnumber: 从 GCC 导入的库,用于十进制算术。
nbd: QEMU NBD(网络块设备)服务器。
net: 主机网络支持。
pc-bios: 预构建固件和启动镜像,无需编译即可在 QEMU 中使用。
po: 翻译文件。
python: 构建和测试系统中的 Python 部分。
qobject: QEMU Object 实现。
roms: 各种固件和 ROM 的源码,需要定制或新版时可以自行编译。
rust: QEMU 的 Rust 集成,包含新定义的接口和使用它们的设备。
scripts: 构建、测试脚本,以及处理 QEMU 代码库和执行跟踪的各种工具。
scsi: SCSI 设备使用的支持代码。
semihosting: QEMU 半主机 实现。
storage-daemon: QEMU 存储守护进程 实现。
stubs: 用于特定配置构建的各种桩函数,即空函数。
subprojects: 构建系统使用的 QEMU 子模块。
target: 全部受支持目标架构的代码,每个架构一个子目录,其中包含各加速器的架构专用实现。
-
data: 各种测试数据。
decode: decodetree 实现的测试套件。
fp: QEMU 软件浮点实现的测试套件。
functional: 功能测试,完整启动虚拟机。
lcitool: 为 CI 容器生成 Dockerfile。
multiboot: 测试 x86_64/i386 的 multiboot 功能。
qapi-schema: QAPI 的测试脚本和数据。
uefi-test-tools: UEFI 支持测试工具。
ui: QEMU 用户界面。
util: 供 QEMU 其他部分使用的辅助代码。