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 #在內(nèi)核和內(nèi)核模塊中包含調(diào)試信息
CONFIG_FRAME_POINTER=y #將調(diào)用幀信息保存在寄存器或堆棧上的不同位置,使gdb在調(diào)試內(nèi)核時可以更準確地構造堆棧回溯跟蹤(stack back traces)。CONFIG_GDB_SCRIPTS=y
CONFIG_KGDB=y #啟用內(nèi)置的內(nèi)核調(diào)試器,該調(diào)試器允許進行遠程調(diào)試
CONFIG_DEBUG_INFO_REDUCED=n
CONFIG_RANDOMIZE_BASE=n #KASLR會更改引導時放置內(nèi)核代碼的基地址, 無法從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 #編譯內(nèi)核映像文件
sudo make modules #編譯模塊
sudo make modules_install #安裝模塊
sudo make install #安裝內(nèi)核
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系統(tǒng)
調(diào)試機: Ubuntu 20.04.5 LTS虛擬機,安裝在VMware上,內(nèi)核版本為5.4.0-156
被調(diào)試機:QEMU虛擬機,使用新編譯的內(nèi)核6.4.11版本和自制的簡易文件系統(tǒng)
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:指定啟用的內(nèi)核鏡像;
-initrd ./rootfs.img:指定啟動的內(nèi)存文件系統(tǒng);
-append "nokaslr console=ttyS0":附加參數(shù),其中 參數(shù)必須添加進來,防止內(nèi)核起始地址隨機化,這樣會導致 gdb 斷點不能命中;參數(shù)說明可以參見這里。nokaslr
-s:監(jiān)聽在 gdb 1234 端口;
-S:表示啟動后就掛起,等待 gdb 連接((CPU 初始化之前凍結(jié)起來);
-nographic:不啟動圖形界面,調(diào)試信息輸出到終端與參數(shù) 組合使用;console=ttyS
cd /usr/src/linux-6.4.11/
gdb vmlinux
target remote :1234
b start_kernel
b rest_init
c