ARM64体系架构与编程实践
- QEMU的作用
- 如何安装QEMU
- 1.下载安装工具和环境
- 实验2-2:GDB调试
现在在学习ARM64体系架构与编程,记录一下学习过程,防止遗忘。
主机:ubuntu20.04
教材:《ARM64体系架构与编程》
QEMU的作用
QEMU 是一款开源的机器模拟器和虚拟化工具。简单说,它能让你在电脑上模拟出另一台完整的电脑,用来运行不同的操作系统,甚至模拟出与你的电脑 CPU 架构完全不同的设备(比如在 x86 电脑上模拟 ARM 环境)。
他主要有两个用途:
- 系统模拟:这是最常用的功能。它能在你的电脑上虚拟出一台完整的电脑(包含虚拟 CPU、内存、硬盘等),用来安装和运行Windows、Linux 等各种系统。如果配合硬件加速(如 Linux 下的 KVM),虚拟机性能可以接近原生速度。
- 用户模式模拟:可以运行那些为其他 CPU 架构编译的程序。比如,在 x86 电脑上直接运行一个为 ARM 架构编译的 Linux 程序。
目前是使用QEMU模拟一个树莓派4B开发板,提供一个等效的软件模拟环境。
ubuntu是一个完整的 Linux 发行版。
qemu它是一个运行在操作系统之上的应用程序。它的作用是“扮演”另一台电脑,比如模拟出一颗 ARM64 处理器和树莓派的硬件。
最底层:你的 Windows 电脑。 中间层:VMware 虚拟机,里面运行着 Ubuntu。这是你的工作台。 上层:在 Ubuntu 里,你运行 QEMU。QEMU 模拟出一台“虚拟树莓派”。 最上层:在 QEMU 模拟的树莓派里,运行你编译的 BenOS 或 Linux 内核。除了用双系统,在可以在windos上安装一个虚拟机,再使用书中提供的镜像包就可快速搭建开发环境。
如何安装QEMU
我是在双系统ubuntu20.04上安装。
1.下载安装工具和环境
1.这个命令是安装一套完整 ARM64 开发启动套件
sudo apt-get install qemu-system-arm libncurses5-dev gcc-aarch64-linux-gnu build-essential git bison flex libssl-dev2.下载书中提供的BenOS的实验代码:
gitclone https://gitee.com/benshushu/arm64_programming_practice.git3.进入实验2-1的开发目录:
cdarm64_programming_practice/chapter_2/lab01_hello_benos/BenOS进入后执行 ls,你应该能看到 Makefile、src 等文件,这才是真正可以编译的 BenOS 代码。
4.编译:
make5.make之后会生成benos.bin可执行文件,然后运行:
qemu-system-aarch64-machineraspi4-nographic-kernelbenos.bin这时肯定会报错:因为提示类似 unsupported machine type 或找不到 raspi4,说明你装的官方 QEMU 版本不支持树莓派 4B。根据书中说明,Ubuntu 20.04 自带的 QEMU 4.2 需要打补丁并重新编译才能模拟树莓派 4B,作者提供的配套虚拟机镜像里才包含这个定制版 QEMU。
但是书中也提供了补丁包:
- qemu-system-arm-pi4_4.1.50-3_without_GIC_amd64.deb 这是定制版 QEMU,用于模拟树莓派 4B。社区记录明确指出,搭建 QEMU 环境需要的就是这个包(以及 OpenOCD)。without_GIC
表示它支持树莓派 4 的 Legacy 中断控制器版本,是实验 2-1、2-2 起步阶段应该先装的版本。 - openocd-benos_1.0-3_amd64.deb OpenOCD 调试工具。实验 2-3(使用 J-Link 调试)会用到它,但你现在做实验 2-1/2-2 暂时用不到。可以先装着备用,或者等做到相关实验时再装。
- qemu-system-arm-pi4_4.2.50-3_with_GIC_amd64.deb 这是带 GIC(通用中断控制器)支持的版本。根据资料,两个 QEMU 包不要同时安装,应该先装 without_GIC
版本,等做到中断相关实验时,再根据课程讲解切换到 with_GIC 版本。你现在还在第二章,远没到中断,所以先别装这个。
6.卸载并清除掉官方版的 qemu-system-arm
sudoapt-getpurge qemu-system-arm7.重新安装定制版QEMU:
sudodpkg-iqemu-system-arm-pi4_4.1.50-3_without_GIC_amd64.deb8.验证安装是否成功
qemu-system-aarch64-machinehelp|grepraspi4如果命令输出了 raspi4,就说明定制版 QEMU 已经成功安装并可以使用了。
9.回到2-1实验路径,
cd~/arm64_programming_practice/chapter_2/lab01_hello_benos/BenOS10.运行
makerun这条命令会调用 Makefile 里封装好的 QEMU 启动命令,等价于:
qemu-system-aarch64-machineraspi4-nographic-kernelbenos.bin如果定制版 QEMU 安装成功,终端里应该直接输出:
Welcome BenOS!到这一步实验2-1就完成了。
ctrl+A,X退出QEMU
aarch64-linux-gnu-gcc ldr_basic.S-oldr_basic--staticqemu-aarch64 ./ldr_basic实验2-2:GDB调试
1.安装GDB
sudoaptinstallgdb-multiarch整个调试过程需要打开两个终端,一个用来运行QEMU(作为被调试的“目标机”),另一个用来运行GDB(作为调试器)。
2.在终端1中,以调试模式启动QEMU
qemu-system-aarch64-machineraspi4-nographic-kernelbenos.elf-S-sbenos.elf文件在build文件夹内。
- -S:让QEMU在启动时暂停,等待GDB发出“继续”的指令,否则BenOS会直接跑完,你来不及调试。
- -s:这是一个简写,等价于 -gdb tcp::1234,意思是在本地的1234端口开启一个GDB调试服务器。
3.打开一个新的终端,同样进入BenOS的实验目录,然后启动GDB并加载 benos.elf:
gdb-multiarch--tuibenos.elf(–tui 选项会开启一个简易的文本用户界面,能同时显示源码/汇编窗口和命令窗口,对调试很有帮助。)
4.进入GDB界面后,它会提示符 (gdb)。现在,输入以下命令来连接刚才启动的QEMU:
target remote localhost:12345.开始调试:
连接成功后,你就可以像调试普通程序一样操作了。一个典型的流程是:
设置断点:在BenOS的入口 _start 处设置一个断点。
b _start继续运行:让程序从暂停处继续执行,它会停在刚才设置的断点处。
c此时,GDB的代码窗口会高亮显示停在 _start 处的代码。终端1里原本卡住的QEMU也会开始输出,但会立刻停在断点位置。
单步执行:从断点处开始,逐条指令执行。你可以使用 s (step) 进入函数,或 n (next) 单步跳过函数调用。
s每执行一步,GDB窗口的代码指示器会移动,终端1里QEMU的串口输出也会相应地一个字符一个字符地打印出 “Welcome BenOS!” 的内容,你可以直观地看到程序是如何一步一步执行的。
查看寄存器:随时可以查看当前所有寄存器的值。
info registers