失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > QEMU搭建arm64 Linux调试环境

QEMU搭建arm64 Linux调试环境

时间:2023-08-23 03:15:46

相关推荐

QEMU搭建arm64 Linux调试环境

/p/345232459

简述

本文记录了在ubuntu20.04上,使用QEMU搭建arm64 的Linux开发调试环境。可以方便得使用gdb调试内核,既可以作为学习linux kernel源码的实验环境,也可以用于ARM64内核驱动开发调试环境。

版本和环境信息如下:

平台:ubuntu20.04

kernel版本:linux 5.10

qemu版本:5.2.0

qemu模拟环境:ARM64

gcc version :10.2.0

交叉编译工具链:aarch64-linux-gnu-

编译安装QEMU

QEMU是一套由法布里斯·贝拉(Fabrice Bellard)所编写的以GPL许可证分发源码的模拟处理器,在GNU/Linux平台上使用广泛。本文搭建的是gdbserver+主机gdb远程调试的环境,这里QEMU仿真器就扮演了gdbserver角色。这里选择用QEMU模拟ARM cortex-a53平台,可以使用参数"-machine help"查看QEMU支持哪些CPU,使用参数"-device help"查看支持哪些device。

安装QEMU,有两种方式,源码安装和命令行安装:

1. 源码安装

sudo wget /qemu-5.2.0.tar.xztar xvJf qemu-5.2.0.tar.xzcd qemu-5.2.0./configuremake && make install

ubuntu上需要安装的依赖,可参考《QEMU编译指南》一文。

如果只需要安装一种平台的QEMU,可以通过configure配置如下:

./configure –target-list=aarch64-softmmu

2. 命令行安装

ubuntu20.04源提供相对比较高的QEMU版本,可以选择命令行直接安装。对于比较老旧的发行版,建议选择源码安装。

apt-get install qemu qemu-system qemu-user

安装完成后,可以通过Tab键补全检查安装好的qemu 工具:"qemu-system-"

root@ubuntu20_04:# qemu-qemu-img qemu-system-crisqemu-system-mips64 qemu-system-ppc64le qemu-system-tricoreqemu-io qemu-system-hppaqemu-system-mips64elqemu-system-riscv32 qemu-system-unicore32qemu-make-debian-rootqemu-system-i386qemu-system-mipsel qemu-system-riscv64 qemu-system-x86_64qemu-nbd qemu-system-lm32qemu-system-moxie qemu-system-s390x qemu-system-xtensaqemu-pr-helper qemu-system-m68kqemu-system-nios2 qemu-system-sh4 qemu-system-xtensaebqemu-system-aarch64 qemu-system-microblaze qemu-system-or1kqemu-system-sh4eb qemu-system-alpha qemu-system-microblazeel qemu-system-ppc qemu-system-sparc qemu-system-arm qemu-system-mipsqemu-system-ppc64 qemu-system-sparc64

qemu-system-aarch64就是我们要使用的,用于模拟ARM64平台的qemu工具。

安装aarch64交叉编译工具

可以通过命令"apt-cache search aarch64" 查看系统源中有哪些安装包可供安装:

... ...gcc-9-aarch64-linux-gnu-base - GCC, the GNU Compiler Collection (base package)gcc-aarch64-linux-gnu - GNU C compiler for the arm64 architectureqemu-efi-aarch64 - UEFI firmware for 64-bit ARM virtual machinesqemu-system-arm - QEMU full system emulation binaries (arm)cpp-10-aarch64-linux-gnu - GNU C preprocessorcpp-8-aarch64-linux-gnu - GNU C preprocessorg++-10-aarch64-linux-gnu - GNU C++ compiler (cross compiler for arm64 architecture)g++-8-aarch64-linux-gnu - GNU C++ compiler (cross compiler for arm64 architecture)gcc-10-aarch64-linux-gnu - GNU C compiler (cross compiler for arm64 architecture)gcc-10-aarch64-linux-gnu-base - GCC, the GNU Compiler Collection (base package)gcc-10-plugin-dev-aarch64-linux-gnu - Files for GNU GCC plugin development.gcc-8-aarch64-linux-gnu - GNU C compiler (cross compiler for arm64 architecture)... ...

笔者选择"gcc-10-aarch64-linux-gnu"进行安装:

sudo apt-get install gcc-10-aarch64-linux-gnu# 为方便使用可以软连接或者重命名aarch64-linux-gnu-gcc-10mv /usr/bin/aarch64-linux-gnu-gcc-10 /usr/bin/aarch64-linux-gnu-gcc

编译内核

笔者使用的是linux 5.10源码,大家可以按照需求下载具体的内核源码。配置编译过程如下:

export ARCH=arm64export CROSS_COPILE=aarch64-linux-gnu-make defconfig#如果需要可以在此 配置initramfs路径为"/tmp/rootfs/xxx"# 记得勾选上"Compile the kernel with debug info",以及其他自己调试需要的配置选项make menuconfigmake -j8 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

在arch/arm64/boot/ 下检查生成的内核,其中"Image"为非压缩版,"Image.gz"为压缩内核,并包含了自解压程序。

制作根文件系统

可以根据自己需要制定rootfs,可以选择ramdisk、initramfs等格式,这里不再赘述。笔者是为了学习调试内核启动过程,因此使用"menu"制作一个极简的rootfs镜像:

mkdir rootfsgit clone /mengning/menu.gitcd menu# 修改Makefile,去掉"find init hello ***"和"qemu -kernel ../linux"语句cd ../rootfscp ../menu/init ./find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img

rootfs.img就是接下来要使用的根文件系统镜像。

启动测试

启动测试QEMU环境,通过gdb remote功能,链接QEMU并调试内核。有一点需要注意,由于我们调试的是ARM64模拟环境,需要使用"gdb-multiarch"而不是ubuntu自带的gdb工具,如果系统没有可以通过下面命令安装:

sudo apt-get install gdb-multiarch

QEMU工具参数众多,本文只使用必备的几个基础参数,读者可以根据自己的需求和环境情况组合参数。示例如下:

在一个窗口输入启动QEMU:

# 在一个窗口输入启动qemu-system-aarch64 -M virt -cpu cortex-a53 -smp 2 -m 4096M -kernel /tmp/arch/arm64/boot/Image.gz -nographic -append "console=ttyAMA0 init=/linuxrc ignore_loglevel" -initrd /tmp/rootfs/rootfs.img -S -gdb tcp::9000

关于qemu-system-aarch64的几个参数解释如下:

-smp 核数目-m 物理内存大小-kernel 内核压缩镜像位置-initrd rootfs位置-nographic 不使用图形界面,不加可能会因为无法启动图形界面而失败-append cmdline启动参数-S 在入口处阻塞CPU-gdb tcp::xxxx 指定通信通道为 本地tcp通道(因为是在同一个机器上),端口号为xxxx,如果不需要指定端口号可以用-s 代替

新开一个窗口启动gdb并链接:

# 新开一个窗口启动gdb并链接gdb-multiarch /tmp/linux5.10/vmlinux(gdb)target remote :9000(gdb)break start_kernel(gdb)continue(gdb)step

在"target remote :9000"成功后,即可使用gdb对另一端的内核进行单步调试。下面粘贴下实际操作的结果图:

图1 gdb 链接启动的本地QEMU

结尾

本文在ubuntu20.04上搭建了调试ARM64平台的QEMU环境,可以方便得使用gdb调试内核,是内核开发调试中一种经典的工具组合。不同的发行版可能存在细微差异,总体流程是一样的,hope it works for you ~

如果觉得《QEMU搭建arm64 Linux调试环境》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。