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

这篇具有很好参考价值的文章主要介绍了基于VSCode的Linux内核调试环境搭建以及start_kernel跟踪分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考ppt的步骤:

准备工作:1-5 ,配置vscode环境:6 ,跟踪分析:7。

目录

1.安装开发工具

 2.下载内核源码

 3.配置内核选项

4.编译和运行内核

5.制作内存根文件系统

*gdb调试(可跳过)

 7.配置VSCode调试Linux内核

 7.跟踪分析


1.安装开发工具

sudo apt install build-essential

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

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

 2.下载内核源码

sudo apt install axel

axel -n 20 https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.34.tar.xz

#下载源码压缩包

下载出现了“Axel -n 20 :太多重定向”的问题,原因是可能axel版本太低了,还是直接改用了:

​wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.34.tar.xz

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

xz -d linux-5.4.34.tar.xz

tar -xvf linux-5.4.34.tar #解压源码

cd linux-5.4.34

 3.配置内核选项

make defconfig # Default configuration is based on 'x86_64_defconfig'
make menuconfig# 打开debug相关选项

打开是这个界面: 

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

按Enter回车进入“--->”和Space空格键改动“[ ] [*]”来分别进行下面设置:

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)

4.编译和运行内核

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

测试了一下出现了Kernel panic: 

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

5.制作内存根文件系统

        电脑加电启动首先由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
#记得要编译成静态链接,不用动态链接库。

基于VSCode的Linux内核调试环境搭建以及start_kernel跟踪分析 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-5.4.34文件夹下来创建rootfs文件夹的,部分截图:

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

 接下来准备init脚本文件放在根文件系统跟目录下(rootfs/init),添加如下内容到init文件:(使用touch init 创建init脚本文件,再“vim init”打开init文件,再按i进入插入模式,粘贴进去,再按ESC进入命令模式,:wq保存并退出即可。)

#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
echo "Wellcome YouYouOS!"
echo "--------------------"
cd home
/bin/sh

其中mount命令是对proc和sys进行挂载。

接下来对脚本添加可执行权限:

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-5.4.34文件夹下执行的,根据我的文件放置位置(我的rootfs.cpio.gz放在了·linux-5.4.34文件里面)改动了:

# 改成了:
qemu-system-x86_64 -kernel ./arch/x86/boot/bzImage -initrd rootfs.cpio.gz

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

成功执行了init脚本。到这里就可以直接使用gdb调试了。

*gdb调试(可跳过)

执行:

qemu-system-x86_64 -kernel ./arch/x86/boot/bzImage -initrd rootfs.cpio.gz -S -s
#其中-S意思是Stopped,-s为gdb提供一个调试端口tcp:1234。 

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

 同时再打开另一个终端,输入命令:

gdb vmlinux

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

就可以进行gdb测试跟踪了。

(gdb) target remote:1234   //这是通过之前预留的tcp:1234建立连接
(gdb) b start_kernel            //这是设置了第一个断点
c、bt、list、next、step....  //具体查看gdb的命令

 测试的时候gdb出现了Remote 'g' packet reply is too long的问题:参考了下面的文章:

解决Remote 'g' packet reply is too long错误

但是命令行下打断点跟踪代码还是不够方便,用VSCode边看代码随时打断点单步执行会更方便一些。使用vscode还需要再配置下vscode的环境。

 6.配置VSCode调试Linux内核

        首先在linux系统下载vscode安装包,打开ubuntu自带的火狐浏览器下载:官方下载地址,选择.deb下载选项,这里我下载的是:

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

然后执行安装命令 sudo apt install ./<filename>.deb,我的文件对应的安装命令是:

sudo apt install ./code_1.76.1-1678294265_amd64.deb

        还要安装VSCode插件C/C++ Intellisense和C/C++ Themes。由于插件C/C++ Intellisense需要GNU Global,还需要使用如下命令安装GNU Global。

sudo apt install global

 接下来在VScode里搜索安装这几个扩展(中文可以不用):

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

准备在vscode中打开前面准备好的linux-5.4.34文件夹,需要做两件事情:

(1)命令行输入:

python ./scripts/gen_compile_commands.py

(不然后面配置文件这里会报错:)

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

 这里的解释是:由于 Linux 内核高度定制化,所以没有办法直接通过配置 includePath 等让 Intellisense 正常提示,这里借助一个 Python 脚本来生成 compile_commands.json 文件帮助 Intellisense 正常提示(包括头文件和宏定义等)。在Linux源代码目录下直接运行如下命令就可以生成 compile_commands.json 了。                                                   ----来自老师的ppt

