调试Linux内核

工具:随便一个linux系统 + QEMU (虚拟机都可)

1、编译内核源码

https://mirrors.aliyun.com/linux-kernel/ linux源码

本次使用 5.19版本编译

tar -xvf linux-5.19.tar.gz

在配置菜单中,启用内核debug,关闭地址随机化,不然断点处无法停止。

make menuconfig

Kernel hacking  ---> 
    [*] Kernel debugging
   Compile-time checks and compiler options  --->
        [*] Compile the kernel with debug info
        [*]   Provide GDB scripts for kernel debuggin


Processor type and features ---->
    [] Randomize the address of the kernel image (KASLR)

开始编译内核,-j 指定并行编译作业数。

make -j8

最终生成linux-5.19/arch/x86_64/boot/bzImage文件
内核编译完成。
如果编译中出现报错等问题。可能是缺少第三方库,下载就可。
还有些同学出现certs.pem等报错,参考:https://blog.csdn.net/weixin_45783574/article/details/126337213

2、配置Busybox

启动内核还需要一个具有根文件系统的磁盘镜像文件,根文件系统中提供可供交互的shell程序以及一些常用工具命令。

我们借助busybox工具来制作根文件系统。

本文使用1.32.0版本,下载busybox。

解压:

tar -jxvf busybox-1.32.0.tar.bz2

进入busybox根目录,配置编译选项。

cd busybox-1.32.0
make menuconfig

把busybox配置为静态编译。

Settings --->
[*] Build BusyBox as a static binary (no shared libs)

可以在make menuconfig 中 按 / 可以查找配置项

3、制作rootfs

接下来制作rootfs镜像文件,并把busybox安装到其中。

使用dd命令创建文件,并格式化为ext4文件系统。

dd if=/dev/zero of=rootfs.img bs=1M count=10

mkfs.ext4 rootfs.img

创建用于挂载该镜像文件的目录fs,挂载后才能往里面写入busybox。
使用mount命令将rootfs.img挂载到fs目录,编译busybox并写入fs目录中。

mkdir fs

sudo mount -t ext4 -o loop rootfs.img ./fs

sudo make install CONFIG_PREFIX=./fs

接下来对写入的busybox进行补充配置。

sudo mkdir proc dev etc home mnt

sudo cp -r ../examples/bootfloppy/etc/* etc/

cd ..
sudo chmod -R 777 fs/

最后,卸载rootfs.img

sudo umount fs

至此,一个带有rootfs的磁盘镜像制作完成。

4、启动qemu

使用如下命令启动无GUI的qemu,参数含义如下:

-kernel # 指定编译好的内核镜像
-hda # 指定硬盘
-append “root=/dev/sda” 指示根文件系统 console=ttyS0 把QEMU的输入输出定向到当前终端上
-nographic 不使用图形输出窗口
-s 是-gdb tcp::1234缩写,监听1234端口,在GDB中可以通过target remote localhost:1234连接


qemu-system-x86_64 -kernel ./linux-5.19/arch/x86_64/boot/bzImage  -hda ./busybox-1.32.0/rootfs.img  -append "root=/dev/sda console=ttyS0" -nographic

Ctrl+A 松开后按C退出qemu。

5、内核函数调试

启动命令中添加-s参数与-S参数启动qemu。


qemu-system-x86_64 -kernel ~/linux-5.19/arch/x86_64/boot/bzImage  -hda ~/busybox-1.32.0/rootfs.img  -append "root=/dev/sda console=ttyS0" -s -S  -smp 1 -nographic


启动gdb远程调试。vmlinux文件在编译后的内核源码根目录下。

gdb ./linux-4.14.191/vmlinux
(gdb) target remote localhost:1234

在new_sync_read函数添加断点,continue。

在被调试系统(qemu)中执行ls命令,触发new_sync_read函数

至此,完成了qemu环境下使用gdb进行内核函数的调试。

参考链接:https://blog.csdn.net/m0_50662680/article/details/130600549

你可能感兴趣的:(调试Linux内核)