QEMU系统级模拟:ARM64开发环境与设备树配置实战 - 第2节

2.1 QEMU 的架构:前端与后端分离设计

QEMU 采用经典的前端/后端(Frontend/Backend)分离架构,这是其能够支持多种目标架构与多种执行模式的核心原因。前端负责处理与目标 CPU 架构相关的指令翻译与模拟,后端则负责与宿主机硬件交互的执行引擎与设备模拟。

核心概念: 前端决定 QEMU “能模拟什么 CPU”,后端决定 QEMU “在什么宿主机上运行以及如何执行”。
QEMU 前端/后端分离架构 前端(Frontend) 目标架构指令翻译 CPU 指令解码器(Decode) TCG 中间代码生成(TCG IR) 目标寄存器与内存模型 支持:ARM64 / x86 / RISC-V / MIPS 后端(Backend) 宿主机执行引擎与设备模拟 TCG 代码生成(Host Code Gen) 加速器接口(KVM / HVF / WHPX) 设备模型(VirtIO / 模拟设备) 宿主机:Linux / macOS / Windows 翻译

2.1.1 前端(Frontend)职责

  • 指令解码: 读取目标架构(如 ARM64)的二进制指令,解析操作码与操作数。
  • TCG 中间表示: 将目标指令翻译为 QEMU 内部的 Tiny Code Generator(TCG)中间代码,这是一种与架构无关的 RISC 风格微操作。
  • 寄存器与内存模型: 维护目标 CPU 的寄存器状态和内存地址空间映射。

2.1.2 后端(Backend)职责

  • 宿主机代码生成: 将 TCG 中间代码编译为宿主机(如 x86_64)的机器码,实现动态二进制翻译。
  • 硬件加速接口: 当宿主机支持虚拟化扩展时,通过 KVM(Linux)、HVF(macOS)或 WHPX(Windows)将部分指令直接交给硬件执行。
  • 设备模拟: 提供 VirtIO 半虚拟化设备或全模拟设备(如 UART、GPIO、SDHCI)。
实战提示: 在 ARM64 开发环境中,前端负责模拟 ARMv8-A 指令集,后端则利用 x86 宿主机上的 KVM 加速,实现接近原生的执行效率。

2.2 支持的目标架构概览

QEMU 是目前支持目标架构最全面的模拟器之一。下表列出与嵌入式开发密切相关的核心架构及其典型应用场景。

目标架构 QEMU 系统模式名称 典型应用场景 支持级别
ARM64 (AArch64) qemu-system-aarch64 嵌入式 Linux 开发、Android 模拟、服务器虚拟化 完整
ARM (32-bit) qemu-system-arm 单片机裸机开发、RTOS 调试、IoT 设备模拟 完整
RISC-V (64/32) qemu-system-riscv64 开源处理器验证、嵌入式 Linux 移植 完整
x86_64 qemu-system-x86_64 通用虚拟化、云原生开发、内核调试 完整
MIPS (64/32) qemu-system-mips64 网络设备模拟、旧嵌入式系统维护 维护
Renesas RX qemu-system-rx 工业 MCU 模拟、电机控制开发 实验性
注意: 本课程聚焦于 qemu-system-aarch64,但 QEMU 的设备树(Device Tree)配置方法在不同架构间高度通用,学习 ARM64 后可以轻松迁移到 RISC-V 或 ARM32 平台。

2.3 在 Ubuntu/Debian 系统上安装 QEMU for ARM64

以下安装步骤适用于 Ubuntu 20.04 LTS 及以上版本、Debian 11 (Bullseye) 及以上版本。我们推荐使用系统包管理器安装稳定版,如需最新特性可编译源码。

2.3.1 方法一:使用 APT 包管理器安装(推荐)

这是最快捷的方式,QEMU 官方维护的软件包已经过充分测试。

# 更新软件包索引
sudo apt update

# 安装 QEMU 系统级模拟器(包含所有架构)
sudo apt install qemu-system

# 验证安装,查看 ARM64 模拟器版本
qemu-system-aarch64 --version

