简说linux笔记总结:https://www.bilibili.com/opus/524289977842234888
0.环境准备及内核编译
apt-get update
apt install build-essential //安装make和gcc等
apt-get install libncurses5-dev //安装ncurses-devel
apt-get install flex //安装flex
apt-get install bison //安装bison
apt install libelf-dev
apt install libssl-dev
apt-get install qemu-system
# 解压文件
sudo tar -xf linux-4.9.229.tar.xz
# 进入目标目录
cd linux-4.9.229
# make操作
export ARCH=x86
make x86_64_defconfig
make menuconfig
按如下步骤配置kgdb调试功能
General setup --->
----> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
Device Drivers --->
[*] Block devices --->
<*> RAM block device support
(65536) Default RAM disk size (kbytes)
特别注意:<*> RAM block device support的选项必须为“<*>”,而不是”M”
# 开始编译
make -j8
# 安装QEMU
sudo apt-get install qemu-system
以下是基于 BusyBox 最新版本制作根文件系统的完整、详细步骤,按照顺序执行即可:
1. 下载并编译 BusyBox
1.1 下载源码
从 BusyBox 官方网站下载源码,并解压到工作目录:
wget https://busybox.net/downloads/busybox-1.30.0.tar.bz2
tar -xjf busybox-1.30.0.tar.bz2
cd busybox-1.30.0
1.2 配置 BusyBox
使用 make menuconfig
配置 BusyBox:
make menuconfig
在配置界面中:
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
1.3 编译 BusyBox
使用 make
编译:
make && make install
编译完成后的busybox就安装在源码根目录下的_install目录,进入_install目录,补充一些必要的文件或目录:
mkdir etc dev mnt
mkdir -p proc sys tmp
mkdir -p etc/init.d/
nano etc/fstab
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
nano etc/init.d/rcS
echo -e "Welcome to tinyLinux by Kinbos..."
/bin/mount -a
echo -e "Remounting the root filesystem"
mount -o remount,rw /
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
chmod 755 etc/init.d/rcS
nano etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
chmod 755 etc/inittab
cd dev
mknod console c 5 1
mknod null c 1 3
mknod tty1 c 4 1
开始制作根文件系统镜像:(在_install父级目录)
先制作一个空的镜像文件;
然后把此镜像文件格式化为ext3格式;
然后把此镜像文件挂载,并把根文件系统复制到挂载目录;
卸载该镜像文件。
打成gzip包。
#!/bin/bash
rm -rf rootfs.ext3
rm -rf fs
dd if=/dev/zero of=./rootfs.ext3 bs=1M count=32
mkfs.ext3 rootfs.ext3
mkdir fs
mount -o loop rootfs.ext3 ./fs
cp -rf ./_install/* ./fs
umount ./fs
gzip --best -c rootfs.ext3 > rootfs.img.gz
开始启动QEMU:(如果要kgdb调试需要追加 -s -S)
qemu-system-x86_64 \
-kernel ./linux-5.19/arch/x86_64/boot/bzImage \
-initrd ./busybox-1.37.0/rootfs.img.gz \
-append "root=/dev/ram init=/linuxrc nokaslr" \
-serial file:output.txt -s -S
gdb调试:
gdb ./linux-4.9.229/vmlinux
target remote localhost:1234
用vscode打开内核代码:
#注意参数:--user-data-dir=/root,否则无法保存
code --user-data-dir=/root linux-5.19
在launch.json中配置,如果没有这个文件可以手动创建。
{
"version": "0.2.0",
"configurations": [
{
"type": "cppdbg",
"request": "launch",
"name": "kernel GDB",
"program": "${workspaceFolder}/vmlinux",
"cwd":"${workspaceFolder}",
"MIMode":"gdb",
//"miDebuggerPath":"/usr/bin/gdb-multiarch",
"miDebuggerServerAddress": "localhost:1234",
"stopAtConnect": true,
},
]
}
在运行qemu-system-x86_64命令后按F5开始调试:
qemu-system-x86_64 \
-kernel ./linux-5.19/arch/x86_64/boot/bzImage \
-initrd ./busybox-1.37.0/rootfs.img.gz \
-append "root=/dev/ram init=/linuxrc nokaslr" \
-serial file:output.txt -s -S