cd /usr/src
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.4.11.tar.xz
tar -xf linux-6.4.11.tar.xz
cd /usr/src/linux-6.4.11
sudo apt install libncurses5-dev libssl-dev bison flex libelf-dev gcc make openssl libc6-dev dwarves
CONFIG_DEBUG_INFO=y #在内核和内核模块中包含调试信息
CONFIG_FRAME_POINTER=y #将调用帧信息保存在寄存器或堆栈上的不同位置,使gdb在调试内核时可以更准确地构造堆栈回溯跟踪(stack back traces)。CONFIG_GDB_SCRIPTS=y
CONFIG_KGDB=y #启用内置的内核调试器,该调试器允许进行远程调试
CONFIG_DEBUG_INFO_REDUCED=n
CONFIG_RANDOMIZE_BASE=n #KASLR会更改引导时放置内核代码的基地址, 无法从gdb设置断点
CONFIG_SYSTEM_TRustED_KEYS=""
CONFIG_SYSTEM_REVOCATION_KEYS=""
No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.
sudo make -j8
sudo make bzImage #编译内核映像文件
sudo make modules #编译模块
sudo make modules_install #安装模块
sudo make install #安装内核
wget https://busybox.NET/downloads/busybox-1.36.1.tar.bz2
tar -xvf busybox-1.36.1.tar.bz2
make busybox install
mkdir rootfs
cd rootfs/
cp -r ../busybox-1.36.1/_install/bin/ .
cp -r ../busybox-1.36.1/_install/sbin/ .
cp -r ../busybox-1.36.1/_install/usr/ .
mkdir dev proc sys
cd ..
chmod 777 -R rootfs/
cd rootfs/
touch init
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
setsid cttyhack /bin/sh
chmod 777 init
find . | cpio -R root:root -H newc -o | gzip > ../rootfs.gz
物理机:windows系统
调试机: Ubuntu 20.04.5 LTS虚拟机,安装在VMware上,内核版本为5.4.0-156
被调试机:QEMU虚拟机,使用新编译的内核6.4.11版本和自制的简易文件系统
apt install qemu qemu-utils qemu-kvm virt-manager libvirt-daemon-system libvirt-clients bridge-utils
qemu-system-x86_64 -kernel /usr/src/linux-6.4.11/arch/x86_64/boot/bzImage -initrd /home/kernel/rootfs.gz -Append "nokaslr console=ttyS0" -s -S -nographic
qemu-system-x86_64 -kernel ./bzImage -initrd ./rootfs.img -append "nokaslr console=ttyS0" -nographic
-kernel ./bzImage:指定启用的内核镜像;
-initrd ./rootfs.img:指定启动的内存文件系统;
-append "nokaslr console=ttyS0":附加参数,其中 参数必须添加进来,防止内核起始地址随机化,这样会导致 gdb 断点不能命中;参数说明可以参见这里。nokaslr
-s:监听在 gdb 1234 端口;
-S:表示启动后就挂起,等待 gdb 连接((CPU 初始化之前冻结起来);
-nographic:不启动图形界面,调试信息输出到终端与参数 组合使用;console=ttyS
cd /usr/src/linux-6.4.11/
gdb vmlinux
target remote :1234
b start_kernel
b rest_init
c