linux内核调试

1. 前置安装

1.1 编译好的内核

参考:
https://blog.csdn.net/qq_51950769/article/details/148596916

1.2 编译busybox

BusyBox 是一个非常轻量级的多合一工具箱,常被称为“Linux 的瑞士军刀”。
简单来说:
它把很多常用的 Linux 命令(比如 ls、cp、mv、sh、mount 等)集成到一个单一的可执行文件里。适合用于资源有限的环境,比如嵌入式系统、initramfs、恢复系统等。
为什么用 BusyBox?

  • 体积小:比安装完整的 GNU 工具链省空间很多;
  • 方便:一个文件搞定常用命令;
  • 灵活:可以自定义编译,裁剪只需要的命令。
# 下载源码
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -xjf busybox-1.36.1.tar.bz2
cd busybox-1.36.1# 配置(选择你想要的功能)
make menuconfig# 编译
make -j$nproc# 安装到指定目录(方便打包initramfs)
make CONFIG_PREFIX=../busybox-root install# 或者默认安装, 后续制作根文件系统采用这种方式
make install

成功安装后:
在这里插入图片描述
查看安装目录的文件,tree
在这里插入图片描述

1.3 根文件系统的制作

根文件系统提供操作系统运行所需的基本工具和环境。它包含启动程序(如 init),负责启动用户空间进程。
没有根文件系统,内核是“裸”的,无法完成完整的系统启动和运行;根文件系统为系统提供了完整的用户空间环境。

  1. 准备根文件系统目录
进入到busybox的目录
cd busybox-1.36.1/
root@ubantu64:~/busybox-1.36.1# ls
applets     busybox_ldscript.README.txt  configs        editors    INSTALL      mailutils               miscutils          procps                  shell                   util-linux
applets_sh  busybox.links                console-tools  examples   klibc-utils  Makefile                modutils           qemu_multiarch_testing  size_single_applets.sh
arch        busybox_unstripped           coreutils      findutils  libbb        Makefile.custom         networking         README                  sysklogd
archival    busybox_unstripped.map       debianutils    include    libpwdgrp    Makefile.flags          NOFORK_NOEXEC.lst  runit                   testsuite
AUTHORS     busybox_unstripped.out       docs           init       LICENSE      Makefile.help           NOFORK_NOEXEC.sh   scripts                 TODO
busybox     Config.in                    e2fsprogs      _install   loginutils   make_single_applets.sh  printutils         selinux                 TODO_unicode
root@ubantu64:~/busybox-1.36.1# cd _install/
root@ubantu64:~/busybox-1.36.1/_install##创建目录
mkdir -p etc/init.d mnt tmp sys dev proc 

结果:
在这里插入图片描述

  1. 创建文件系统表(fstab)
vim etc/fstab
proc	/proc	proc	defaults	0	0
tmpfs	/tmp	tmpfs	defaults	0	0
sysfs	/sys	sysfs	defaults	0	0

如图:
在这里插入图片描述

  1. 创建启动脚本rcS
vim etc/init.d/rcSecho -e "Welcome to tinyLinux"
/bin/mount -a
mount  -o  remount,rw  /
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

如图:
在这里插入图片描述
给rcS可执行权限chmod 755 rcS。

  1. 创建初始化程序配置文件inittab
vim etc/inittab::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r

如图:
在这里插入图片描述

  1. 创建设备文件节点
cd dev
mknod console c 5 1
mknod null c 1 3
mknod tty1 c 4 1

