QEMU模拟ARM裸机实验
一、概述
- Ubuntu上安装QEMU
- Ubuntu上安装GNU交叉编译GCC工具链
- 编写简单汇编源代码,编译链接生成可执行文件,生成ARM裸机可执行二进制文件
- 启动QEMU模拟ARM裸机执行二进制文件
二、QEMU安装
- 系统环境: Ubuntu22.04
- QEMU版本: 10.2.0
- QEMU源码下载地址: https://www.qemu.org/download/#source
下载源码
wget https://download.qemu.org/qemu-10.2.0-rc4.tar.xz
tar xvJf qemu-10.2.0-rc4.tar.xz
cd qemu-10.2.0-rc4
指定安装目录
./configure --prefix /usr/local/bin/
编译
make -j4
安装
make install
配置环境变量
vim ~/.bashrcexport PATH=$PATH:/usr/local/bin/source ~/.bashrc
检查安装
qemu-system-arm --version
QEMU emulator version 10.1.94
Copyright (c) 2003-2025 Fabrice Bellard and the QEMU Project developers
三、GNU交叉编译GCC安装
- 系统环境: Ubuntu22.04
- ARM GCC版本: 15.2
- ARM GCC下载地址: https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
下载工具
wget https://developer.arm.com/-/media/Files/downloads/gnu/15.2.rel1/binrel/arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi.tar.xz
选择存放路径
sudo mkdir -p /usr/local/arm-none-gnu-toolchain
tar xvjf arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi.tar.xz -C /usr/local/arm-none-gnu-toolchain
配置环境变量
vim ~/.bashrcexport PATH=$PATH:/usr/local/arm-none-gnu-toolchain/arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi/binsource ~/.bashrc
检查安装
arm-none-eabi-gcc --version
arm-none-eabi-gcc (Arm GNU Toolchain 15.2.Rel1 (Build arm-15.86)) 15.2.1 20251203
Copyright (C) 2025 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
四、简单汇编程序
1 源代码
编写汇编源代码文件1.s
.text.global _start_start: mov r0, #10mov r1, #32add r2, r0, r1sub r3, r1, r0mov r4, #0loop: b loop.end
2 汇编
arm-none-eabi-as -g -mcpu=arm9e -o 1.o 1.s
-mcpu: 指定目标cpu系列,用于限制使用对应指令集- ARM9E 是 ARM9 系列的一类CPU类别
- 基于 ARMv5TE 架构
- 增加 增强 DSP 指令(E)
- 支持 ARM + Thumb 指令
- CPU 型号:ARM926EJ-S、ARM946E-S 等属于 ARM9E 系列
- ARM9E 是 ARM9 系列的一类CPU类别
3 链接
arm-none-eabi-ld -Ttext=0x00 -o 1.elf 1.o
-Ttext: 指定.text段在物理内存的起始地址
4 格式转换
arm-none-eabi-objcopy -O binary 1.elf 1.bin
-O binary: 输出格式为二进制
五、QEMU模拟CPU执行程序
sudo qemu-system-arm \ -M none \ -cpu arm926 \ -nographic \ -device loader,file=1.bin,addr=0x00 \ -m 128 \ -S -s
-M none: 不选择开发板,仅模拟CPU和RAM-cpu arm926: 选择模拟CPU模型- QEMU 会模拟 ARM926EJ-S 这一款 ARM 内核
-nographic: 无图形化界面,使用终端-device loader,file=1.bin,addr=0x00:-device: 选择使用设备loader: 一种虚拟设备,用于把任意二进制文件直接加载到模拟RAMfile: 指定二进制文件路径addr: 指定加载到RAM地址
-m 128: 分配可用RAM大小- 默认单位 MB(兆字节)
-S: 上电后暂停-s: 开启GDB远程调试端口(tcp:1234)- 等价于
-gdb tcp::1234
- 等价于
六、GDB调试
启动GDB调试工具,打开待调试可执行文件
arm-none-eabi-gdb 1.elf
连接QEMU中gdb调试服务
(gdb) target remote:1234
- QEMU 执行的实际上是 内存里的 bin,GDB 用 ELF 提供符号解析,桥接地址和源代码
查看寄存器状态
(gdb) info registers
单步执行
(gdb) stepi