2. QEMU 基础与环境搭建

2.1 QEMU 简介

QEMU(Quick EMUlator)是一款开源的、跨平台的系统模拟器与虚拟化方案。它能够模拟完整的计算机系统(包括 CPU、内存、外设、网络接口等),让未经修改的操作系统或固件(如 U-Boot、Linux 内核)在宿主机上运行。在嵌入式开发领域,QEMU 是进行早期软件验证、驱动开发和联合调试的核心工具。

核心定位:QEMU 填补了硬件未就绪时的软件验证空白,允许开发者在纯软件环境中完成 U-Boot 启动、内核加载、设备驱动调试等关键步骤,大幅缩短开发周期。

2.2 主要特性

特性类别 具体描述 典型应用场景
系统级模拟 模拟完整硬件平台(SoC、RAM、存储、外设) 运行 U-Boot、Linux 内核、RTOS
用户态模拟 仅模拟 CPU,直接运行单个可执行文件 交叉编译程序的快速功能测试
多架构支持 支持 ARM、RISC-V、x86、MIPS 等数十种架构 嵌入式多平台开发与验证
GDB 调试接口 通过 -s -S 参数暴露 gdbserver,支持远程调试 U-Boot 单步调试、内核断点设置
快照与恢复 支持保存/恢复虚拟机完整状态 回归测试、故障复现
网络模拟 提供用户模式网络、Tap 桥接等多种网络后端 NFS 根文件系统挂载、网络协议栈调试

2.3 支持的目标架构

QEMU 支持的目标架构覆盖了从嵌入式微控制器到服务器级处理器的广泛范围。下表列出了与嵌入式系统级调试最相关的架构:

架构 QEMU 系统模式命令 常见嵌入式平台 调试关注点
ARM qemu-system-arm Versatile Express, Raspberry Pi, STM32 U-Boot SPL/TPL 启动、内核设备树
AArch64 qemu-system-aarch64 Raspberry Pi 3/4, 树莓派类 SoC 64 位内核调试、TrustZone 模拟
RISC-V qemu-system-riscv32 / qemu-system-riscv64 Virt 板卡, SiFive HiFive Unleashed OpenSBI + U-Boot 启动链
x86_64 qemu-system-x86_64 标准 PC 兼容机 UEFI + GRUB + 内核调试
MIPS qemu-system-mips / qemu-system-mipsel Malta 板卡, 龙芯类平台 Bootloader 与内核地址空间映射
课程选型:本课程后续章节将主要基于 qemu-system-arm(ARM Cortex-A9)和 qemu-system-aarch64 进行演示,这两个架构在嵌入式领域应用最广,且 QEMU 对其模拟成熟度最高。

2.4 QEMU 系统级模拟架构

下图展示了 QEMU 系统级模拟的核心架构,以及它与宿主机、GDB 调试器的关系:

QEMU 系统级模拟架构图 QEMU 系统级模拟架构 宿主机(Linux / Windows / macOS) QEMU 系统模拟进程 模拟硬件平台 CPU 核心 RAM 存储设备 网络接口 外设总线(UART / SPI / I2C / GPIO) 客户软件栈 U-Boot Linux 内核 根文件系统 GDB 远程调试连接(TCP :1234) 通过 -gdb tcp::1234 或 -s 参数启用 宿主机 GDB 客户端

2.5 安装与配置

QEMU 的安装方式因操作系统而异。以下分别介绍在 Linux、Windows 和 macOS 上的安装步骤。

2.5.1 Linux(Ubuntu / Debian 系)

推荐使用包管理器安装,可获得稳定的系统集成支持:

# 更新包索引
sudo apt update

# 安装 QEMU 系统级模拟器(包含 ARM、AArch64、x86_64 等架构)
sudo apt install qemu-system-arm qemu-system-aarch64 qemu-system-x86_64

# 安装 QEMU 用户态模拟器(用于交叉编译程序运行)
sudo apt install qemu-user-static

# 安装辅助工具(如 qemu-img 磁盘映像管理)
sudo apt install qemu-utils
版本检查:安装完成后,运行 qemu-system-arm --version 确认版本。本课程基于 QEMU 7.2.0 及以上版本,建议使用 LTS 发行版(如 Ubuntu 22.04+)自带的 QEMU 包。

2.5.2 Windows

Windows 用户可通过以下两种方式安装:

  • 官方安装包:从 QEMU 官网 下载 Windows 安装程序(.exe),安装后需将 QEMU 安装目录(如 C:\Program Files\qemu)添加到系统 PATH 环境变量。
  • MSYS2 环境:通过 MSYS2 的包管理器安装,便于与 GCC 工具链集成:
# 在 MSYS2 UCRT64 终端中执行
pacman -S mingw-w64-ucrt-x86_64-qemu
Windows 注意事项:Windows 下 QEMU 的串口重定向和网络 Tap 配置与 Linux 有差异。建议在 Windows 上优先使用用户模式网络(-nic user),避免复杂的 Tap 驱动安装。本课程后续调试示例在 Windows 下同样适用,但部分脚本路径需调整为 Windows 格式。

2.5.3 macOS

macOS 用户推荐使用 Homebrew 安装:

# 安装 QEMU(包含所有架构)
brew install qemu

# 验证安装
qemu-system-arm --version
macOS 注意事项:Apple Silicon(M1/M2)Mac 上 QEMU 通过 Rosetta 2 或原生 ARM64 构建运行。建议安装 Homebrew 的 qemu 包,它已针对 ARM64 进行了优化。在 Apple Silicon 上模拟 ARM 架构时,性能表现优于 Intel Mac。

2.6 验证安装:启动最小系统

安装完成后,使用以下命令快速验证 QEMU 能否正常工作。该命令启动一个 ARM Versatile Express 板卡模拟,直接进入 U-Boot 命令行:

# 下载预编译的 U-Boot 镜像(或使用自己编译的)
wget https://github.com/u-boot/u-boot/raw/master/u-boot.bin

# 启动 QEMU,加载 U-Boot
qemu-system-arm \
  -M vexpress-a9 \
  -m 256M \
  -kernel u-boot.bin \
  -nographic \
  -serial mon:stdio

如果终端出现 U-Boot 启动信息并进入 U-Boot> 提示符,说明 QEMU 安装成功,且 U-Boot 能够在模拟环境中正常运行。

参数说明:-M vexpress-a9 指定模拟 ARM Versatile Express Cortex-A9 板卡;-m 256M 分配 256MB 内存;-kernel u-boot.bin 直接加载 U-Boot 二进制文件;-nographic 和 -serial mon:stdio 将串口输出重定向到当前终端。

2.7 环境配置清单

为后续章节的联合调试做好准备,请确保以下工具链和依赖已安装:

组件 用途 验证命令
QEMU 系统模拟器 运行 U-Boot 和内核 qemu-system-arm --version
ARM 交叉编译器 编译 U-Boot 和内核 arm-linux-gnueabihf-gcc --version
GDB 多架构调试器 远程调试客户软件 gdb-multiarch --version
设备树编译器 编译/反编译设备树 dtc --version
mkimage 制作 U-Boot 镜像 mkimage --version
推荐安装:在 Ubuntu 上,可通过 sudo apt install gcc-arm-linux-gnueabihf gdb-multiarch device-tree-compiler u-boot-tools 一次性安装上述工具。macOS 用户可通过 Homebrew 安装 arm-linux-gnueabihf-binutils 和 gdb。

2.8 本章小结