微信公众号如何做微网站,seo长尾关键词排名,惊艳的网站设计,wordpress图片左对齐通过创建一个最小的根文件系统#xff0c;并使用QEMU和GDB进行调试。
1.准备工作环境
确保系统上安装了所有必要的工具和依赖项。
sudo apt-get update //更新一下软件包
sudo apt-get install build-essential git libncurses-dev bison flex libssl-dev qemu-system-x…通过创建一个最小的根文件系统并使用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安装编译工具链其中包含了gccGNU编译器集合用于C/C程序、gGNU C编译器、make构建工具用于自动化编译和安装、libc-devC标准库的开发文件。 git分布式版本控制系统。libncurses-dev提供字符终端处理库的开发文件。在编译和配置内核的时候需要依赖此库。bisonGNU解析器生成器。用于生成语法分析器Parser在编译内核时可能会使用。flex快速词法分析器生成器。配合bison使用。libssl-dev解密一些协议在内核模块可能使用。qemu-system-x86QEMU的x86系统模拟器。用于模拟x86架构的虚拟机支持运行操作系统内核或完整系统。gdbGNU调试器。用于调试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/shBourne 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 --formatnewc | 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打断点进行调试了。(*^▽^*)