基于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函数创建进程

 

大体上代码逻辑如下图所示:

 

posted @ 2023-03-23 18:55  hunterooo  阅读(876)  评论(0)    收藏  举报