Kernel 核心除錯【轉】
轉自:https://www.cnblogs.com/int80/p/10340282.html
本機環境 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
確保以下三個選項是勾選上的:
1 2 3 |
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 引數來加快編譯
1 |
make -j
|
3.製作根檔案系統
先了解以下幾個檔案的區別,參考這篇文章
1 2 3 4 5 6 7 |
vmlinux 是ELF檔案,即編譯出來的最原始的檔案。
vmlinuz 應該是由ELF檔案vmlinux經過OBJCOPY後,並經過壓縮後的檔案
zImage 是vmlinuz經過 gzip 壓縮後的檔案,適用於小核心
bzImage 是vmlinuz經過 gzip 壓縮後的檔案,適用於大核心
|
新建一個目錄用於存放生成的核心檔案,以及根檔案系統:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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原始碼
1 2 3 4 5 6 7 8 9 10 |
cd ~ /Desktop/kernel-debug <br>
tar -jxvf busybox-1.28.3. tar .bz2<br>
cd busybox-1.28.3<br>
#進行配置,注意這裡選擇靜態連線的方式生成可執行檔案,避免對外部lib有依賴
make menuconfig<br>
#勾選Settings->Build Busybox as a static binary
make -j
#編譯完成後,安裝到目標的根檔案系統中去,然後unmount掉根檔案系統
make install CONFIG_PREFIX=~ /Desktop/kernel-debug/rootfs <br>
sudo umount ~ /Desktop/kernel-debug/rootfs
|
4.啟動Qemu虛擬機器
1 |
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,可以通過以下命令安裝:
1 2 3 4 5 |
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就會斷下來了:
【作者】張昺華 【出處】http://www.cnblogs.com/sky-heaven/ 【部落格園】 http://www.cnblogs.com/sky-heaven/ 【知乎】 http://www.zhihu.com/people/zhang-bing-hua 【我的作品---旋轉倒立擺】 http://v.youku.com/v_show/id_XODM5NDAzNjQw.html?spm=a2hzp.8253869.0.0&from=y1.7-2 【我的作品---自平衡自動循跡車】 http://v.youku.com/v_show/id_XODM5MzYyNTIw.html?spm=a2hzp.8253869.0.0&from=y1.7-2 【大餅教你學系列】https://edu.csdn.net/course/detail/10393 【新浪微博】 張昺華--sky 【twitter】 @sky2030_ 【微信公眾號】 張昺華 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利.