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

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

相关文章:

  • 【JUC】显示锁
  • 【计算机常识】--docker入门+docker desktop的使用(一)
  • 【JAVA】的SPI机制
  • 对象模型与LLM融合:人形机器人的智能革命与产业化路径
  • 基于Cookie和Session的模拟登录爬取实战:突破登录认证的高级技术
  • eps转pdf-2025年6月18日星期三
  • 【为什么在触发的事件中修改控件属性需要使用`Invoke`】
  • 轻量化分布式AGI架构:基于区块链构建终端神经元节点的互联网智脑
  • python实战项目75:爬取nature《自然》杂志论文信息
  • tomcat 配置规范
  • 【Python与生活】如何实现一个条形码检测算法?
  • 排序算法专题
  • mac镜像拉取失败,修改镜像源为国内
  • 深入解析协程:高并发编程的轻量级解决方案
  • SQL 盲注(Blind SQL Injection)
  • Mac OS上安装Redis
  • 【windows常见文件后缀】
  • MongoDB学习记录(快速入门)
  • MYSQL进阶超详细总结2.0
  • 2024-2025学年度下期《网页设计》期末模拟测试
  • 网站建设和网络推广是干嘛/朋友圈广告推广代理
  • 医院导航网站怎么做/百度人工服务电话
  • 甘肃省住房和城乡建设厅网站/西安seo外包优化
  • 网站建设文翻译工作/如何自己建立一个网站
  • 设计公司网站公司详情/多地优化完善疫情防控措施
  • 管理网站建设/南京广告宣传公司seo