当前位置: 首页 > article >正文

如何调试Linux内核?

通过创建一个最小的根文件系统,并使用QEMU和GDB进行调试。

1.准备工作环境

确保系统上安装了所有必要的工具和依赖项。

sudo apt-get update    //更新一下软件包
sudo apt-get install build-essential git libncurses-dev bison flex libssl-dev qemu-system-x86 gdb busybox-static
  • sudo apt-get install build-essential:安装编译工具链,其中包含了gcc(GNU编译器集合,用于C/C++程序)、g++(GNU C++编译器)、make(构建工具,用于自动化编译和安装)、libc-dev(C标准库的开发文件)。

  • git:分布式版本控制系统。
  • libncurses-dev:提供字符终端处理库的开发文件。在编译和配置内核的时候,需要依赖此库。
  • bison:GNU解析器生成器。用于生成语法分析器(Parser),在编译内核时可能会使用。
  • flex:快速词法分析器生成器。配合bison使用。
  • libssl-dev:解密一些协议,在内核模块可能使用。
  • qemu-system-x86:QEMU的x86系统模拟器。用于模拟x86架构的虚拟机,支持运行操作系统内核或完整系统。
  • gdb:GNU调试器。用于调试C/C++程序,支持设置断点、单步执行、查看变量和内存,与QEMU配合使用,调试Linux内核。
  • busybox-static:静态编译的BusyBox工具集,提供一组精简的Unix工具,将所有依赖库都包含在可执行文件中,无需外部依赖。

2.获取并配置Linux内核源码

先进入到一个目录下,然后自己克隆就可以了

git clone https://github.com/torvalds/linux.git
cd linux

3.配置内核

为了简化过程,可以使用默认配置并启动调试信息:

make defconfig

在Linux源代码中,找到 .config 文件,然后“Ctrl + f”启动搜索键,搜索调试信息“CONFIG_DEBUG_INFO”,然后可能会出现“CONFIG_DEBUG_INFO_NODE”,你就把他注释了。然后你进行编译“make -j4”,启动四个内核进行编译,提高速度,但是会出现四个调试选项,是因为你把之前个给注释了,在这里你要选择与“CONFIG_DEBUG_INFO”相关的。之后就会成功编译。

编译成功后,你应该能找到两个文件:

  • arch/x86/boot/bzImage:这是内核映像文件。
  • vmlinux:这是未压缩的内核映像文件,用于GDB调试。

4.创建最小的根文件系统

4.1准备目录结构

创建一个目录来存放根文件系统的文件:

mkdir -p ~/Compiler-2/rootfs   //具体路径视情况而定
cd ~/Compiler-2/rootfs
mkdir -p bin sbin etc proc sys usr/bin usr/sbin
ln -s bin sbin
  • bin:存放系统的基本指令(二进制可执行文件),这些命令对所有用户可用。
  • sbin:存放系统管理员使用的管理命令(二进制可执行文件),通常需要root权限才能执行。
  • etc:存放系统的配置文件,包括一些用户信息,网络配置等
  • proc:一个虚拟文件系统,提供内核和进程信息的接口。它不占用磁盘空间,而是由内核动态生成。包括CPU信息、内存信息等
  • sys:一个虚拟文件系统,提供内核和硬件设备的配置接口。与proc类似,它也是由内核动态生成的。用来配置内核参数、管理设备等
  • usr/bin:存放用户安装的命令和应用程序(二进制可执行文件)。gcc、vim等
  • usr/sbin:存放用户安装的系统管理命令(二进制可执行文件),通常需要root权限才能执行、

第三行创建的很多目录是Linux文件系统层次结构标准(FHS)的一部分。

第四行命令的作用是创建一个 符号链接(symbolic link),将sbin目录软链接到bin目录。因为在某些情况下,bin和sbin目录的内容可能会相同或相似,通过将sbin链接到bin,可以节省空间,方便统一管理,之后也就不需要区分这两个目录,也可以简化路径。

4.2复制BuysBox二进制文件

复制BusyBox二进制文件到根文件系统目录:

cp $(which busybox) bin/

将当前目录下 bin/ 目录中的 busybox 可执行文件所支持的所有工具,以符号链接的形式安装到指定目录中(其实就是默认当前目录下的 bin/ 目录)。其中-s是 --install 选项的子选项,表示创建符号链接而不是硬链接(hard link)。

