1. 程式人生 > >Kernel 內核調試

Kernel 內核調試

roc 包管理 區域 info count 圖形 下載 win 目標

本機環境 Win7 + VMware 14 Pro

1.安裝Qemu,Ubuntu包管理器中的二進制版本比較老了,這裏選擇源碼安裝2.12.0版本。

具體的安裝教程可以參考這篇文章《QEMU 2.10.1 編譯安裝》,寫的非常詳細。

2.下載、編譯目標的內核版本

這裏下載的是4.4.1版本的Linux內核 linux-4.4.1.tar.xz

解壓 編譯

xz - d   linux-4.4.1.tar.xz

tar -xvf  linux-4.4.1.tar

cd linux-4.4.1

make menuconfig

確保以下三個選項是勾選上的:

kernel hacking –> Kernel debugging
kernel hacking –> Compile-time checks and compiler options –> compile the kernel with debug info
kernel hacking –> Compile-time checks and compiler options -> compile the kernel with frame pointers

在多核平臺上使用-j 參數來加快編譯

make -j

3.制作根文件系統

先了解以下幾個文件的區別,參考這篇文章

vmlinux 是ELF文件,即編譯出來的最原始的文件。 

vmlinuz 應該是由ELF文件vmlinux經過OBJCOPY後,並經過壓縮後的文件 

zImage 是vmlinuz經過gzip壓縮後的文件,適用於小內核

bzImage 是vmlinuz經過gzip壓縮後的文件,適用於大內核

新建一個目錄用於存放生成的內核文件,以及根文件系統:

mkdir ~/Desktop/kernel-debug

cp   ./arch/x86/boot/bzImage  ~/Desktop/kernel-debug

cd  ~/Desktop/kernel-debug

dd if=/dev/zero of=rootfs.img bs=1M count=20  #新建一個20M的文件

mkfs -t ext3 rootfs.img #將其格式化為ext3文件系統格式

#將其mount 到新創建到目錄rootfs上 

mkdir rootfs 

sudo mount -t ext3 -o loop rootfs.img rootfs 

#將掛載後的根文件系統中建立基本的目錄結構

sudo mkdir rootfs/dev rootfs/proc rootfs/sys

給系統安裝基本的命令行工具,比如ls,這裏選擇了BusyBox,下載的BusyBox源碼

cd ~/Desktop/kernel-debug
tar -jxvf busybox-1.28.3.tar.bz2
cd busybox-1.28.3
#進行配置,註意這裏選擇靜態連接的方式生成可執行文件,避免對外部lib有依賴 make menuconfig
#勾選Settings->Build Busybox as a static binary make -j #編譯完成後,安裝到目標的根文件系統中去,然後unmount掉根文件系統 make install CONFIG_PREFIX=~/Desktop/kernel-debug/rootfs
sudo umount ~/Desktop/kernel-debug/rootfs

  

4.啟動Qemu虛擬機

sudo qemu-system-x86_64  -S -kernel ~/Desktop/kernel-debug/bzImage -hda ~/Desktop/kernel-debug/rootfs.img -append "root=/dev/sda init=/bin/ash"

此時啟動的Qemu處於Pasued狀態,單機黑色區域,讓Qemu接收輸入,按下ctrl+ alt + 2,切換到控制臺。

註意之後可以通過ctrl + alt + G 來讓qemu釋放鼠標以及鍵盤輸入。

技術分享圖片

啟動gdbserver,監聽到8888端口,便於用GDB來遠程調試。

技術分享圖片

5.使用GDB連接到gdbserver進行調試

由於GDB用的不太熟悉,這裏使用圖形化的調試工具DDD,可以通過以下命令安裝:

sudo apt-get install ddd
#切換到之前linux編譯的目錄
cd linux-4.4.1
#選擇未壓縮的內核文件,讀入符號表
ddd vmlinux

在GDB命令處,連接到Qemu中的GDB server:target remote 127.0.0.1:8888,這個時候Qemu中的Linux系統是處於Paused狀態的。

連接之後可以在菜單欄Status-->BackTrace...中看到堆棧信息。

技術分享圖片

輸入continue,讓Qemu中的Linux系統運行起來,可以在Qemu中按下ctrl+Alt+1,切換到虛擬機的命令行界面,可以看到這個時候虛擬機已經正常運行起來了。

技術分享圖片

這裏對Linux創建進程的系統調用下斷點,觀察調用棧:

在fork.c文件中的_do_fork函數處下斷點:

技術分享圖片

切換到Qemu,使用ctrl+Alt+1回到Linux的控制臺,運行ls,這時候shell會創建ls進程,這個時候ddd就會斷下來了:

技術分享圖片

Kernel 內核調試