(2)需要在linux-5.4.34文件夹下在此之前直接先手动放好配置文件:新建一个.vscode文件夹,(需要点击ctrl+h显示隐藏文件)把配置文件里的文件全部放入.vscode文件夹内:

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

 接下来就可以在vscode里打开linux-5.4.34文件夹:可以看到.vscode配置文件夹已经出现了:

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

 同时改一下tasks.json:跟前面文件放置的问题一致。(我的文件放置是这样改)

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

 还有setting.json里最后这个"Disabled"按照我的vscode提示改成了"disabled"(可能版本问题?)

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

 这下vscode的调试环境就配置好了。

(如果更改文件则需要再在命令行make -j$(nproc) 一下)

 7.跟踪分析

因为linux内核的起点是"start_kernel"函数,因此先在start_kernel处打断点:点击运行和调试图标,在断点里增加函数断点:start_kernel

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

点击运行--启动调试,从start_kernel开始进行跟踪分析。

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

 可以看到程序执行停在了start_kernel处:

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

点击单点跳过,这里我们看到了0号进程init_task被设置整个系统的第一个进程(0进程是手工创建的,其他进程都是0号进程创建的)在内核引导时,init_task会被创建并启动,它是所有其他进程的起点。

继续跳过,start_kernel会继续执行一些初始化操作,包括初始化各种重要的数据结构、驱动程序、中断处理程序等。在这个阶段,内核会建立好一些必要的核心数据结构,如物理内存管理器、虚拟内存管理器,以及进程调度器等。

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

 最后来到start_kernel的结尾arch_call_reset_init(),这个点开这个函数的定义是执行了reset_init()函数,因此我们再设置一个函数断点"reset_init",继续点击单点跳过发现就进入了reset_init函数内部。这个函数是由0号进程执行的。

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

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

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

 继续执行,这时候遇到了kernel_init,即1号进程,它是所有用户进程的祖先,由kernel_thread函数创建,kernel_thread函数创建一个新的内核线程(实际linux不支持线程所以是一个内核进程),该线程的入口地址是kernel_init()函数。

点开kernel_thread函数的定义。

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

发现kernel_thread函数是通过_do_fork函数来创建进程的。

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

 _do_fork函数主要完成了调用copy_process()复制父进程、调用wake_up_new_task将子进程加入就绪队列等待调度执行等。

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

这里copy_process点进去还有调用dup_task_struct函数等过程,放上do_fork的过程,借用老师ppt的图一目了然:

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

接下来在新线程(进程)中运行kernel_init()函数, 点开kernel_init()函数,可以看出,在这个里面调用了run_init_process函数:

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

 一共有三个if,其中前两个点开ramdisk_execute_command和execute_command的定义看程序没有看懂,因此这里参考了一篇文章【linux kernel】linux内核的init线程

ramdisk_execute_command 可以通过 uboot 在环境变量中指定。execute_command也是一个全局的 char 指针变量,值也可以通过u-boot 传递。

 所以这两个没有值就按顺序再尝试跳转到/sbin/init、/etc/init、/bin/init、/bin/sh去启动用户空间的init程序。而run_init_process函数则使用了do_execve函数:

基于VSCode的Linux内核调试环境搭建以及start_kernel跟踪分析 点开do_execve函数,do_execve加载可执行文件,运行init程序,执行exec系统调用,

-> do_execve() –> do_execveat_common() -> __do_execve_file -> exec_binprm()-> search_binary_handler() -> load_elf_binary() -> start_thread()。

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

 这样1号进程就完成了用户态初始化。

接下来是2号进程的创建,2号进程是所有内核进程的祖先,kernel_thread创建了2号进程,同时进程执行的函数是kthreadd:

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

查看kthreadd函数,做完一些初始化设置后,发现2号进程在不停地查看是否有需要创建的内核进程,如果kthread_create_list不空即有需要创建的内核进程,则就创建否则就执行schedule函数(不创建?)

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

 基于VSCode的Linux内核调试环境搭建以及start_kernel跟踪分析reset_init函数继续执行,最后调用了cpu_startup_entry,设置断点查看这个函数,发现它最后执行了while(1)无限循环,循环内执行do_idle函数,这个函数具体查看了这个帖子:idle进程内的do_idle函数的作用,总结就是:

在do_idle()中,代码会不断地轮询,判断当前系统是否需要调度,如果系统当前不需要调度,则进入到idle状态。 

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

 这样循环的意义就是:

根据内核源码——C语言阶段的start_kernel函数_天糊土的博客-CSDN博客

 总结:

调度系统负责考评系统中所有的进程。只要有哪个需要被运行,调度系统就会终止cpu_idle死循环进程(空闲进程)转而去执行有意义的干活的进程。 

 这样start_kernel就简单分析完了。文章来源地址https://www.toymoban.com/news/detail-416176.html