./bin/busybox --install -s

4.3创建 init 脚本

在根文件系统中创建一个简单的初始化脚本(init script)来启动shell:

创建一个名为 init 的文件,并将 #!/bin/sh 写入文件的第一行。其中 #!/bin/sh 是脚本的 shenbang,指定脚本使用 /bin/sh(Bourne Shell)作为解释器。

echo '#!/bin/sh' > init

将 mount -t proc none /proc 追加到 init 文件中。mount -t proc none /proc 挂载 proc 文件系统打破 /proc 目录。proc文件系统提供了内核和进程信息的接口,是Linux系统的重要组成部分。>> init将输出追加到init文件中,不会覆盖原有内容。

echo 'mount -t proc none /proc' >> init

sysfs文件系统提供了内核和硬件设备的配置接口,通常用于管理设备和内核模块。

echo 'mount -t sysfs none /sys' >> init

exec sh 是启动一个交互式的Shell。exec 用新的进程替换当前进程。这行代码的作用是让系统在初始化完成后进入一个交互式的 Shell 环境,方便用户操作或调试。

echo 'exec sh' >> init

为 init 文件添加可执行权限。这行代码的作用是让 init 文件可以被执行。因为在Linux系统中,脚本文件必须具有可执行权限才能直接运行。

chmod +x init

4.4 打包成 cpio 归档

将 rootfs 目录打包成一个 cpio 归档文件,并使用 gzip 压缩,最终生成一个压缩的根文件系统映像文件 rootfs.cpio.gz。

cd ~/Compiler-2
find rootfs | cpio -o --format=newc | gzip > rootfs.cpio.gz

最后在我的电脑上,输出 1 block,表示 cpio 归档文件中只包含一个块的数据(512字节)。

5.使用QEMU启动内核

在第一个终端窗口中运行一下命令启动QEMU:

qemu-system-x86_64 \-kernel arch/x86/boot/bzImage \-append nokaslr\-s -S \-m 2024
  • qemu-system-x86_64:这是QEMU的可执行文件,用于模拟x86_64架构的虚拟机
  • -kernel linux/arch/x86/boot/bzImage:指定要启动的Linux内核镜像文件(在上面编译的时候也提到了)
  • -s:启用 GDB 调试服务器,默认监听端口 1234
  • -S:启动时暂停CPU,等待GDB连接。
  • -m 2024 :给虚拟机分配2024MB   //可加可不加

6.启动GDB连接QEMU进行调试

在第二个终端窗口中启动GDB并连接到QEMU:

cd ~/Compiler-2/linux-6.1
gdb vmlinux
(gdb) target remote localhost:1234
(gdb) continue

之后你就可以使用gdb打断点进行调试了。(*^▽^*)

相关文章:

如何调试Linux内核?

通过创建一个最小的根文件系统,并使用QEMU和GDB进行调试。 1.准备工作环境 确保系统上安装了所有必要的工具和依赖项。 sudo apt-get update //更新一下软件包 sudo apt-get install build-essential git libncurses-dev bison flex libssl-dev qemu-system-x…...

Docker入门指南:Windows下docker配置镜像源加速下载

Windows下docker配置镜像源加速下载 docker的官方镜像是海外仓库,默认下载耗时较长,而且经常出现断站的现象,因此需要配置国内镜像源。 国内镜像源概述 国内现有如下镜像源可以使用 "http://hub-mirror.c.163.com", "http…...

java后端开发day24--阶段项目(一)

(以下内容全部来自上述课程) GUI:Graphical User Interface 图形用户接口,采取图形化的方式显示操作界面 分为两套体系:AWT包(有兼容问题)和Swing包(常用) 拼图小游戏…...

TVbox蜂蜜影视:智能电视观影新选择,简洁界面与强大功能兼具

蜂蜜影视是一款基于猫影视开源项目 CatVodTVJarLoader 开发的智能电视软件,专为追求简洁与高效观影体验的用户设计。该软件从零开始编写,界面清爽,操作流畅,特别适合在智能电视上使用。其最大的亮点在于能够自动跳过失效的播放地址…...

2025.3.2机器学习笔记:PINN文献阅读

2025.3.2周报 一、文献阅读题目信息摘要Abstract创新点网络架构实验结论不足以及展望 一、文献阅读 题目信息 题目: Physics-Informed Neural Networks of the Saint-Venant Equations for Downscaling a Large-Scale River Model期刊: Water Resource…...

