QEMU系统级模拟:ARM64开发环境与设备树配置实战 - 第2节
2.1 QEMU 的架构:前端与后端分离设计
QEMU 采用经典的前端/后端(Frontend/Backend)分离架构,这是其能够支持多种目标架构与多种执行模式的核心原因。前端负责处理与目标 CPU 架构相关的指令翻译与模拟,后端则负责与宿主机硬件交互的执行引擎与设备模拟。
核心概念: 前端决定 QEMU “能模拟什么 CPU”,后端决定 QEMU “在什么宿主机上运行以及如何执行”。
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 内核的启动日志,最终因找不到根文件系统而挂起(这是预期的行为)。
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。
课程准备检查清单:
- ✅ 已安装
qemu-system-aarch64并验证版本。 - ✅ 已安装
dtc设备树编译器。 - ✅ 已下载 ARM64 测试内核(可选,用于快速验证)。
- ✅ 确认宿主机支持 KVM 加速(推荐,非必须)。