QEMU实现gdb调试(虚拟硬件)arm64 linux内核以及arm64应用程序

目的:使用qemu模拟arm A72 soc硬件,实现可以在其上使用gdb调试自己编译的arm64 linux内核(vmlinux),以及在目标板(虚拟)上使用gdb调试arm64程序,熟悉armv8 指令集;

上效果(再也不用担心跟踪内核代码流程了!!!)

QEMU实现gdb调试(虚拟硬件)arm64 linux内核以及arm64应用程序_第1张图片

其中右边为模拟开发板的运行状态(状态为阻塞调试);

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文件添加以下内容:

 QEMU实现gdb调试(虚拟硬件)arm64 linux内核以及arm64应用程序_第2张图片cd /etc

touch fstab

QEMU实现gdb调试(虚拟硬件)arm64 linux内核以及arm64应用程序_第3张图片

touch etc/profile

QEMU实现gdb调试(虚拟硬件)arm64 linux内核以及arm64应用程序_第4张图片

退出到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

QEMU实现gdb调试(虚拟硬件)arm64 linux内核以及arm64应用程序_第5张图片

QEMU实现gdb调试(虚拟硬件)arm64 linux内核以及arm64应用程序_第6张图片

虚拟开发板成功启动如上图;

五,使用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下的交叉编译工具链即可;

QEMU实现gdb调试(虚拟硬件)arm64 linux内核以及arm64应用程序_第7张图片

aarch64-linux-gnu-gdb kernel/vmlinux 打开gdb并,加载调试符号表等debug信息

target remote:1234 默认使用1234端口开启远程调试

设置断点函数start_kernel

c 运行到断点停止,此时可以单步进行调试;

QEMU实现gdb调试(虚拟硬件)arm64 linux内核以及arm64应用程序_第8张图片

六,待补充

你可能感兴趣的:(嵌入式arm,linux,arm,ubuntu,内核)