Linux內核代碼的調試非常麻煩,一般都是加printk, 或者用JTAG調試。這裡的方法是用QEMU來調試Linux內核。因為QEMU自己實現了一個gdb server, 所以可以非常方便的使用gdb來調內核。
這對內核的學習也非常有幫助。
為了盡量不多花時間在QEMU設置上,這裡直接使用以下的內核image:
http://free-electrons.com/community/demos/qemu-arm-directfb/
1. QEMU的安裝
這個可以自己去QEMU的官網下載編譯,如果自己手頭上的發行版有對應QEMU的包的話那也可以直接安裝。
CentOS的話參考前面的 CentOS rpm 額外包的源
2. 下載對應的內核映像
從以下網址下載:http://free-electrons.com/pub/qemu/demos/arm/directfb/1.0/ 這裡面有一個vmlinuz-qemu-arm-2.6.20
3. 啟動QEMU
使用如下命令啟動:
$ qemu-system-arm -M versatilepb -m 16 -kernel vmlinuz-qemu-arm-2.6.20 -append "clocksource=pit quiet rw" -S -s
4. 調試內核
這裡需要有一個包含調試信息的vmlinux文件,可以直接編譯http://free-electrons.com/pub/qemu/demos/arm/directfb/1.0/src/linux-2.6.20.tar.7z
如果自己不想編譯的話可以使用一個已編譯好的vmlinux文件:
------------------------------------------分割線------------------------------------------
FTP地址:ftp://ftp1.linuxidc.com
用戶名:ftp1.linuxidc.com
密碼:www.linuxidc.com
在 2014年LinuxIDC.com\8月\使用QEMU調試Linux內核代碼
下載方法見 http://www.linuxidc.com/Linux/2013-10/91140.htm
------------------------------------------分割線------------------------------------------
然後執行如下命令:
$ arm-none-linux-gnueabi-gdb vmlinux
在gdb的控制台輸入:
(gdb) target remote :1234
(gdb) b start_kernel
(gdb) c
這時候程序執行就會落在你設定的斷點start_kernel處。OK。這樣你就可以隨意調試內核代碼了!
Ubuntu 12.04之找不到Qemu命令 http://www.linuxidc.com/Linux/2012-11/73419.htm
Arch Linux上安裝QEMU+EFI BIOS http://www.linuxidc.com/Linux/2013-02/79560.htm
QEMU的翻譯框架及調試工具 http://www.linuxidc.com/Linux/2012-09/71211.htm
QEMU 的詳細介紹:請點這裡
QEMU 的下載地址:請點這裡