Start GDB Your RISCV-Linux-Kernel !
如题,这篇文章可以帮助你搭建Linux Kernel的GDB环境(调试环境),如此这般便可深入Linux 内核,只是内核哦,并不是某个发行版的复杂的软件环境, 我将讲述两种搭建GDB的环境,可以供需要的UU进行调试,下面,我就围绕硬件,内核,需要的软件来开始讲解。
硬件环境 Linux Kernel ON What?
当然使用 qemu-system-riscv64 来做硬件环境啦
- 原因1 : 笔者很熟悉RISCV架构,同时RISCV架构确实是一个方便学习,很好入门的架构,
- 原因2 :这里并没有说广为流传的X86架构不好,X86由于需要在兼容性上做适配,系统兼容性提高了,自然另一方面就下降了,比如性能,当然这并不是我们学习需要关心的,但是由于历史包袱,对于学习者而言,X86是一个冗余的架构,不够精简,很复杂,经常会做一些多余的事情,比如每次都要从16位开始慢慢加载到32位再加载到64位,硬件上定义的 IDT GDT的结构也很复杂(历史包袱原因)
- ON RISCV 的弊端: 学习资料比较少,没有X86那么多, 想要学习的同学可以关注 1.中科院软件所PLCT实验室 2.泰晓科技 3.RISCV官网 【PLCT提供线上实习机会,有兴趣的UU可以试一下】
- 不熟悉 RISCV , here is a book for you 非特权架构 特权架构 记得开启PROXY 【如果是初学者 可以在B站搜索相关的架构的讲解视频,有一定基础后 再入手上述两本书籍】
软件环境 Which Kernel and software?
- Kernel版本使用的是Linux Kernel 5.10版本
- 软件环境是使用busybox 制作的软件环境 【比较精简 但是提供了一些基础的工具】,因为是要Learn Kernel ,所以不用搞复杂的软件环境啦
宿主需要的环境 What do you need to install on your computer ?
- qemu-system-riscv64
- riscv64-cross-compile 【可选,采用自己编译的方式需要】
- gdb-multiarch
- git
- 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 参数】