最近看了些Linux內核源碼,之前認為最好的調試內核源碼最好的方式使用Qemu虛擬機,結合GDB調試,雖然在網上也看到一些這種調試方式的弊端,但感覺虛擬機支持調試是最完美的事情,雖然Bochs更為靈活甚至內置調試器,但速度太慢。
之前一直覺得KGDB這種雙機調試的方式很不完美,還必須使用一個調試機,不過在Windows下使用WinDbg調試虛擬機多了,感覺這種方式很合理,起 碼被調試機當機的情況下,調試機還是活的。而且這樣看上去很酷,而且比SoftICE這樣“不穩定”的調試方式要好的多。
這兩天看到一種 UML(User Mode Linux)的調試方式,居然早已加入內核,我才聽聞,真是落後時代啊。這種UML方式是把linux內核當作本地一個普通的應用程序執行,當然也很方便 調試,這個類似於Xen虛擬機。不過在64位Fedora上沒有配好環境,在i386卻很容易配置,打開控制台轉到內核源碼,例如linux- 2.6.34:
編譯內核命令要在普通方式後加入構架um參數:
# 配置內核
make menuconfig ARCH=um
# 編譯內核
make linux ARCH=um
編譯完成後會在源碼根目錄下生成可執行文件 linux。
到這裡似乎很簡單,下面需要創建 Linux 根文件系統,也就是除內核以外的硬盤文件,這個根文件系統包括Linux文件組織數,以及啟動系統所必須的一些輔助程序。
一種方法就是手工制作:
# 創建一個2G的文件作為硬盤
dd if=/dev/zero of=rootfs.img bs=1M count=2048
# 格式化文件
mkfs.ext3 rootfs.img
# 映射此文件到主機文件夾
mount -o loop rootfs.img /mnt/temp
如此便可通過拷貝文件到/mnt/temp/目錄,等同於拷貝文件到rootfs.img硬盤文件。這裡可以直接通過主機的文件目錄組織去構建跟文件系統,也可以直接安裝一個linux到此目錄。
使用最簡單的方式就是直接使用現成的根文件系統。在UML網站 The User-mode Linux Kernel Home Page 有相關鏈接可以下載,比如下載 DSL-4.4-root_fs.bz2 文件,首先解壓運行之:
bunzip2 DSL-4.4-root_fs.bz2
./linux udba=DSL-4.4-root_fs
運行後出現 Unable to mount root fs on unknown-block(0,0) 錯誤後程序崩潰,這裡可能是內核有關文件系統編譯選項的問題,明天繼續研究。。。
到這裡有幾個問題:
1、64位系統下UML編譯,要設置子系統等,如何設置?
2、根文件系統建立,一個Linux最小單元的根文件系統需要哪些文件和目錄?
3、內核編譯選項問題;
4、調試UML方法和UML啟動參數,比如網絡設置等等。
相關系列文章:
Linux 內核調試1-UML http://www.linuxidc.com/Linux/2012-07/66410.htm
Linux 內核調試2-UML調試內核 http://www.linuxidc.com/Linux/2012-07/66411.htm
Linux 內核調試3-UML網絡配置 http://www.linuxidc.com/Linux/2012-07/66412.htm
Linux 內核調試4-Qemu調試Linux內核 http://www.linuxidc.com/Linux/2012-07/66413.htm
Linux 內核調試5-UML和Qemu調試模塊 http://www.linuxidc.com/Linux/2012-07/66414.htm
Linux 內核調試6-使用KGDB雙機調試 http://www.linuxidc.com/Linux/2012-07/66415.htm