怎么使用cgdb + qemu调试linux内核模块

本篇内容主要讲解“怎么使用cgdb + qemu调试linux内核模块”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用cgdb + qemu调试linux内核模块”吧!

如何使用cgdb + qemu调试linux内核模块前言

Linux 代码庞大而繁杂,光看代码会使人头晕目眩,如果能通过调试工具对其代码执行流程进行调试,则对学习Linux kernel以及解决平时遇到的问题会大有帮助。本文将讲解如何使用cgdb + qemu的方式调试Linux内核代码,所使用的测试机操作系统版本是CentOS Linux release 7.2.1511 (Core)

1.编译额内核1) 获取内核代码

内核代码下载地址:[ https://www.kernel.org/] ( https://www.kernel.org/),本文以4.9.153版本作为演示. 如下图,点击对应版本的 tarball 链接下载

怎么使用cgdb + qemu调试linux内核模块

下载完成后将tar文件拷贝到测试机/root目录并进行解压。

# cd /root # tar xf linux-4.9.153.tar.xz2) 编译出支持调试的内核配置编译选项# cd linux-4.9.153 # make menuconfig

定位到Enable loadable module support:

怎么使用cgdb + qemu调试linux内核模块

按空格键去掉选项Module signature verification,防止加载模块时如下报错:
module verification failed: signature and/or required key missing - tainting kernel

怎么使用cgdb + qemu调试linux内核模块

定位到Exit按钮,回到上级菜单。

定位到File systems, 按回车键:

怎么使用cgdb + qemu调试linux内核模块

选中EXT4 debugging support 和 JBD2 (ext4) debugging support 两项:

怎么使用cgdb + qemu调试linux内核模块

定位到Exit按钮,回到上级菜单。

定位到Kernel hacking,按回车键:

怎么使用cgdb + qemu调试linux内核模块

定位到Kernel debugging,按空格键选中。

怎么使用cgdb + qemu调试linux内核模块

定位到Compile-time checks and compiler options, 按回车键。

怎么使用cgdb + qemu调试linux内核模块

分别定位到 Compile the kernel with debug info 和 Provide GDB scripts for kernel debugging , 并按空格键选中。

怎么使用cgdb + qemu调试linux内核模块

保存,退出

怎么使用cgdb + qemu调试linux内核模块

怎么使用cgdb + qemu调试linux内核模块

怎么使用cgdb + qemu调试linux内核模块

开始编译make -j 30

-j 30 表示并行编译的CPU核数

2.构建initramfs根文件系统

这里借助Busybox构建极简initramfs提供基本的用户态可执行程序.

1) 编译Busybox

[下载busybox-1.28.0] ( https://busybox.net/downloads/busybox-1.28.0.tar.bz2),并拷贝到测试机/root目录下解压。

配置CONFIG_STATIC参数,可编译出静态版Busybox, 使Busybox的可执行文件不依赖动态库,方便构建initramfs

# cd /root/busybox-1.28.0 # make menuconfig

选择Settings, 按回车。

怎么使用cgdb + qemu调试linux内核模块

选择Build static binary (no shared libs), 按回车。

怎么使用cgdb + qemu调试linux内核模块

退出,提示保存,选Yes

开始编译

# yum install glibc-static -y # gcc --version   gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4) # make -j 30 # make install2) 创建initramfs

创建initramfs, 其中包含BusyBox可执行程序,必要的设备文件,启动脚本init和需要调试的模块。在init脚本里只挂载了虚拟文件系统procfs和sysfs,没有挂载磁盘根文件系统,所有调试操作都在内存中进行,不会读写磁盘。本例中使用ext4.ko模块作为演示,所以需要将ext4.ko及其依赖模块一起放到initramfs。

# mkdir initramfs # cd initramfs # cp ../_install/* -rf ./ # mkdir dev proc sys # sudo cp -a /dev/{null, console, tty1, tty2, tty3, tty4} dev/ # rm linuxrc # touch init # chmod a+x init # mkdir -p lib/modules/4.9.153/ # cp /root/linux-4.9.153/fs/ext4/ext4.ko lib/modules/4.9.153/ # cp /root/linux-4.9.153/fs/jbd2/jbd2.ko lib/modules/4.9.153/ # cp /root/linux-4.9.153/fs/mbcache.ko lib/modules/4.9.153/ # ls bin  dev  init  lib  proc  sbin  sys  usr

init文件的内容

#!/bin/busybox sh mount -t proc mone /proc mount -t sysfs none /sys mdev -s exec /sbin/init

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。