https://zhuanlan.zhihu.com/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 https://download.qemu.org/qemu-5.2.0.tar.xz
tar xvJf qemu-5.2.0.tar.xz
cd qemu-5.2.0
./configure
make && 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-cris          qemu-system-mips64        qemu-system-ppc64le       qemu-system-tricore
qemu-io                   qemu-system-hppa          qemu-system-mips64el      qemu-system-riscv32       qemu-system-unicore32
qemu-make-debian-root     qemu-system-i386          qemu-system-mipsel        qemu-system-riscv64       qemu-system-x86_64
qemu-nbd                  qemu-system-lm32          qemu-system-moxie         qemu-system-s390x         qemu-system-xtensa
qemu-pr-helper            qemu-system-m68k          qemu-system-nios2         qemu-system-sh4           qemu-system-xtensaeb
qemu-system-aarch64       qemu-system-microblaze    qemu-system-or1k          qemu-system-sh4eb
qemu-system-alpha         qemu-system-microblazeel  qemu-system-ppc           qemu-system-sparc
qemu-system-arm           qemu-system-mips          qemu-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 architecture
qemu-efi-aarch64 - UEFI firmware for 64-bit ARM virtual machines
qemu-system-arm - QEMU full system emulation binaries (arm)
cpp-10-aarch64-linux-gnu - GNU C preprocessor
cpp-8-aarch64-linux-gnu - GNU C preprocessor
g++-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-10
mv  /usr/bin/aarch64-linux-gnu-gcc-10  /usr/bin/aarch64-linux-gnu-gcc

编译内核

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

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

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

制作根文件系统

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

mkdir rootfs
git clone https://github.com/mengning/menu.git
cd menu
# 修改Makefile,去掉"find init hello ***"和"qemu -kernel ../linux"语句
cd ../rootfs
cp ../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调试环境相关推荐

  1. Ubuntu 20.04使用qemu搭建ARM64 Linux系统

    1.安装所需依赖 $ sudo apt-get install debian-archive-keyring gcc-aarch64-linux-gnu bison flex bc build-ess ...

  2. QEMU搭建ARM linux开发环境

    qemu可以用来模拟嵌入式的开发板,很多的嵌入式开发技巧完全可以抛开开发板来做实验,甚至可以直接调试驱动.内核调试就更加方便了. 主要参考了:https://www.jianshu.com/p/948 ...

  3. ubuntu虚拟机中使用QEMU搭建ARM64环境

    软件环境: 平台:ubuntu20.04 kernel版本:linux 4.14.221 qemu版本:6.2.92 qemu模拟环境:ARM64 gcc version :9.4.0 交叉编译工具链 ...

  4. Linux学习记录(二)QEMU安装与Linux内核环境搭建

    Linux学习记录(二) 记录本人学习的过程和遇到的问题 QEMU安装与Linux内核环境搭建 Linux学习记录(二) 一.QEMU安装 1.什么是QEMU 2.QEMU安装 二.Linux内核环境 ...

  5. 华山服务器安装linux系统,RHEL7/Centos7下使用QEMU搭建u-boot+Linux+NFS嵌入式开发环境(2018...

    目录 1交叉编译环境搭建 交叉编译器下载链接: 1.1交叉编译器下载 将其下载到/usr目录下并解压. 解压命令: tar -xvf gcc-linaro-7.2.1-2017.11-i686_arm ...

  6. linux 上编译arm64,Arch Linux 搭建 arm64/AArch64 交叉编译环境

    Arch Linux 搭建 arm64/AArch64 交叉编译环境 0. 系统环境 系统: Arch Linux: 成文时间最新 工具版本:Binutils:2.34-1 GCC:9.2.1+202 ...

  7. Ubuntu 上使用 qemu 模拟 Arm64 linux

    Ubuntu 上用 qemu 模拟 Arm64 linux 环境配置 1. 安装Arm64交叉编译工具链 2. 安装qemu 下载源码包 编译 编译Linux kernel 编译qemu 编译busy ...

  8. 搭建 paparazzi uav 调试环境 ppz

    关键字:paparazzi gdb eclipse jlink lisa-m 环境:win7 + ubuntu10(虚拟机) 时隔一年,从mwc转到paparazzi,要crack代码,搭建个方便的调 ...

  9. QEMU启动ARM64 Linux内核

    目录 前言 前置知识 virt开发板 ARM处理器家族简介 安装qemu-system-aarch64 安装交叉编译工具 交叉编译ARM64 Linux内核 交叉编译ARM64 Busybox 使用b ...

最新文章

  1. ASP.NET WebForm中用async/await实现异步
  2. 使用Github Action发布函数到阿里云serverless平台
  3. HTML 4.01 event 事件
  4. SAP Business Application Studio 如何同 SAP BTP CloudFoundry 环境绑定
  5. Redis持久化_Redis事务_Redis删除策略
  6. C语言入门经验:零基础如何学习C语言?
  7. ros(5)service client实现
  8. python如何制作登录密码_python实战系列之模拟用户密码登陆系统(一)
  9. 学习笔记_vnpy实战培训day04
  10. Atiti  attilax主要成果与解决方案与案例rsm版 v4
  11. html禁止查看图片,强看被屏蔽微信朋友圈
  12. Guass消元 poj 1830
  13. codevs 2980 买帽子 题解报告
  14. 论文阅读:Grad-CAM
  15. 计算机上应用锁,电脑怎么设置软件锁
  16. 计算机音乐文本制作,《计算机音乐制作》课程教学大纲
  17. 90后创业:2012教会我的那些事
  18. 华为否认因“子承父业”挤走孙亚芳( 转载)
  19. yiyuan编程电子书系列(目录及种子)
  20. TensorFlow 显存占用率高 GPU利用率低

热门文章

  1. 减轻近视度数的真实有效方法
  2. 电梯控制算法(1)单电梯场景——简单扫描算法
  3. GD32F405RGT6固件库点亮LED
  4. 抖音引流到私域的八大办法,轻松打造流量池
  5. SteamVR 1.x☀️二、实现凝视效果——基于[CameraRig]
  6. 前NASA工程师从3万米高空扔下鸡蛋,没碎
  7. 雅思词汇之万词plan:第2-365天
  8. 金算盘导出oracle,金算盘软件数据导入和导出操作方法.doc
  9. 浅析基于SQL Server PDW大数据解决方案
  10. 10分钟了解啥是数仓