基于VS.Code的Linux内核调试环境搭建

VS code 可视化调试Linux kernel内核 本文向大家介绍通过VS code 来调试linux kernel内核,结合源代码实现可视化的单步调试。 阅读详情

调试环境:Ubuntu 18.0.4

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
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相关选项
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)
qemu-system-x86_64 -kernel arch/x86/boot/bzImage

5.制作内存根文件

//安装busybox
axel -n 20 https://busybox.net/downloads/busybox-1.31.1.tar.bz2 # download
tar -jxvf busybox-1.31.1.tar.bz2
cd busybox-1.31.1

//设置静态链接
make menuconfig
Settings  --->
    [*] Build static binary (no shared libs)

//编译安装
make -j14 && 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/
nvim init #添加以下内容
    #!/bin/sh
    mount -t proc none /proc
    mount -t sysfs none /sys
    echo "Wellcome MyOS!"
    echo "--------------------"
    cd home
    /bin/sh
 
chmod +x init
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz 

6.测试

qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage -initrd rootfs.cpio.gz 

7.配置VSCode

下载VSCode

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

配置launch.josn

在这里插入图片描述
配置task.josn在这里插入图片描述
配置c_cpp_properties.json
在这里插入图片描述
配置settings.json
在这里插入图片描述
配置init
在这里插入图片描述

8.跟踪分析

qemu-system-x86_64 -kernel ./arch/x86/boot/bzImage -initrd rootfs.cpio.gz -S -s
//设置断点start_kernel,在vscode中按F5进行调试

vscode停在了start_kernel处。

点击单点跳过,0号进程init_task被设置系统的第一个进程(0进程是手工创建的,其他进程都是0号进程创建的)。
在内核引导时,init_task会被创建并启动,它是所有其他进程的起点。
继续跳过,start_kernel会继续执行一些初始化操作,包括初始化各种重要的数据结构、驱动程序、中断处理程序等。
在start_kernel的结尾是arch_call_reset_init(),执行了reset_init()函数,再设置一个断点"reset_init",进入reset_init函数内部。此函数是由0号进程执行的。

继续执行到1号进程,kernel_init,是所有用户进程的祖先,由kernel_thread函数创建,kernel_thread函数创建一个新的内核线程,该线程的入口地址是kernel_init()函数。

设置kernel_thread,继续执行,进入kernel_thread函数的定义。

在这里插入图片描述

kernel_thread函数通过_do_fork函数来创建进程的。设置_do_fork断点,进入_do_fork函数定义。

kernel_init()函数, 点开kernel_init()函数,可以看出,在这个里面调用了run_init_process函数:
会依次尝试运行 /sbin/init ,/etc/init ,/bin/init ,/bin/sh

在这里插入图片描述

0号reset_init函数继续执行,最后调用了cpu_startup_entry,设置断点查看这个函数,发现它最后执行了while(1)无限循环,循环内执行do_idle函数

在这里插入图片描述

Linux实验三——基于VS Code的Linux内核调试环境搭建及start_kernel跟踪分析 首先执行start_kernel:有一个关键目录是init目录,内核启动相关的代码都在这个目录下。init目录中的main.c源文件是整个Linux内核启动的起点,但它的起点不是main函数,而是main.c源文件中的start_kernel函数,start_kernel函数是初始化Linux内核启动的起点。继续执行,到kernel_init,即1号进程,由kernel_thread函数创建,kernel_thread函数创建一个新的内核线程,该线程的入口地址是kernel_init()函数。 阅读详情

相关推荐

构建高效阅读Kernel源码的环境-VSCode篇

本文介绍了如何配置VSCode环境以高效阅读Kernel源码。借助插件和生成的compile_commands.json文件,可以实现精确调转。

u010826758的专栏 921

Linux系统安装VsCode

将VScode.png图片复制到 /usr/loacl/icons目录中。将VScode.desktop复制到桌面,右击“允许启动”即可。步骤一:下载安装包(选择tar.gz版本)移动到/usr/local目录下。步骤四:为code添加权限。

m0_59300367的博客 1万+

【kernel】——VScode 调试 linux内核

VScode 调试 linux 内核,这里调试的 linux 内核是通过运行的内核。

tyustli 1747

使用vscode+clangd远程精准浏览linux kernel源码(原创)

