开启你的linux Kernel GDB之旅吧!

Start GDB Your RISCV-Linux-Kernel !

如题,这篇文章可以帮助你搭建Linux Kernel的GDB环境(调试环境),如此这般便可深入Linux 内核,只是内核哦,并不是某个发行版的复杂的软件环境, 我将讲述两种搭建GDB的环境,可以供需要的UU进行调试,下面,我就围绕硬件,内核,需要的软件来开始讲解。

硬件环境 Linux Kernel ON What?

当然使用 qemu-system-riscv64 来做硬件环境啦

  1. 原因1 : 笔者很熟悉RISCV架构,同时RISCV架构确实是一个方便学习,很好入门的架构,
  2. 原因2 :这里并没有说广为流传的X86架构不好,X86由于需要在兼容性上做适配,系统兼容性提高了,自然另一方面就下降了,比如性能,当然这并不是我们学习需要关心的,但是由于历史包袱,对于学习者而言,X86是一个冗余的架构,不够精简,很复杂,经常会做一些多余的事情,比如每次都要从16位开始慢慢加载到32位再加载到64位,硬件上定义的 IDT GDT的结构也很复杂(历史包袱原因)
  3. ON RISCV 的弊端: 学习资料比较少,没有X86那么多, 想要学习的同学可以关注 1.中科院软件所PLCT实验室 2.泰晓科技 3.RISCV官网 【PLCT提供线上实习机会,有兴趣的UU可以试一下】
  4. 不熟悉 RISCV , here is a book for you 非特权架构 特权架构 记得开启PROXY 【如果是初学者 可以在B站搜索相关的架构的讲解视频,有一定基础后 再入手上述两本书籍】

软件环境 Which Kernel and software?

  1. Kernel版本使用的是Linux Kernel 5.10版本
  2. 软件环境是使用busybox 制作的软件环境 【比较精简 但是提供了一些基础的工具】,因为是要Learn Kernel ,所以不用搞复杂的软件环境啦

宿主需要的环境 What do you need to install on your computer ?

  1. qemu-system-riscv64
  2. riscv64-cross-compile 【可选,采用自己编译的方式需要】
  3. gdb-multiarch
  4. git
  5. make

开始GDB之旅

注意事项:笔者的Host为 Ubuntu 22.04 lts , Qemu版本为6.2.0,gdb-multiarch版本为12.1

方式一 【不需要编译,推荐】

  • 更新软件包列表
sudo apt update
  • 下载git
sudo apt install git
  • 下载make工具和GNU工具链
sudo apt install gcc 
sudo apt install make
  • 下载qemu
sudo apt install qemu-system-misc
  • 下载gdb-multiarch
sudo apt install gdb-multiarch
  • 依次打下面的命令,检查是否真正下载成功
git --version
qemu-system-riscv64 --version
gdb-multiarch --version
make   --version
  • 【如果你的SHELL里面没有提示 command not found,出现的是对应的软件版本号,即下载成功】
  • 下载笔者编译过的内核和制作的根文件系统 ,【无需梯子,托管在GITEE上面的】
git clone https://gitee.com/Jer6y/host_ubuntu_gdb_linux_riscv_kernel.git
  • riscv-linux 初体验
cd host_ubuntu_gdb_linux_riscv_kernel
make run

成功后你会看到

如果你想要退出,请按下 ctrl a + x ,不要同时按下哦 ,连续短时间内按下这两个键, 注意:ctrl a是第一次一起按下 x 是第二次按下
如果你想check 目前的硬件状态 可以按下 ctrl a + c ,进入QEMU的管理台界面,然后输入info registers
再次按下 ctral a +c 是退出管理台界面 :注意 ctrl a 是第一次一起按下 c 是第二次按下

  • gdb初体验

使用make gdb ,让qemu开启GDB远程连接模式,在TCP的1234端口处等待连接,【小心如果TCP的1234端口被占用了可能会失败】

make gdb

你可以看到

请保持当前终端开启【不要让终端上启动的QEMU-SYSTEM-RISCV64进程被杀死】

另开一个终端,进入host_ubuntu_gdb_linux_riscv_kernel目录

输入下面指令,调试加载MMU之前的代码

./gdb_phy.sh

如图

进入GDB环境后,可以使用 b _start , 在启动部分打断点,进行调试,注意只能支持加载MMU之前的代码的调试,若想要调试MMU之后的代码执行
下图是在 b _start 后 跳转执行到此处的图片

./gdb_mmu.sh

进入GDB环境后,使用 b start_kernel 在KERNEL启动的部分打断点,注意,此处支持的是MMU之后的代码的调试,真正的启动时刻的代码应该以gdb_phy.sh的调试为准
下图是 b start_kernel 后 跳转到此处的图片

如果想要结束 在gdb 中输入quit 退出调试 但是qemu 任然会正常往下运行 按照之前的描述 退出qemu的运行

【如果对上述GDB初体验不太理解,DON’T WORRY ABOUT IT 可以先去学一下GDB使用RISCV 硬件架构RISCV汇编,若你只是想尝试运行RISCV-LINUX make run 足矣 , 如果你想继续深入在_start 之前的情况,可以去了解OPENSBI固件 ,那可能会解决你读了架构之后,从真正的硬件运行起始状态-> _start 代码断之前干了什么,如果你想调试这段代码,可以自行编译opensbi ,记得GCC 带-g 参数】

1 个赞

快去弄个jh7110板子耍,刚刚拿ft2232给内核gdb也弄出来了,这片子可以期待一下full upstream support,比qemu有意思多了(x