安装完成后,可以使用以下命令查看 QEMU 支持的 ARM64 机器类型:

qemu-system-aarch64 -M help

输出中会列出 virt(通用虚拟平台)、raspi3b(树莓派 3B)、sbsa-ref(服务器参考平台)等机器类型。

2.3.2 方法二:编译源码安装(获取最新特性)

当需要最新的设备支持或自定义编译选项时,推荐从源码编译。

# 安装编译依赖
sudo apt install build-essential git libglib2.0-dev libfdt-dev \
                 libpixman-1-dev zlib1g-dev ninja-build

# 克隆 QEMU 源码(以 v8.2.0 稳定版为例)
git clone https://gitlab.com/qemu-project/qemu.git -b stable-8.2
cd qemu

# 配置编译选项,仅编译 ARM64 目标以节省时间
./configure --target-list=aarch64-softmmu --enable-kvm

# 编译(使用多核加速)
make -j$(nproc)

# 安装到系统路径
sudo make install
关键参数说明:
  • --target-list=aarch64-softmmu:只编译 ARM64 系统级模拟器,大幅缩短编译时间。
  • --enable-kvm:启用 KVM 加速支持,宿主机需为 Linux 且 CPU 支持虚拟化。

2.3.3 安装验证与测试

安装完成后,执行以下命令验证 QEMU 能否正常启动 ARM64 虚拟机:

# 下载 ARM64 测试内核(以 Linux 内核的 virt 测试镜像为例)
wget https://github.com/0xAX/linux-insides/raw/master/linux-bootstrap/linux/arch/arm64/boot/Image

# 使用 QEMU 启动(无根文件系统,仅验证模拟器运行)
qemu-system-aarch64 -M virt -cpu cortex-a57 -kernel Image -nographic

如果 QEMU 安装正确,终端会显示 Linux 内核的启动日志,最终因找不到根文件系统而挂起(这是预期的行为)。

QEMU for ARM64 安装与验证流程 步骤 1 安装 QEMU 包 步骤 2 验证模拟器版本 步骤 3 查看机器类型 步骤 4 启动测试内核验证 💡 提示:步骤 4 使用无根文件系统启动,仅用于验证 QEMU 模拟器能否正确加载并执行 ARM64 内核

2.4 安装后的关键文件与工具

安装完成后,系统中会包含以下与 ARM64 开发直接相关的工具和文件:

工具/文件 路径(典型) 用途
qemu-system-aarch64 /usr/bin/qemu-system-aarch64 ARM64 系统级模拟器主程序
qemu-img /usr/bin/qemu-img 磁盘镜像创建与格式转换工具
qemu-efi-aarch64 /usr/share/qemu-efi-aarch64/ ARM64 UEFI 固件(用于启动标准 Linux 发行版)
dtc(设备树编译器) /usr/bin/dtc 编译/反编译设备树源文件(.dts ↔ .dtb)
扩展安装: 如果缺少 dtc 工具,可通过 sudo apt install device-tree-compiler 单独安装。本课程后续章节将大量使用该工具进行设备树调试。

2.5 常见安装问题与解决

  • 问题: qemu-system-aarch64 命令未找到。
    解决: 确认是否安装了 qemu-system 包,或使用 apt list --installed | grep qemu 检查已安装组件。
  • 问题: 编译源码时提示 glib-2.0 版本过低。
    解决: Ubuntu 20.04 用户需添加 ppa:ubuntu-toolchain-r/test 或升级系统。
  • 问题: KVM 加速无法启用,启动时提示 kvm: No such device。
    解决: 检查 BIOS 中是否开启虚拟化(VT-x/AMD-V),并确认当前用户属于 kvm 组:sudo usermod -aG kvm $USER。
课程准备检查清单:
  1. ✅ 已安装 qemu-system-aarch64 并验证版本。
  2. ✅ 已安装 dtc 设备树编译器。
  3. ✅ 已下载 ARM64 测试内核(可选,用于快速验证)。
  4. ✅ 确认宿主机支持 KVM 加速(推荐,非必须)。