Linux内核调试环境搭建及start_kernel实验

1.下载并解压源码

sudo apt install axel
axel -n 20 https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.34.tar.xz
xz -d linux-5.4.34.tar.xz
tar -xvf linux-5.4.34.tar
cd linux-5.4.34

Linux内核调试环境搭建及start_kernel实验_第1张图片

 2.配置内核选项

make defconfig # Default configuration is based on 'x86_64_defconfig'
make menuconfig
# 打开debug相关选项
Kernel hacking  --->
    Compile-time checks and compiler options  --->
        [*] Compile the kernel with debug info
        [*]   Provide GDB scripts for kernel debugging
 [*] Kernel debugging
# 关闭KASLR,否则会导致打断点失败
Processor type and features ---->
    [] Randomize the address of the kernel image (KASLR)

Linux内核调试环境搭建及start_kernel实验_第2张图片

Linux内核调试环境搭建及start_kernel实验_第3张图片

 3.编译和运行内核

make -j$(nproc) # nproc gives the number of CPU cores/threads available
# 测试一下内核能不能正常加载运行,因为没有文件系统最终会kernel panic
qemu-system-x86_64 -kernel arch/x86/boot/bzImage

Linux内核调试环境搭建及start_kernel实验_第4张图片

4.制作根文件系统

axel -n 20 https://busybox.net/downloads/busybox-1.31.1.tar.bz2
tar -jxvf busybox-1.31.1.tar.bz2
cd busybox-1.31.1
make menuconfig
记得要编译成静态链接,不用动态链接库。
Settings  --->
    [*] Build static binary (no shared libs)
然后编译安装,默认会安装到源码目录下的 _install 目录中。
make -j$(nproc) && make install
然后制作内存根文件系统镜像,大致过程如下:
mkdir rootfs
cd rootfs
cp ../busybox-1.31.1/_install/* ./ -rf
mkdir dev proc sys home
sudo cp -a /dev/{null,console,tty,tty1,tty2,tty3,tty4} dev/

Linux内核调试环境搭建及start_kernel实验_第5张图片

 Linux内核调试环境搭建及start_kernel实验_第6张图片

Linux内核调试环境搭建及start_kernel实验_第7张图片

 Linux内核调试环境搭建及start_kernel实验_第8张图片

Linux内核调试环境搭建及start_kernel实验_第9张图片

//给init脚本添加可执行权限
chmod +x init
//打包成内存根文件系统镜像
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz 
//测试挂载根文件系统,看内核启动完成后是否执行init脚本
qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage -initrd rootfs.cpio.gz

 Linux内核调试环境搭建及start_kernel实验_第10张图片

init脚本执行成功!

4.使用gbd调试

qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage -initrd rootfs.cpio.gz -S -s -nographic -append "console=ttyS0"

Linux内核调试环境搭建及start_kernel实验_第11张图片

再打开一个窗口,启动gdb,把内核符号表加载进来,建立连接:
cd linux-5.4.34/
gdb vmlinux
(gdb) target remote:1234
(gdb) b start_kernel
c、bt、list、next、step....

 Linux内核调试环境搭建及start_kernel实验_第12张图片

命令行下打断点跟踪代码还是不够方便,用VSCode边看代码随时打断点单步执行会更方便一些,这需要配置.vscode/tasks.json和.vscode/launch.json。
配置文件参见https://github.com/mengning/linuxkernel/tree/master/src/kerneldebuging

5.使用vscode调试

Linux内核调试环境搭建及start_kernel实验_第13张图片

 总是卡在这里,调用堆栈如左侧所示,未找到原因。。

你可能感兴趣的:(linux,运维,ubuntu)