跳到主要内容

QEMU ARM 速查手册

本文档是 QEMU ARM 系统模拟的快速参考,配合 scripts/qemu-run.sh 脚本使用。


常用命令

查看 QEMU 支持的平台

# ARM64
qemu-system-aarch64 -M help

# ARM32
qemu-system-arm -M help

查看支持的 CPU 类型

qemu-system-aarch64 -cpu help
qemu-system-arm -cpu help

查看支持的设备

qemu-system-aarch64 -device help

直接启动 QEMU(不使用脚本)

# ARM64 virt
qemu-system-aarch64 \
-M virt \
-cpu cortex-a72 \
-m 1G \
-smp 2 \
-kernel Image \
-nographic \
-serial mon:stdio

# ARM32 vexpress
qemu-system-arm \
-M vexpress-a9 \
-cpu cortex-a9 \
-m 512M \
-kernel zImage \
-dtb vexpress-v2p-ca9.dtb \
-nographic \
-serial mon:stdio

QEMU virt machine 硬件规格

ARM64 virt

设备类型内核驱动设备节点/备注
UARTPL011amba-pl011ttyAMA0
RTCPL031arm-pl031
网卡VirtIO-netvirtio_net
存储VirtIO-blkvirtio_blk
GPIOVirtIO-gpiovirtio_gpio
PCIPCIe hostpcie-port
中断GIC v3/v4irq-gic-*
定时器ARMv8 Arch Timerarch_timer

ARM32 vexpress

设备类型内核驱动设备节点
UARTPL011amba-pl011ttyAMA0
以太网LAN9118smsc911xeth0
显示PL111 CLCDpl111fb0
RTCPL031pl031
中断GICirq-gic

内核配置建议

ARM64 defconfig

# 基础配置(包含 VirtIO 支持)
make ARCH=aarch64 defconfig

# 确保 CONFIG_VIRTIO=y
CONFIG_VIRTIO=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_BLK=y
CONFIG_VIRTIO_NET=y
CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y

ARM32 vexpress_defconfig

make ARCH=arm vexpress_defconfig

串口操作

QEMU 串口快捷键

按键功能
Ctrl+A, X退出 QEMU
Ctrl+A, C切换到 QEMU monitor
Ctrl+A, Z查看帮助

在 QEMU monitor 中

(qemu) info version # QEMU 版本
(qemu) info status # 运行状态
(qemu) info cpus # CPU 信息
(qemu) info mem # 内存信息
(qemu) info qtree # 设备树
(qemu) quit # 退出

网络配置

User-mode 网络(默认)

最简单,无需额外配置,但只能从 guest 访问 host,不能反向访问。

# 启用 user-mode 网络
QEMU_NET=on ./scripts/qemu-run.sh run

# 默认端口转发:2222 → 22
# 可在 guest 内使用 ssh 连接 host: ssh -p 2222 user@10.0.2.2

TAP 网络(高级)

需要配置 TAP 设备和 bridge,可以实现完整的双向网络。

# 创建 TAP 设备(需要 root)
sudo ip tuntap add dev tap0 mode tap
sudo ip link set tap0 up

# 添加到 bridge
sudo ip link add br0 type bridge
sudo ip link set br0 up
sudo ip link set tap0 master br0

# 使用 TAP 网络
QEMU_NET=on QEMU_NET_TAP=on QEMU_TAP_IF=tap0 ./scripts/qemu-run.sh run

GDB 调试

启动 QEMU 等待 GDB 连接

qemu-system-aarch64 -M virt -cpu cortex-a72 -kernel Image -s -S
# -s: shorthand for -gdb tcp::1234
# -S: freeze CPU at startup

连接 GDB

aarch64-linux-gnu-gdb vmlinux
(gdb) target remote :1234
(gdb) break start_kernel
(gdb) continue

常用 GDB 命令

(gdb) info registers # 查看寄存器
(gdb) bt # backtrace
(gdb) thread apply all bt # 所有线程的 backtrace
(gdb) x/10i $pc # 查看当前指令
(gdb) disassemble # 反汇编当前函数

内核启动参数

常用参数

参数作用
console=ttyAMA0,115200串口控制台
earlyprintk=serial,ttyAMA0早期串口输出
root=/dev/vda根设备
rootfstype=ext4根文件系统类型
ro只读挂载根
rw读写挂载根
debug启用内核调试输出
quiet减少启动信息
ignore_loglevel忽略日志级别限制

设置方法

# 通过环境变量
QEMU_KERNEL_CMDLINE="console=ttyAMA0 debug" ./scripts/qemu-run.sh run

# 或者修改脚本中的默认值

故障排查

QEMU 启动失败

  1. 检查 QEMU 是否安装

    qemu-system-aarch64 --version
    qemu-system-arm --version
  2. 检查内核镜像是否存在

    ls -lh out/build_latest/arch/arm64/boot/Image
  3. 增加调试输出

    qemu-system-aarch64 -d int,cpu_reset # 显示执行日志

内核启动卡住

  1. 查看最后一条日志 - 确定卡在哪里
  2. 检查 CONFIG_SERIAL_AMBA_PL011_CONSOLE - 是否启用
  3. 尝试更简单的 cmdline - 去掉可能导致问题的参数

设备不工作

  1. 查看设备树

    # 在 QEMU monitor 中
    (qemu) info qtree
  2. 检查内核配置

    # 确保相关驱动已编译
    grep VIRTIO .config

与 Rockchip 硬件的差异

特性QEMU virtRockchip RK3399迁移建议
CPUcortex-a722×A72 + 4×A53SMP 配置模拟多核
串口ttyAMA0ttyS0~4修改 cmdline
网卡virtio-netr8169/fec驱动接口不同
存储virtio-blkdw-mmc/SD需要真实硬件测试
GPIOvirtio-gpiopinctrl-gpio代码结构类似
I2Cvirtio-i2crk-i2c驱动框架相同
电源(无)rk-pm需要真机

学习建议

  • 在 QEMU 中学习内核框架子系统
  • 在真机上测试硬件相关的驱动和 BSP 代码

参考资料