基于VSCode的Linux内核调试环境搭建以及start_kernel跟踪分析


前言

实验任务:基于VSCode的Linux内核调试环境搭建以及start_kernel跟踪分析


一、安装开发工具

sudo apt install build-essential

sudo apt install qemu # install QEMU#作为一个虚拟机

sudo apt install libncurses5-dev bison flex libssl-dev libelf-dev
#编译内核所需的依赖---一些基础库

二、下载内核源码

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

三、配置内核选项

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)

四、制作内存根文件系统

    电脑加电启动首先由bootloader加载内核,内核紧接着需要挂载内存根文件系统,其中包含必要的设备驱动和工具,bootloader加载根文件系统到内存中,内核会将其挂载到根目录/下,然后运行根文件系统中init脚本执行一些启动任务,最后才挂载真正的磁盘根文件系统。
    我们这里为了简化实验环境,仅制作内存根文件系统。这里借助BusyBox 构建极简内存根文件系统,提供基本的用户态可执行程序。
#首先从https://www.busybox.net下载 busybox源代码解压,解压完成后,跟内核一样先配置编译,并安装。 
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/
#接下来准备init脚本文件放在根文件系统跟目录下(rootfs/init),内容如下
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
echo "Welcome YouYouOS!"
echo "--------------------"
cd home
/bin/sh
#接下来对脚本添加可执行权限然后将根目录文件打包成内存根文件系统镜像:
chmod +x init

find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz 
#测试挂载根文件系统,看内核启动完成后是否执行init脚本
qemu-system-x86_64 -kernel ./arch/x86/boot/bzImage -initrd rootfs.cpio.gz

五、配置vscode调式linux内核

#安装vscode后
sudo apt install global

并且在vscode中安装C/C++ IntelliSense和C/C++ Themes等扩展

#在命令行输入
python ./scripts/gen_compile_commands.py

然后在linux-5.4.34文件夹下创建一个.vscode文件夹并将配置文件放入其中
在这里插入图片描述

接下来就可以在vscode中调试了

六、调式跟踪分析

函数start_kernel是linux内核的起点,设置其的断点,然后开始调试
在这里插入图片描述
点击单点跳过,这里我们看到了0号进程init_task被设置整个系统的第一个进程(0进程是手工创建的,其他进程都是0号进程创建的)在内核引导时,init_task会被创建并启动,它是所有其他进程的起点。
继续跳过,start_kernel会继续执行一些初始化操作,包括初始化各种重要的数据结构、驱动程序、中断处理程序等。在这个阶段,内核会建立好一些必要的核心数据结构,如物理内存管理器、虚拟内存管理器,以及进程调度器等。
在这里插入图片描述
继续执行,来到该函数结尾,点开函数定义,会发现该函数会执行rest_init();
在这里插入图片描述
继续执行进入函数rest_init()内部,这时候遇到了kernel_init,即1号进程,1号进程是所有用户态进程的父进程,函数kernel_thread会调用do_fork根据参数不同创建一个进程或者内核线程。
在这里插入图片描述
接着就会创建2号进程,2号进程是所有内核线程的父进程
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
搭建Linux内核调试环境需要准备以下工具和步骤: 1. 准备编译工具链:在Linux系统上搭建交叉编译工具链,用于编译和调试内核。可以使用GCC工具链或者Clang/LLVM工具链。 2. 获取Linux内核源代码:从Linux官方网站或者GitHub上获取所需的Linux内核源代码。可以选择稳定版本或者特定的分支。 3. 配置编译选项:进入内核源代码目录,在终端执行"make menuconfig"命令,配置所需的编译选项。可以选择启用调试符号、内核调试选项和相关的硬件调试支持等。 4. 编译内核:执行"make"命令编译内核。可能需要一段时间来完成编译过程,取决于系统资源和内核配置选项。 5. 安装内核:执行"make modules_install install"命令将编译好的内核和模块安装到系统中。注意备份原有内核并配置启动引导文件。 6. 配置调试工具:安装并配置GDB调试器。GDB是一种强大的调试器,可以用于调试Linux内核。可以通过包管理器安装GDB,如"apt-get"或者"yum"。 7. 连接调试器:通过串口、网络或者通过JTAG接口连接调试器到目标机器。这可能需要硬件设备和相应的驱动程序。 8. 启动内核调试:启动目标机器,并在GDB中配置和启动目标机器连接。可以设置断点、观察变量、单步执行和查看调用栈等。 9. 进行调试:在GDB中使用各种调试命令和功能对Linux内核进行调试。例如,可以查看内核日志、内存映射和寄存器状态等。 10. 分析问题和修复:根据调试结果分析问题,并进行相应的代码修改,重复以上步骤来进行进一步的调试和测试。 以上是搭建Linux内核调试环境的基本步骤。根据具体需求和调试场景,可能还需要其他工具和配置来满足特定的调试需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值