qemu 中文文档 下载 App

全系统模拟 vs 用户态模拟:两种模式的本质区别

快速区分

QEMU 有两种根本不同的运行模式,命令前缀就能看出来:

# 全系统模拟 —— 模拟完整机器,自己跑操作系统
qemu-system-x86_64 -hda disk.img -m 2G

# 用户态模拟 —— 只翻译指令,共享宿主机内核
qemu-aarch64 ./cross-compiled-binary

核心差异一句话概括:全系统模拟 = 模拟一台电脑(有自己的 OS);用户态模拟 = 翻译单个程序的指令(用宿主的 OS)。

全系统模拟(System Emulation)

它做了什么

全系统模拟模式下,QEMU 在软件里模拟一整台物理机器:CPU、内存、主板、显卡、网卡、磁盘控制器、USB 等。Guest 操作系统(比如 Ubuntu、Windows、RTOS)完全不知道自己跑在模拟器里,以为自己在真实硬件上。

启动过程

  1. QEMU 初始化模拟的硬件
  2. 加载固件(SeaBIOS、OVMF/UEFI)
  3. 固件从 CDROM/硬盘引导
  4. 操作系统接管,驱动 QEMU 模拟的硬件
  5. 用户登录,运行应用

什么时候用

典型命令

# 模拟 ARM64 服务器(virt 板)跑 Linux
qemu-system-aarch64 \
  -M virt -m 8G -cpu max \
  -kernel vmlinuz -initrd initrd.img \
  -drive file=rootfs.qcow2,format=qcow2 \
  -append "root=/dev/vda1 console=ttyAMA0" \
  -nographic

# 模拟 x86 的完整 Windows 11
qemu-system-x86_64 \
  -accel kvm -m 16G -smp 4 \
  -bios OVMF_CODE.fd \
  -drive file=win11.qcow2,format=qcow2 \
  -device virtio-gpu-pci -vga none \
  -nic model=virtio-net-pci,netdev=n0 -netdev user,id=n0

用户态模拟(User-mode Emulation)

它做了什么

用户态模拟不模拟硬件。它只做一件事:把 Guest 架构的二进制程序里的每条指令翻译成宿主架构的指令执行。系统调用直接转发给宿主机内核。

启动过程

  1. QEMU 作为宿主上的普通进程启动
  2. 加载目标二进制(ELF 或 PE)
  3. 逐条翻译指令,执行
  4. 遇到 syscall → 宿主内核处理
  5. 程序正常运行

什么时候用

典型命令

# 在 x86_64 主机上跑 ARM64 的 hello world
qemu-aarch64 ./aarch64-hello
# Hello, World!

# 带上库路径
qemu-aarch64 -L /path/to/arm64-rootfs ./my-app

用户态模拟的一个限制是:只能跑 Linux/BSD 用户空间程序,不能跑内核态、不能模拟 BIOS/UEFI、不能跑 Windows 二进制(除非配合 WINE)。

对比总结

维度全系统模拟用户态模拟
模拟范围完整硬件 + 固件 + OS仅 CPU 指令 + syscall
Guest OS需要完整引导不需要,宿主 OS 接管
速度慢(TCG)或快(KVM/HVF)中等(只有指令翻译)
适用场景跨 OS、嵌入式、内核调试、沙箱跨架构程序、逆向、调试
网络有独立网卡,可 user/TAP/桥接共享宿主网络栈
磁盘独立 qcow2 镜像直接访问宿主文件系统

选择建议

两种模式也可以混合用——先用用户态模拟快速验证程序逻辑,再进全系统模拟测试完整硬件路径。