利用qemu+gdb在ubuntu下搭建调试kernel的环境
编译内核
修改配置文件
本文使用的内核为linux-5.3.8,以下命令在源码根目录下执行.
生成针对x86_64架构
的配置文件:
如果编译时所处的平台架构为x86,则无需添加ARCH=x86_64
选择需要编译的x86_64架构
的内核相应功能:
如果编译时所处的平台架构为x86,则无需添加ARCH=x86_64
在出现的UI界面中选择:
Kernel-hacking
-> Compile-time checks and compiler options
选择Compile the kernel with debug info
条目(按Y键)
然后会出现该条目下的子条目,在子条目中
选择Provide GDB scripts for kernel debugging
(按Y键)
如果Reduce debugging information
是开着的,就在Reduce debugging information
上按N键取消该条目.
选择最下面的Exit退出,系统会提示你是否保存到配置文件,点YES.
编译
make -j4
其中4为你为本次编译提供的物理核心数,核心越多,编译越快.
编译完成会生成2个很重要的文件,一个为arch/x86/boot/
路径下的bzImage
,另一个是源码根目录下的vmlinux
.
利用qemu运行编译生成的内核
安装qemu
利用qemu运行之前编译生成的内核
在kernel源码根目录运行运行以下命令:
会出现的现象是,kernel起初正常运行,但是在与文件系统的交互时出了问题,最后terminal中显示:
这是正常的,因为还我们还没有制作挂载在qemu虚拟系统中的文件系统镜像
.
制作文件系统
制作文件系统的方法有2种,使用的工具分别为busybox
和buildroot
,使用busybox
需要我们自行创建部分文件,生成的是最小文件系统; 而使用buildroot
只需要编译,缺点是编译时间太久.
用busybox制作文件系统
这里使用busybox建立一个最小文件系统
编译busybox
在这里下载busybox源码,以busybox1.25.0为例,逐行执行以下命令
在menuconfig跳出的UI界面中依次选择
-> Busybox settings
-> Build Options
对选项Build BusyBox as a static binary (no shared libs)
按Y键使之开头出现星号.
如果安装成功可以在Busybox源码根目录中看到_install目录.
生成initrd
使用以下命令将_install
文件夹复制到其它位置
使用以下命令建立初始化进程init.
使用以下命令设置开机启动程序
init程序首先会访问etc/inittab文件,以获取开机要启动的程序列表,因此我们得编写一个inittab
将以下内容填入inittab
赋予inittab可执行权限
可以看到inittab中最先执行的是rcS,因此我们要建立一个rcS
将以下内容填入rcS
赋予rcS可执行权限
rcS中,mount -a 是自动挂载 /etc/fstab 中的内容,因此我们需要一个fstab文件,以设置需要挂载的系统.
fstab的内容如下
最小文件系统完成! 将其压缩成文件镜像即可.
最后生成的initramfs.img
就是我们的根文件系统.
用buildroot制作文件系统
获取buildroot源码并设置配置文件
- 在跳出的UI界面依次选择
Target options
Target Architecture (x86_64)
在x86_64
上按空格键,以选择该选项
- 再返回与
Target options
同一级的界面
选择Filesystem images
在ext2/3/4 root filesystem
按Y,并进入ext2/3/4 variant (ext4)
选择ext4
退出并保存配置.
编译buildroot
编译完成之后,在buildroot/output/images/目录中可以获得文件系统镜像rootfs.ext2
和rootfs.ext4
运行qemu和gdb调试kernel
我们有2种文件系统,用哪一种都行.
第一种: 使用rootfs.ext2
作为文件系统运行qemu
如果需要调试内核的kvm模块,则向上述命令添加 -enable-kvm
第二种:使用initramfs.img
作为文件系统运行qemu
如果需要调试内核的kvm模块,则向上述命令添加 -enable-kvm
__EOF__

本文链接:https://www.cnblogs.com/haiyonghao/p/14440249.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律