到了这里,关于基于VSCode的Linux内核调试环境搭建以及start_kernel跟踪分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • windows driver双机调试环境搭建,用windbg或者debug view查看内核调试输出

    本地环境 本地开发环境: win 10, visual studio installer(2022版), visual studio 2022, VMware player 目的:本地环境作为开发环境,VM作为测试和调试环境 用debug view查看内核调试输出请直接看最后 debug view查看内核打印信息 部分 开发环境搭建 通过 visual studio installer 下载安装 visual studi

    2024年02月06日
    浏览(39)
  • 调试linux内核(1): 环境准备和原理介绍

    现在流行的开源项目经历了长时间的开发, 积累了大量的代码, 想要一行一行地阅读代码去学习开源项目, 需要的时间成本是巨大的. 所以, 我们也需要用一种高效的方式去\\\"阅读\\\"代码. 计算机科学发展到现在, 产生了很多高效成熟的工具, 调试器就是其中之一(扯句题外话, 那些大

    2024年02月14日
    浏览(28)
  • VSCode使用 - 搭建python运行调试环境

    VSCode是一个优秀的编辑工具,适合代码阅读,代码编辑,甚至配置好之后,可以编译与调试代码。 为了方便编辑,运行python程序,本文就聊聊如何将VSCode搭建为一个python的IDE吧,具备运行与调试python程序的能力。 首先,安装python程序,这样才能进行python开发,我这里安装了

    2024年02月12日
    浏览(49)
  • 搭建stressapptest调试环境:VSCode的分步教程

    stressapptest(简称SAT)是一种用于在Linux系统上测试系统稳定性和可靠性的工具,通过产生CPU、内存、磁盘等各种负载来测试系统的稳定性。 VSCode(Visual Studio Code)是一款轻量级的现代化代码编辑器,为开发者提供了丰富的功能和扩展,是一个理想的集成开发环境。 本文章的目标

    2024年03月13日
    浏览(52)
  • Jlink+OpenOCD+STM32 Vscode 下载和调试环境搭建

    首先下载编译器:gcc-arm-none-eabi-xxx Downloads | GNU Arm Embedded Toolchain Downloads – Arm Developer 对于 Mingw 的安装比较困难,国内的网无法正常在线下载组件, 需要手动下载 x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z 版本的软件包,添加环境变量,并将 mingw32-make.exe 名字改成 make.exe。 MinGW-w6

    2024年04月22日
    浏览(29)
  • Linux环境使用VSCode调试简单C++代码

    本文将通过演示一个简单C++代码的编译调试过程,介绍在VSCode中如何使用Linux环境下的GCC C++编译器(g++)和GDB 调试器(gdb)。 关于GCC、g++、gcc、gdb,这里不做详细介绍,如果感兴趣可以参考另一篇文章:详解C/C++代码的预处理、编译、汇编、链接全过程,里面有详细的解释。 看懂

    2024年02月04日
    浏览(36)
  • Vscode搭建开发调试STM32/RISC-V环境IDE(最全面)

    单片机开发IDE环境如KeilMDK,虽然操作简单 ,方便调试。但就是代码编辑风格很老套,中文符号乱码还是常有的事。而如今流行的vscode编辑器很不错,免费且相当轻量级,用来代码开发体验很不错,看着都舒服。Clion IDE体验更好,但就是它不免费且体积较大。Stm32cubeIDE生成工

    2024年02月16日
    浏览(50)
  • Vscode的ESP32环境搭建以及烧录移植

    无须下载python,git等软件 首先需要有VScode和ESP的离线包 下载的链接放在下面:下载自己需要的版本,ESP最好知道你要用的代码是那个版本搭建的,不然无法正常编译。版本之间有差异 VScoed:Download Visual Studio Code - Mac, Linux, Windows ESP:dl.espressif.cn/dl/esp-idf/​​​​​​ VScode的

    2024年01月20日
    浏览(40)
  • 【树莓派Linux内核开发】入门实操篇(虚拟机Ubuntu环境搭建+内核源码获取与配置+内核交叉编译+内核镜像挂载)

    1.ubuntu18.04镜像下载 打开ubuntu18.04镜像传送门,进入到主页 往下滑,找到相应镜像并下载 等待镜像下载完毕即可 2.VMware软件安装 VMware是一款 运行在windows系统上的虚拟机软件 ,可以虚拟出一台计算机硬件,方便安装各类操作系统 进入VMware官网传送门,来到主页,往下滑,选

    2024年04月29日
    浏览(41)
  • ESP-IDF + Vscode ESP32 开发环境搭建以及开发入门

    创作不易,转载请注明出处! Tips: 虽然笔者采用的是Linux开发环境,但是Windows开发环境的亦可阅读,所述内容与系统关联性不大,尤其是后文介绍的如何将自己的文件加入到工程,解决头文件找不到等问题,无论哪种系统均会存在。 Tips: 最近更新了一篇windows下搭建的,大家

    2024年02月02日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包