目的:使用qemu模拟arm A72 soc硬件,实现可以在其上使用gdb调试自己编译的arm64 linux内核(vmlinux),以及在目标板(虚拟)上使用gdb调试arm64程序,熟悉armv8 指令集;
上效果(再也不用担心跟踪内核代码流程了!!!)
其中右边为模拟开发板的运行状态(状态为阻塞调试);
PC系统:ubuntu16.04
需要工具:gcc5.4 qemu5.0 aarch64-linux-gnu-gcc 5.4 gdb8.0 kernel4.14.0 busbox1.31
首先需要安装好 qemu5.0 和 aarch64-linux-gnu-gcc5.4;
ubuntu16 默认的gcc为5.4,不需要额外安装;
qemu可以使用apt-get install qemu ,不需要arm64版本,所以没必要源码编译安装;
aarch64-linux-gnu-gcc5.4 建议官网直接下载,导出路径就行;
由于gdb8.0 kernel4.14.0 busbox1.31 需要运行在arm64上,必须下载源码使用交叉编译工具编译处理
理一下步骤:
1,安装qemu5.0,aarch64-linux-gnu-5.4
2,编译kernel4.14.0,默认配置
3,编译busbox 1.3,制作rootfs
4,使用qemu运行即可
5,使用gdb调试vmlinux
6,编译并移殖gdb8.0到开发板
一,安装qemu5.0,aarch64-linux-gnu-5.4
略过,
二,下载kernel-4.14.0
自从有了码云,下载开源仓代码就在眨眼间!!!另外码云也可以下载github的仓库,速度快到你无法想象!(15M/s)
https://gitee.com/mirrors/linux?_from=gitee_search
点进去在标签选择版本,下载也就几秒钟;
配置
编译工具链
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
默认配置文件
make defconfig
make menuconfig
make -j8
编译的很顺利,一般不会有错误,编译完成即可。
三,编译busbox 1.3,制作rootfs
文件很小,官网可以下载
简单配置编译选项
make menuconfig
Settings -> Build Options -> Build static binary (y to enable)
Networking Utilities -> inetd (n to disable)
编译安装
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 -j8
sudo make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 install
安装完成后在buybox当前目录会生成_install文件夹,将其拷贝到kernel评级目录下,改名为rootfs;
cd rootfs
mkdir sys tmp proc dev etc
mkdir -p etc/init.d
cd /etc/init.d
touch rcS
chmod u+x rcS
在rcS文件添加以下内容:
touch fstab
touch etc/profile
退出到rootfs根目录,制作根文件系统
find . | cpio -o --format=newc > rootfs.img
四,使用qemu运行即可
rootfs,内核就绪,运行虚拟机器
qemu-system-aarch64 -cpu cortex-a72 -machine type=virt -nographic -smp 2 -m 2048M -kernel kernel/arch/arm64/boot/Image -append "root=/dev/ram rdinit=/linuxrc console=ttyAMA0" -initrd rootfs.img -device virtio-scsi-device
虚拟开发板成功启动如上图;
五,使用gdb调试vmlinux
由于内核编译vmlinux的时候,编译器对代码均做了优化处理(减少代码占用空间/增加运行速度)这样就会导致调试的时候,代码看上去并不是单步运行的,需要实现真正意义上的单步,需要修改Makefile将编译优化选项改成-O0(改模块就行,没必要全改),重新编译内核即可;
qemu-system-aarch64 -cpu cortex-a72 -machine type=virt -nographic -smp 2 -m 2048M -kernel kernel/arch/arm64/boot/Image -append "root=/dev/ram rdinit=/linuxrc console=ttyAMA0" -initrd rootfs.img -device virtio-scsi-device -S -s
使用以上命令运行虚拟开发板,此时开发班会阻塞,等待gdb调试;
可以使用编译工具链aarch64-linux-gnu-gdb,开启调试,由于是gdb远程调试,此步骤不涉及在开发板上运行gdb,因此不需要重新编译gdb(也可以自己编译,编译的话不配置CC,默认使用x86_64的gcc),只需要使用x86_64下的交叉编译工具链即可;
aarch64-linux-gnu-gdb kernel/vmlinux 打开gdb并,加载调试符号表等debug信息
target remote:1234 默认使用1234端口开启远程调试
设置断点函数start_kernel
c 运行到断点停止,此时可以单步进行调试;
六,待补充