基于VS Code的Linux内核调试环境搭建及start_kernel跟踪分析
下载Linux内核源码并编译
wget https://raw.github.com/mengning/mykernel/master/mykernel-2.0_for_linux-5.4.34.patch 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 patch -p1 < ../mykernel-2.0_for_linux-5.4.34.patch sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev make -j$(nproc) # 编译的时间比较久哦 sudo apt install qemu # install QEMU qemu-system-x86_64 -kernel arch/x86/boot/bzImage
当quemu成功启动编译后的内核文件时,从qemu窗口中可以看到my_start_kernel在执行,同时my_timer_handler时钟中断处理程序周期性执行。
其中需要配置编译选项
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)
qemu成功启动内核

vscode远程连接虚拟机
Remote-SSH连接虚拟机后,如图所示:

在linux-5.4.34文件夹下 新建 .vscode文件夹,并导入配置文件如图所示:

然后运行
python ./scripts/gen_compile_commands.py,准备环境。
运行调试
打上断点,并开启调试,如图所示:

成功开启调试,会在start_kernel函数得断点处停下,跟踪代码会发现,start_kernel先执行了一系列的初始化(内存初始化,VFS初始化,调度初始化等),最后执行到rest_init。发现0号进程是整个系统得第一个进程。
来到kernel_thread函数定义

可以看到kernel_thread函数是通过_do_fork函数创建进程
大体上代码逻辑如下图所示:


浙公网安备 33010602011771号