2025AI 有哪些重要的发展趋势?

2025 年,AI 有哪些重要的发展趋势? 看看大佬们的看法: 马斯克:“人形机器人生产、自动驾驶突破、脑机接口进化” 奥特曼:“2025年,AGI即将到来” 黄仁勋:“通用机器人元年、能源效率的提升”…...

uni-app 全局请求封装:支持 Promise,自动刷新 Token,解决 401 过期问题

在 uni-app 中封装一个全局通用的 ajax 请求函数,支持 Promise,使用 uni.request() 进行请求,并且具备 自动刷新 token 的功能。以下是详细步骤: 实现步骤 创建 request.js 统一封装 ajax 请求管理 token(存储、获取、…...

IDEAPyCharm安装ProxyAI(CodeGPT)插件连接DeepSeek-R1教程

背景:最近DeepSeek比较火嘛,然后在githup上也看到了GitHub Copilot,就想着现在AI的准确率已经可以提高工作效率了。所以从网上找了一些编程插件,发现Proxy支持的模型比较多,通用性和适配性比较好。所以本文记录一下pro…...

【实战 ES】实战 Elasticsearch:快速上手与深度实践-2.1.2字段类型选择:keyword vs text、nested对象

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 第2章 数据建模与高效写入:ES字段类型选择最佳实践:keyword vs text与nested对象深度解析1. 索引设计核心原则2. keyword与text类型终极对决2.1 核心…...

【前端基础】Day 3 CSS-2

目录 1. Emmet语法 1.1 快速生成HTML结构语法 1.2 快速生成CSS样式语法 2. CSS的复合选择器 2.1 后代选择器 2.2 子选择器 2.3 并集选择器 2.4 伪类选择器 2.4.1 链接伪类选择器 2.4.2 focus伪类选择器 2.5 复合选择器总结 3. CSS的元素显示模式 3.1 什么是元素显示…...

windows电脑上安装llama-factory实现大模型微调

一、安装环境准备 这是官方给的llama-factory安装教程,安装 - LLaMA Factory,上面介绍了linux系统上以及windows系统上如何正确安装。大家依照安装步骤基本能够完成安装,但是可能由于缺少经验或者相关的知识导致启动webUi界面运行相应内容时…...

汽车无人驾驶系统中的防撞设计

一、系统方案介绍 无人驾驶汽车的防撞系统是保障行车安全的核心模块,本文设计的系统以STM32F103C8T6单片机为主控制器,结合超声波测距、WiFi通信、人机交互等模块,实现障碍物实时检测、动态阈值设置、多级报警和数据可视化功能。系统通过软…...

sql server 版本更新日期

SQL Server 2019 内部版本(KB4518398) - SQL Server | Microsoft Learn SQL Server 的最新更新和版本历史记录 - SQL Server | Microsoft Learn sql server 2019 版本更新时间和补丁版本号...

Linux网络 DNS

DNS(Domain Name System) TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序 , 但是 IP 地址不方便记忆。于是人们发明了一种叫主机名的东西, 是一个字符串 , 并且使用 hosts 文件来描述主机名和 IP 地址的关系 。 最初 , 通过互连网信息中…...

EMQX中不同端口对应的接入协议

使用tcp接入时应使用mqtt://IP:1883 使用ws接入时应使用ws://IP:8083...

SpringBoot原理-03.自动配置-方案

一.自动配置原理 探究自动配置原理,就是探究spring是如何在运行时将要依赖JAR包提供的配置类和bean对象注入到IOC容器当中。我们当前准备一个maven项目itheima-utils,这里面定义了bean对象以及配置类,用来模拟第三方提供的依赖,首…...

Python 如何实现烟花效果的完整代码

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...

Winbox5怎样设置上网

要让连接到交换机的设备都能上网,需在MikroTik路由器(通过WinBox配置)上完成以下步骤。假设您的网络拓扑是:外网IP配置在路由器的WAN口,内网设备通过交换机连接到路由器的LAN口。 步骤 1:配置内网接口&…...

(KTransformers) RTX4090单卡运行 DeepSeek-R1 671B

安装环境为:ubuntu 22.04 x86_64 下载模型 编辑文件vim url.list 写入如下内容 https://modelscope.cn/models/unsloth/DeepSeek-R1-GGUF/resolve/master/DeepSeek-R1-Q4_K_M/DeepSeek-R1-Q4_K_M-00001-of-00009.gguf https://modelscope.cn/models/unsloth/Dee…...

【软考-架构】1.2、指令系统-存储系统-cache

GitHub地址:https://github.com/tyronczt/system_architect ✨资料&文章更新✨ 指令系统 计算机指令执行过程:取指令一一分析指令一一执行指令三个步骤,首先将程序计数器PC中的指令地址取出,送入地址总线,CPU依据…...

CI/CD与容器化技术核心知识点的QA

CI/CD与容器化技术核心知识点的Q&A 以下是CI/CD和容器化技术的经典必考面试题及详解,结合行业实践与理论核心整理而成: 一、CI/CD核心概念与流程 简述CI/CD的核心目标与实现价值 答案:通过自动化流水线实现快速、可靠的软件交付,减少人工干预,提升开发与运维协作效率…...

动态规划刷题

文章目录 动态规划三步问题题目解析代码 动态规划 1. 状态表示:dp[i],表示dp表中i下标位置的值 2. 状态转移方程:以i位置位置的状态,最近的一步来划分问题,比如可以将状态拆分成前状态来表示现状态,dp[i] …...

不谓侠--记录

音乐《不谓侠》 衣襟上 别好了晚霞 余晖送我牵匹老马 正路过 烟村里人家 恰似当年故里正飞花 醉过风 喝过茶 寻常巷口寻个酒家 在座皆算老友 碗底便是天涯 天涯远 无处不为家 蓬门自我也像广厦 论意气 不计多或寡 占三分便敢自称为侠 刀可捉 拳也耍 偶尔闲来…...

2025-03-01 学习记录--C/C++-C语言 整数类型对比

C语言 整数类型对比 类型位数范围(有符号)范围(无符号)格式化符号char8-128 到 1270 到 255%c 或 %hhdshort16-32,768 到 32,7670 到 65,535%hdint32-2,147,483,648 到 2,147,483,6470 到 4,294,967,295%dlong32 或 64-2,147,483…...

Python核心技术,Django学习基础入门教程(附环境安装包)

文章目录 前言1. 环境准备1.1Python安装1.2选择Python开发环境1.3 创建虚拟环境1.4 安装 Django 2. 创建 Django 项目3. Django项目结构介绍4. 启动开发服务器5. 创建 Django 应用6. 应用结构介绍7. 编写视图函数8. 配置 URL 映射9. 运行项目并访问视图10. 数据库配置与模型创建…...

MFC中CMutex类和CSingleLock类,配合使用疑惑

在使用CMutex过程中,看到别人使用了CSingleLock类,想着明明CMutex已经可以实现线程同步了,为什么还有使用CSingleLock类呢? 在MFC中,虽然CMutex类本身可以实现线程同步,但通常会与CSingleLock类一起使用&am…...

爬虫系列之【数据解析之正则】《二》

目录 前言 一、正则基本使用 1.1 导包 1.2 接口方法 1.3 换行匹配问题 二、实战案例 完整代码 前言 在爬虫工作中,我们主要会遇到两种类型的文本数据: JSON格式数据 HTML文档数据 对于JSON字符串数据,通常使用Python的字典操作进行键…...

HTML AI 编程助手

HTML AI 编程助手 引言 随着人工智能技术的飞速发展,编程领域也迎来了新的变革。HTML,作为网页制作的基础语言,与AI技术的结合,为开发者带来了前所未有的便利。本文将探讨HTML AI编程助手的功能、应用场景以及如何利用它提高编程…...

RFID工具柜DW-G104R|智能存储,便捷高效

一、行业背景 RFID智能工具柜(DW-G104R)RFID工具管理柜是一种结合RFID技术和智能柜设备的新型工具管理设施,通过自动化管理可以提高工具管理的效率和准确性。 在工业生产中,工具柜是工具存储和管理的重要设备。传统工具柜存在管…...

【前端面试】如何不通过正则:验证IP地址合法性

前言 在 Web 开发中,验证用户输入的 IP 地址是否合法是一个常见需求 面试中也会问到 通常,我们会使用正则表达式来完成这个任务,因为它简洁高效。然而,正则表达式对于初学者来说可能有些晦涩难懂。本文将介绍一种不使用正则表达…...