QEMU环境准备
下载 qemu
# qemu
sudo apt install qemu-system-arm
# gdb
sudo apt install gdb-multiarchsudo apt-get update
sudo apt-get install build-essential zlib1g-dev pkg-config libglib2.0-dev \libpixman-1-dev libfdt-dev ninja-build
下载并自行编译 qemu(可选)
# 克隆 QEMU(支持 TrustZone 的版本) 使用 gitee 镜像
git clone https://gitee.com/openeuler/qemu.git -b v7.2.0sudo apt-get update
sudo apt-get install build-essential zlib1g-dev pkg-config libglib2.0-dev \libpixman-1-dev libfdt-dev ninja-build# 配置时有些submodule无法链接,在gitee找到替代源
./configure --target-list=aarch64-softmmu --enable-debug# 通过.gitmodules确认缺的仓库的目录路径,单独拉子仓库
# dtc
mkdir dtc
cd dtc
git clone https://gitee.com/chuanpen/qemu_dtc.git .
# meson
mkdir meson
cd meson/
git clone https://gitee.com/chuanpen/qemu_meson.git .
# berkeley-softfloat-3
mkdir -p tests/fp/berkeley-softfloat-3
cd tests/fp/berkeley-softfloat-3/
git clone https://gitee.com/chuanpen/qemu_berkeley-softfloat-3.git .
# keycodemapdb
mkdir -p ui/keycodemapdb
cd ui/keycodemapdb/
git clone https://gitee.com/chuanpen/qemu_keycodemapdb.git .# 运行配置命令
./configure --target-list=aarch64-softmmu --enable-debug# 编译qemu
make -j$(nproc)
下载arm-none编译器
进入 https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
选择 AArch64 bare-metal target (aarch64-none-elf)
arm-gnu-toolchain-14.2.rel1-aarch64-aarch64-none-elf.tar.xz
使用qemu先跑个裸机程序练手
创建 arm.s
程序
.section .text.globl _start_start:mov x0, #1 // X0 = 1mov x1, #1 // X1 = 1add x0, x0, x1 // X0 = X0 + X1 (1 + 1 = 2)1: b 1b
使用qemu启动一个裸机汇编程序.bin
# 编译程序,链接地址为 0x40100000
aarch64-none-elf-as arm.s -o arm.o
aarch64-none-elf-ld -nostdlib -Ttext=0x40100000 arm.o -o arm.elf
aarch64-none-elf-objcopy -O binary arm.elf arm.bin
qemu-system-aarch64 -machine virt -cpu cortex-a72 -nographic -device loader,file=arm.bin,addr=0x40100000 -s -S# 起另一个终端,进入gdb
gdb-multiarch
(gdb) set architecture aarch64
(gdb) target remote :1234
# 手动设置PC
(gdb) set $pc = 0x40100000# 查看 0x40100000 地址的指令,确认为 arm.s 的代码
(gdb) x /20i 0x40100000
=> 0x40100000: mov x0, #0x1 // #10x40100004: mov x1, #0x1 // #10x40100008: add x0, x0, x10x4010000c: b 0x4010000c
# 全速运行
(gdb) c
# ctrl+c 暂停,寄存器如下
(gdb) i r
x0 0x2 2
x1 0x1 1
使用qemu启动一个裸机汇编程序.elf
# 编译程序,链接地址为 0x40100000
aarch64-none-elf-as arm.s -o arm.o
aarch64-none-elf-ld -nostdlib -Ttext=0x40100000 arm.o -o arm.elfqemu-system-aarch64 -machine virt -cpu cortex-a72 -nographic -kernel arm.elf -s -S
# 起另一个终端
target remote :1234
# PC被自动设置为 0x40100000
i r
c