Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Linux 内核调试2-UML调试内核

今天的特别汗,首先,之前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[/]##关闭UMLroot@console[/]# shutdown -h 0当然这也不存在内核配置错误的问题了,至于根文件系统需要慢慢积累。接下来看看如何调试内核,由官方文档 Kernel Hacking with UML 所言,直接使用 gdb linux 便可调试,不过我在启动一开始便遇到段错误,单步运行居然还能继续,之后便陷入无休止的trap中。继续 google(最能找到答案的往往在国外的论坛,而且常常需要翻墙),最后找到两个设置,是SIGSEGV和SIGUSR1信号不中断继续运行,最终居然可以,这点让人百思不得其解,还是先看看现象如何:$ gdb linux(gdb) br start_kernelBreakpoint 1 at 0x80493bb: file init/main.c, line 533.(gdb) handle SIGSEGV pass nostop noprintSignalStopPrint Pass to program DescriptionSIGSEGV NoNoYes Segmentation fault(gdb) handle SIGUSR1 pass nostop noprintSignalStopPrint Pass to program DescriptionSIGUSR1 NoNoYes User defined signal 1(gdb) r ubda=DSL-4.4-root_fsStarting program: /home/cpp/fox/kernel/linux-2.6.34/linux ubda=DSL-4.4-root_fsLocating the bottom of the address space ... 0x1000Locating the top of the address space ... 0xc0000000Core dump limits :soft - 0hard - NONEChecking that ptrace can change system call numbers...OKChecking syscall emulation patch for ptrace...OKChecking advanced syscall emulation patch for ptrace...OKChecking for tmpfs mount on /dev/shm...OKChecking PROT_EXEC mmap in /dev/shm/...OKChecking for the skas3 patch in the host:- /proc/mm...not found: No such file or directory- PTRACE_FAULTINFO...not found- PTRACE_LDT...not foundUML running in SKAS0 modeBreakpoint 1, start_kernel () at init/main.c:533533 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