如何调试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数据库进行数据处理和存储,实现…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