在这里插入图片描述

  1. 镜像制作
    (1) 创建一个空的镜像,并把这个镜像文件格式化为ext4
    (2) 挂载到一个空的目录,并把_install/*等启动文件复制到这个镜像中
    (3) 卸载镜像文件
    (4) 使用gzip进行压缩
# 先创建一个空的镜像并格式化为ext4
mkdir ~/image
cd ~/image
dd if=/dev/zero of=./rootfs.ext4 bs=1M count=32
mkfs.ext4 rootfs.ext4
# 创建一个空目录fs
mkdir fs
# 挂载到fs,并复制启动文件
mount -o loop rootfs.ext4 ./fs
cp -rf busybox-1.36.1/_install/* ./fs
#卸载镜像文件
umount ./fs
# 使用gzip压缩
gzip --best -c rootfs.ext4 > rootfs.img.gz

最终结果:
在这里插入图片描述

1.4 安装qemu-system-x86_64

qemu-system-x86_64 是什么?
qemu-system-x86 是 QEMU 提供的一个用于模拟 x86 架构(如 x86_64 或 i386)计算机系统的可执行程序。简单来说:它可以在你的电脑上虚拟出一个完整的 x86 电脑,用来运行操作系统、测试内核、开发系统级软件等。

apt install qemu-system-x86

2. 内核调试

进行内核调试,我们需要使用两个命令:

2.1 qemu-system-x86_64

qemu-system-x86_64主要用来启动一个内核。

qemu-system-x86_64 \-kernel ~/linux-5.10.126/arch/x86/boot/bzImage \-initrd ~/kernal/rootfs.img.gz \-append "root=/dev/ram init=/linuxrc" \-serial file:output.txt

参数解释:

  • -kernel 指定要加载的 Linux 内核镜像(通常是 bzImage 格式)。
  • -initrd :指定 initrd(初始化内存盘)文件,系统启动时会加载到内存中,通常用于提供根文件系统。
  • -append:传递给内核的启动参数,这里是指定root=/dev/ram:告诉内核从 RAM 磁盘(initrd)挂载根文件系统。
    init=/linuxrc:指定初始化进程为 /linuxrc。
  • -S:启动时暂停 CPU
  • -s:在 TCP 端口 1234 上开启 GDB 服务器

扩展参数:

  • -nographic:禁用图形输出,所有输出(包括串口输出)将重定向到终端(即你运行命令的终端窗口),用于无头(headless)运行。
  • -smp 是 QEMU 中用于指定虚拟机的 CPU 配置的参数,全称是 “Symmetric Multi-Processing”(对称多处理)。
  • -m 是 QEMU 中用于指定 虚拟机内存大小 的参数。
  • -cpu 是 QEMU 中用于指定虚拟 CPU 类型和特性的参数。
  • -enable-kvm,用于启用 KVM(Kernel-based Virtual Machine)硬件加速。
  • -serial: 串口(Serial Port):在 QEMU 虚拟机中,串口是一个虚拟的通信接口,通常用于内核调试、系统日志输出或与外部工具交互。file:output.txt:将虚拟机的串口输出写入到当前目录下的 output.txt 文件中(如果文件不存在会自动创建,已存在则会覆盖)。

不使用图像化启动命令:

qemu-system-x86_64 \-kernel ~/linux-5.10.126/arch/x86/boot/bzImage \-initrd ~/kernal/rootfs.img.gz \-append "root=/dev/ram init=/linuxrc console=ttyS0" \-nographic \-serial mon:stdio \-monitor none

2.2 gdb

执行:

gdb vmlinux

在这里插入图片描述
在执行:

target remote :1234

在这里插入图片描述

此时qemu中跑的linux内核:
在这里插入图片描述

最后在提醒:想调试的话,最好把Makefile中的编译选项全部从O2改为O1
在这里插入图片描述

3 参考文章

https://zhuanlan.zhihu.com/p/17345710829
https://blog.csdn.net/weixin_37867857/article/details/88205130

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/85266.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/85266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是曲面细分

什么是曲面细分 在CAD格式中,通常使用曲线和数学函数来定义曲面和实体。这些曲面的精确度和光滑度非常适用于制造过程。但是,现代GPU芯片针对由三角形网格体组成的曲面的渲染计算进行了高度优化。通常,实时渲染器和虚幻之类的游戏引擎只能处…

CANFD加速是什么?和CANFD有什么区别?

文章目录 摘要什么是CANFD加速?CAN FD的基本原理:仲裁阶段(Arbitration Phase):数据阶段(Data Phase):关键特性:优势:总结摘要 下面的截图,大家肯定不陌生,在使用CAN设备上位机的时候,已经选择了CANFD,但还有一个选项是“CANFD加速”,那CANFD加速和不加速有什么…

minio 启动失败--Incorrect Usage: flag provided but not defined: -consoleaddress

根据错误信息 flag provided but not defined: -consoleaddress,这表明 Minio 服务启动时使用了未定义的命令行参数 --consoleaddress,导致启动失败。这个问题与 Minio 版本兼容性有关。 问题原因 参数名称变更: Minio 版本 > RELEASE.20…

基于Rust的Polars学习笔记

基于Rust的Polars学习笔记 Polars 学习笔记 Cargo.toml通用配置 [package] name = "rustP" version = "0.1.0" edition = "2024"[dependencies] polars = { version = "0.48.1", features = ["full"]}Quickstart use po…

SpringBoot扩展——定时任务!

定时任务 项目开发中会涉及很多需要定时执行的代码,如每日凌晨对前一日的数据进行汇总,或者系统缓存的清理、对每日的数据进行分析和总结等需求,这些都是定时任务。单体系统和分布式系统的分布式任务有很大的区别,单体系统就一个…

RTDETRv2 pytorch 官方版自己数据集训练遇到的问题解决

rtdetrv2 训练问题遇到的问题。 pip install torch2.0.1 torchvision0.15.2 torchaudio2.0.2 --index-url https://download.pytorch.org/whl/cu117 1 Please make sure torchvision version > 0.15.2 发现自己实际装的是 torchvison0.15.2cu117 修改_misc.py中修改为…

Linux系统移植⑤:uboot启动流程详解-board_init_f执行过程

Linux系统移植⑤:uboot启动流程详解-board_init_f执行过程 _main 中会调用 board_init_f 函数。 board_init_f 函数主要有两个工作: ①初始化一系列外设,比如串口、定时器,或者打印一些消息等。 ②初始化 gd 的各个成员变量&am…

Git命令与代码仓库管理

步骤一、完成Gitee码云上账号注册并新建代码仓库。 1.1 新建代码仓库 1.2 填写信息并创建 1.3 获取仓库地址 https://gitee.com/dog-kidney/2022082206.git 步骤二、建立本地代码仓库,并连接到远程代码仓库。 2.1初始化 git init 2.2添加仓库 git remote add o…

资源占用多,Linux 系统中如何降低 CPU 资源消耗并提升利用率?

在 Linux 系统中降低 CPU 资源消耗并提升利用率,需从系统服务优化、进程管理、资源调度及内核参数调整等多维度入手。以下是适用于各类 Linux 发行版的通用优化方案,涵盖基础操作与进阶策略: 一、服务与进程优化:减少无效资源占用 1. 关闭冗余系统服务 查看运行中的服务 …

技术与情感交织的一生 (八)

目录 融合 东西厂公 接风宴 头痛 “巴巴罗萨” 突击 推进 助攻 96小时 寒冬 食堂 反攻 消耗 Delphi 西厂 内困 外患 “敦刻尔克” 多线作战 大撤退 资源 融合 东西厂公 初次来到纸箱厂,是主厂区,感觉很大,相对西面正在…

webuploader分片上传示例,服务端上传文件到腾讯云CDN Teo 应用示例

本文环境:php7.3.4 CI3.0框架 一、大概步骤: (1)利用百度的webuploader插件,将大文件分片上传的自己的服务器 (2)利用腾讯云接口从本服务器上传到腾讯云 二、详细代码: 1、进入…

LeetCode 632.最小区间

你有 k 个 非递减排列 的整数列表。找到一个 最小 区间&#xff0c;使得 k 个列表中的每个列表至少有一个数包含在其中。 我们定义如果 b-a < d-c 或者在 b-a d-c 时 a < c&#xff0c;则区间 [a,b] 比 [c,d] 小。 示例 1&#xff1a; 输入&#xff1a;nums [[4,10,…

篇章五 系统性能优化——资源优化——CPU优化(2)

目录 1.高级并发模式 1.1 工作窃取&#xff08;Work Stealing&#xff09; 1.工作窃取模式 2.ForkJoinPool实现 3.具体例子 1.2 结构化并发&#xff08;Structured Concurrency&#xff09; 1.结构化并发模式 2.Java 19 的 StructuredTaskScope 3.具体例子 1.3 对比与…

《中国电信运营商骨干网:历史、现状与未来演进》系列 第四篇:后发先至——中国移动CMNET的快速扩张与IP专网布局

摘要&#xff1a; 本文深入探讨中国移动骨干网CMNET (AS9808) 的发展历程、网络架构及其与中国电信扁平化策略的差异。同时&#xff0c;解析其为承载高价值业务而构建的IP专用承载网的定位、结构与技术特点。最后&#xff0c;展望中国移动在5G、云计算和算力网络时代&#xff0…

R情感分析:解码文本中的情感

基于之前关于文本聚类和文本模型的博客&#xff0c;我们现在可以深入探讨一个经典主题 - 情感分析。情感分析通过计算方式识别和分类文本中的情感&#xff0c;帮助理解公众意见或消费者反馈。 什么是情感分析&#xff1f; 情感分析确定文本背后的情感基调&#xff0c;将其分类…

云徙渠道订货系统:赋能企业渠道管理的数字化引擎

在当今商业竞争日益激烈的环境下&#xff0c;企业如何高效管理和优化渠道成为关键问题。云徙渠道订货系统凭借其强大的数字化能力&#xff0c;为企业提供了全新的渠道管理解决方案&#xff0c;助力企业在复杂多变的市场环境中保持竞争力。 从渠道管理的痛点出发 传统渠道管理方…

Nacos基础使用(二):nacos作为配置中心

一、Nacos 配置中心核心属性 在学习nacos 作为配置中心的使用之前&#xff0c;先看下Nacos 作为配置中心时的三个属性&#xff0c;即&#xff1a; 命名空间、配置分组、配置集ID&#xff08;习惯称为配置文件ID&#xff09;&#xff1b;在使用Nacos 作为配置中心 的过程中可以通…

SpringBoot 插件化架构的4种实现方案

在复杂业务场景下&#xff0c;传统的单体应用架构往往面临着功能扩展困难、代码耦合严重、迭代效率低下等问题。 插件化架构作为一种模块化设计思想的延伸&#xff0c;能够使系统具备更好的扩展性和灵活性&#xff0c;实现"热插拔"式的功能扩展。 本文将介绍Spring…

VGG-19(Visual Geometry Group)模型

VGG-19 是由牛津大学视觉几何组和 Google DeepMind 的研究人员在 2014 年提出的一个非常经典的深度卷积神经网络模型。 一 核心结构 &#xff08;1&#xff09;深度&#xff1a; 模型名称中的 "19" 指的是模型拥有 19 层带有权重的层&#xff08;通常指&#xff1a;…

Windows11 鼠标卡死任务栏卡死 假死解决方法

最近很多朋友都有一个问题&#xff0c;就是Windows11电脑 在编辑文档或者是切换窗口的时候出现任务栏假死&#xff0c;鼠标左右键失灵等现象&#xff0c;想了几天解决方案今天吧最直接的方法教给大家 首发玖毅论坛 玖毅论坛https://www.webbbs.cn/ 第一步&#xff1a; 第一种…