如何调试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…...
ECharts组件封装教程:Vue3中的实践与探索
在日常的前端开发中,ECharts 作为一款强大且易用的图表库,被广泛应用于数据可视化场景。为了更好地在 Vue3 项目中复用 ECharts 功能,我们可以将其封装成一个组件。本文将带大家一步步实现 ECharts 的 Vue3 组件封装,并演示如何在父组件中调用和使用。 一、封装 ECharts 组…...

NAT 代理服务 内网穿透
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 NAT 技术背景二:🔥 NAT IP 转换过程三:🔥 NAPT四:🔥 代理服务器🦋 正向…...

CAN硬件协议详解
一、基本理论: 1、CAN的总线结构: CAN总线 网络结构 有 闭环和开环 两种形式;无论实际的网络多复杂,都离不开这两种基本结构。 闭环结构的CAN总线网络,总线的两端各并联一个120Ω的电阻,两…...

网络安全等级保护:网络安全等级保护基本技术
下面我们概括性探讨一下等级保护用到的一些技术,有关这些技术的每一个方面的每一个部分都可以是一部大块头,甚至一部大块头都无法介绍清楚,需要系列性的书籍去展开,所以这里也只能做到抛砖而已。期望起到抛砖引玉的作用࿰…...

信刻光盘安全隔离与信息交换系统让“数据摆渡”安全高效
随着数据传输、存储及信息技术的飞速发展,信息安全保护已成为重中之重。各安全领域对跨网数据交互的需求日益迫切,数据传输的安全可靠性成为不可忽视的关键。为满足业务需求并遵守保密规范,针对于涉及重要秘密信息,需做到安全的物…...

数据结构课程设计(java实现)---九宫格游戏,也称幻方
【问题描述】 九宫格,一款数字游戏,起源于河图洛书,与洛书是中国古代流传下来的两幅神秘图案,历来被认为是河洛文化的滥觞,中华文明的源头,被誉为"宇宙魔方"。九宫格游戏对人们的思维锻炼有着极大…...
[思考记录]AI时代下,悄然的改变
尝试用 xAI-Grok 去了解DS开源周的信息,有那么点被Grok的输出惊艳到。“请你以技术编辑的角色,重点参考官方文档,介绍DeepSeek开源周的内容,写一篇技术分享文章。”,得到的文字看起来很是舒服,内容靠谱、结…...
JAVA笔记【一】
现实 (抽象) 类 (创建) 对象 特点: 1.面向对象 2.跨平台 3.安全性 4.多线程 java程序基本结构 1. java源代码文件实际是普通的文本文件,源代码文件必须是.java扩展名,且必须小写 2. …...
[Java基础] 常用注解
文章目录 1. 元注解2. 非元注解2.1 常用JDK自带注解2.2 常用Spring相关注解2.2.1 在Spring框架中,注解用于简化配置和增强代码的可读性。以下是常用的Spring注解的一部分2.2.2 针对controller的相关注解2.2.3 AOP相关注解2.2.4 Enable系列注解 2.3 常用Lombok注解 1…...
uvm中的run_test作用
在SystemVerilog和UVM验证环境中,run_test() 是启动UVM仿真流程的核心函数。它负责初始化UVM框架、创建测试用例实例,并触发UVM的Phase机制来执行验证环境的构建和运行 1. run_test() 的作用 run_test() 是UVM提供的内置函数,定义在UVM库中…...
brew search报错,xcrun:error:invalid active developer path CommandLineTools
问题出现的原因 出现“xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun”错误,通常是因为Xcode命令行工具未正确安装或其路径已损坏。以下是几种常见的…...
C#内置委托(Action)(Func)
概述 在 C# 中,委托是一种类型,它表示对具有特定参数列表和返回类型的方法的引用。C# 提供了一些内置委托,使得开发者可以更方便地使用委托功能,无需手动定义委托类型。本文将详细介绍 Action 和 Func 这两个常用的内置委托。 A…...
kubernetes 部署项目
随着容器化技术的发展,使用Kubernetes(简称K8s)来部署和管理应用已经成为现代软件开发的标准实践之一。Kubernetes提供了一套强大的工具集,使得部署、扩展和管理应用程序变得更为简便高效。本文将带你走过从准备环境到部署一个实际…...

《几何原本》命题I.2
《几何原本》命题I.2 从一个给定的点可以引一条线段等于已知的线段。 设 A A A 为给定点, B C BC BC 为给定线段 连接 A B AB AB,作等边 △ A B D \triangle ABD △ABD 以 B B B 为圆心, B C BC BC 为半径作小圆 延长 D B DB DB 交小圆…...

【我的 PWN 学习手札】House of Kiwi
House of Kiwi 之前我们利用IO_FILE一般是通过劫持vtable来实现的, House of Kiwi虽然不是通过劫持vtable来实现,但实质上是劫持vtable指向的全局的_IO_file_jumps_表来实现的。注意:对于某些版本的glibc,_IO_file_jumps_并不可写…...
nvm的学习
学习 nvm(Node Version Manager) 是掌握 Node.js 开发的关键技能之一。以下是系统的学习路径和实战指南,涵盖从基础到进阶的内容: 一、基础入门 1. nvm 的核心作用 多版本共存:安装和管理多个 Node.js 版本ÿ…...

haclon固定相机位标定
什么是标定? 工业应用中相机拍到一个mark点的坐标为C1(Cx,Cy),C1点对应的龙门架/机械手等执行端对应的坐标是多少? 标定就是解决这个问题,如相机拍到一个点坐标C1(Cx,Cy),…...

stm32(hal库)学习笔记-时钟系统
在stm32中,时钟系统是非常重要的一环,他控制着整个系统的频率。因此,我们有理由好好学一下时钟系统。 什么是时钟? 时钟是具有周期性的脉冲信号,一般我们常用占空比为50%的方波。可以形象的说,时钟就是单…...

【Java项目】基于SpringBoot的财务管理系统
【Java项目】基于SpringBoot的财务管理系统 技术简介:采用Java技术、SpringBoot框架、MySQL数据库等实现。系统基于B/S架构,前端通过浏览器与后端数据库进行信息交互,后端使用SpringBoot框架和MySQL数据库进行数据处理和存储,实现…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...