vscode是一个编辑器,可以调用各种插件来完成更多高级功能,clangd是一个代码解析工具,是clang的一个子项目。vscode中集成clangd以后,就可以精准的查看代码的调用情况,因为clangd对整个编译过程进行了跟踪(使用compile_commands.json文件实现),对于linux kernel这种复杂的项目非常适合,放弃source insight吧,那玩意儿没啥用,一个宏定义你能找出来几百个定义,鬼知道哪个是实际的定义来源。

oushaojun2的专栏 1万+

微信内置浏览器抓包全攻略:从ADB配置到Chrome调试(附常见问题解决)

本文提供了一套完整的微信内置浏览器抓包与调试解决方案。从ADB工具的深度配置与稳定性连接开始,详细讲解了如何开启X5内核调试开关,并利用Chrome DevTools建立远程连接。文章重点剖析了Network面板进行网络请求抓取、性能分析和问题定位的实战技巧,并附带了设备连接失败、无网络请求等常见问题的排查指南,帮助开发者高效解决微信H5页面调试难题。

gitlab7runner的博客 543

利用Solidworks2020将挖掘机装配体转换为URDF模型

利用Solidworks2020将挖掘机装配体转换为URDF模型一、下载sw_urdf_exporter插件 URDF(Universal Robot Description Format)——通用机器人描述格式,它是ROS里边使用的一种机器人的描述文件,包含的内容有:连杆、关节,运动学和动力学参数、可视化模型、碰撞检测模型等。 一、下载sw_urdf_exporter插件 ROS提供了SolidWorks转URDF的插件(下载链接)—sw2urdfSetup.exe,下载后点击安装,安装完成后就能在sol

weixin_48192326的博客 6100

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

中的配置文件拷贝到.vscode文件夹内。

qq_41037004的博客 230

Palabos User Guide中文解读 | 第五章 | Palabos编程 (跳过了第四章Palabos-Java接口)

作者的话:本人在学习palabos时,发现国内中文资料甚少,恰好网上可以直接搜到palabos user guide这种英文资料,加之时间充裕,便打算开始翻译,翻了一节后发现这可能算侵权,就比较伤脑筋,突然想到自己写中文解读即可,便有了下面的博客。 Palabos User Guide Release 1.0 r1 Copyright © 2019 University of Geneva Jul...

Yulan Fang's notes. 2298

lab3:基于VS Code的Linux内核调试环境搭建及start_kernel跟踪分析

编译busybox,出现问题,不能使用stime。生成compile_commands.json。配置c_cpp_properties.json。在ubuntu浏览器中下载vscode安装包。安装deb格式的vscode安装包。GDB跟踪调试Linux内核。qemu运行linux内核。vscode的GUI形式。

芯片驱动开发实践 313

基于Python大数据的智能交通分析系统

该系统能够实时监测交通状况,分析交通流量,预测交通趋势,为交通管理部门提供决策支持,帮助缓解交通拥堵,提高交通运行效率,减少交通事故发生率,改善市民出行体验。它能够为交通管理部门提供决策支持,帮助缓解交通拥堵,提高交通运行效率,减少交通事故发生率,改善市民出行体验,促进交通产业的健康发展。数据采集层:通过传感器、GPS设备、交通摄像头等数据源,实时采集交通数据,如车辆速度、位置、道路拥堵情况等。数据分析层:运用统计学方法、机器学习算法等,对处理后的数据进行深入分析,挖掘交通规律,预测交通趋势。

qq3828614760的博客 2969

期权定价模型系列[11]三叉树期权定价[trinomial model ]

三叉树期权定价方法简介

xiaowu1997的博客 1847

lab3:基于VS Code的Linux内核调试环境搭建

基于VS Code的Linux内核调试环境搭建

qq_45145111的博客 197

【如何利用扩展卡尔曼滤波解决跟踪毫米波雷达目标】

笛卡尔坐标系(非极坐标系):使用两个垂直的轴(通常是x轴和y轴)来确定一个点的位置。你沿着这两个轴移动确定的距离来找到这个点。极坐标系:使用一个角度和一个距离来确定一个点的位置。首先,你转到一个特定的方向(角度),然后沿着那个方向移动确定的距离来找到这个点。希望这个例子能帮助你理解两种坐标系的基本概念!

小秋 AI SLAM 入门实战教程 884
上一篇: C++ 数组声明,初始化详解
下一篇: 23中科大软院linux期末复习及试题
Flyy.
博客等级 码龄7年 6粉丝 9原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Flyy.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值