Skip to content

QEMU 测试 ​

QEMU 在没有设备时测试 UniXNU、注入路径、DarwinBoot 和内核入口。

前提 ​

工具用途
qemu-system-aarch64AArch64 虚拟机
AAVMF 或 EDK2 AArch64 固件UEFI 环境
dtc设备树编译
mtools 或 pyfatfs块切片测试的 FAT 镜像

运行器在常见 Homebrew 和发行版路径查找固件,也可以用 --firmware 指定。

准备 ESP ​

sh
python3 package/Scripts/stage-esp.py -o out/esp \
  package/UniXNUPkg/Test/Qemu/esp \
  --put out/<board>/package/Build/Out/UniXNU.efi=EFI/BOOT/BOOTAA64.EFI \
  --put out/<board>/package/Build/Out/HelloPayload.efi=EFI/UniXNU/Payloads/HelloPayload.efi \
  --put out/<board>/package/Build/Out/SampleDriver.efi=EFI/UniXNU/Kits/SampleDriver.kit/SampleDriver.efi

stage-esp.py 复制树,把 .dts 编译为 .dtb,.dtso 编译为 .dtbo,并把每个 --put 文件放到目标位置。

运行 ​

sh
python3 package/Scripts/qemu-run.py out/esp \
  --log out/qemu.log --screenshot out/menu.png \
  --expect 'UNIXNU: menu: shown' \
  --expect 'UNIXNU-HELLO: RESULT PASS'
选项含义
--firmware FILEAAVMF code 镜像
--log FILE串口日志
--screenshot FILE菜单出现时的 PNG
--keys LIST菜单后发送的 QEMU 键码
--expect REGEX必须匹配串口日志
--reject REGEX必须不匹配
--no-gop无显示设备,只用文本控制台
--disk FILE额外只读 raw 磁盘
--timeout SECONDS运行超时
--cpus N虚拟 CPU 数量
--finish-on-expect所有期望匹配后两秒停止
--menu-marker TEXT触发截图和按键的日志标记

运行器通过 QEMU vvfat 只读暴露 ESP,抓取串口日志,并通过 QMP 截图和发送按键。

冒烟测试 ​

sh
JOBS=8 bash package/Scripts/smoke.sh

脚本构建 package 并运行五个场景:

场景检查
默认项设备树补丁、overlay、kit 驱动、initrd、菜单项变量
键盘下和 Enter 选择第二项
降级无 GOP、无配置、内置菜单项、文本控制台
块切片FAT 分区头部的配置,尾部发布为块设备
kext 暂存revision 2 交接、revision 1 拒绝、非法包、重复

日志和截图位于 package/Build/Smoke/。

XNU 入口 fixture ​

QEMU 入口生成器为内核构建 Apple 格式设备树:

sh
python3 scripts/qemu-entry/make-dt.py \
  --armvirt --armcpu --smp 2 \
  --owned-memory-size 0x20000000 \
  --output build/qemu-test.adt
选项含义
--armvirt描述 QEMU virt 设备
--armcpu加入 GICv3 distributor 和 redistributor
--smp NCPU 数量和 PSCI
--owned-memory-sizeDarwinBoot 连续窗口
--data-ramdiskscratch Data 占位符
--trust-cachetrust cache 占位符
--nvram-proxy易失 CHRP NVRAM proxy
--root-match-volume-uuid根卷匹配
--osenvironmentmain、recoveryos 或 ramdisk
--qemu-vmm-present在 /defaults 中报告 VMM
--crypto-hash-methodImage4 哈希方法

生成器描述 QEMU,只使用 QEMU 数值。

HVF ​

Apple Silicon macOS 上 QEMU 可以使用 HVF:

sh
python3 scripts/qemu-entry/make-dt.py --armvirt --armcpu --qemu-vmm-present \
  --qemu-accel hvf --output build/qemu-hvf.adt

生成器读取主机计数器频率作为 CPU timebase。bound fixture 用于在内核停点观察实际 TCR_EL1、SCTLR_EL1 和 TTBR。

停点 ​

sh
python3 scripts/qemu-entry/gdb-stop.py --help

辅助脚本在符号处停住 QEMU,记录寄存器、内存和最后检查点,输出 JSON 报告。

下一步 ​

Released under the BSD-2-Clause-Patent License.