今天的特別汗,首先,之前UML在64位系統下沒有編譯通過,編譯器和內核源碼都應該不會犯這樣低級的錯誤,那最有可能的原因就是gcc版本和 linux內核版本不匹配,gcc 4.4.4版本算是高版本了,而內核版本2.6.34已非最新,抱著僥幸心裡下載了2.6.36版本編譯,居然順利通過,看來64位與32位編譯並沒什麼 區別。
另外一個問題是昨天啟動UML失敗的問題,原來是我的命令行寫錯了,ubda指定根文件系統,我錯寫成了udba,以至無法加載文件系統,經過糾正後的命令如下:
./linux ubda=DSL-4.4-root_fs
#登錄之後出現root提示符
root@console[/]#
#關閉UML
root@console[/]# shutdown -h 0
當然這也不存在內核配置錯誤的問題了,至於根文件系統需要慢慢積累。
接下來看看如何調試內核,由官方文檔 Kernel Hacking with UML 所言,直接使用 gdb linux 便可調試,不過我在啟動一開始便遇到段錯誤,單步運行居然還能繼續,之後便陷入無休止的trap中。
繼續 google(最能找到答案的往往在國外的論壇,而且常常需要翻牆),最後找到兩個設置,是SIGSEGV和SIGUSR1信號不中斷繼續運行,最終居然可以,這點讓人百思不得其解,還是先看看現象如何:
$ gdb linux
(gdb) br start_kernel
Breakpoint 1 at 0x80493bb: file init/main.c, line 533.
(gdb) handle SIGSEGV pass nostop noprint
Signal Stop Print Pass to program Description
SIGSEGV No No Yes Segmentation fault
(gdb) handle SIGUSR1 pass nostop noprint
Signal Stop Print Pass to program Description
SIGUSR1 No No Yes User defined signal 1
(gdb) r ubda=DSL-4.4-root_fs
Starting program: /home/cpp/fox/kernel/linux-2.6.34/linux ubda=DSL-4.4-root_fs
Locating the bottom of the address space ... 0x1000
Locating the top of the address space ... 0xc0000000
Core dump limits :
soft - 0
hard - NONE
Checking that ptrace can change system call numbers...OK
Checking syscall emulation patch for ptrace...OK
Checking advanced syscall emulation patch for ptrace...OK
Checking for tmpfs mount on /dev/shm...OK
Checking PROT_EXEC mmap in /dev/shm/...OK
Checking for the skas3 patch in the host:
- /proc/mm...not found: No such file or directory
- PTRACE_FAULTINFO...not found
- PTRACE_LDT...not found
UML running in SKAS0 mode
Breakpoint 1, start_kernel () at init/main.c:533
533 smp_setup_prhandleocessor_id();
(gdb)
# 注釋,gdb 啟動參數的設置
(gdb) r arg1 arg2 ...
(gdb) set args arg1 arg2 ...
# handle 指定如何處理一個信號,詳盡的解釋可查閱幫助
(gdb) help handle
居然一切順利的斷到了start_kernel,哈哈,不管如何,總算能夠調試內核了。接下來還有UML虛擬機的網絡配置,UML使用了一個取巧的方式就是利用 tun 和 iptables ,好在我也研究了大半年,明天繼續。
今天唯一不明白的地方在於GDB調試的問題,明明遇到了SIGSEG,為什麼還能繼續呢?莫非這個信號是自己發出的?還有之後的SEGTRAP信號是怎麼發出來的?要弄清楚這個問題,或許還得查閱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