通过UML可以方便的在本机调试Linux内核,UML是一种特殊的虚拟机,另外一种更为灵活的虚拟机是Qemu,Qemu是一种完全仿真虚拟机, 可以在i386平台仿真任意其他处理器构架,而且支持GDB调试,这里尝试一下使用Qemu调试Linux内核,Qemu参数-kernel可以直接指定 内核启动,这与UML有相似之处。
首先需要编译安装Qemu,这里并没有什么疑惑之处,直接从官方网站下载源码,使用Linux最常用的编译命令即可:
接下来以默认选项编译内核,不过巨崩溃的是内核默认没有DEBUG_INFO选项,所以虽然能在导出符号部分断下来,但是没有源码,所以需要选则Compile the kernel with debug info选项。
然后使用Qemu加载内核启动
这里系统很容易启动不了,如果系统由于VFS加载错误无法启动,首先尝试启动参数root=/dev/sda为root=/dev /hda,hda是IDE硬盘标识,sda为SCSI硬盘,这要看内核识别成哪种,如果仍然不行,那要检测rootfs.img根文件系统的格式跟内核所 支持的格式是否匹配,2.6.34支持ext3格式,如果格式错误,可以利用 Linux 内核调试1 里的方法,自己手工创建一个ext3格式的文件,然后mount到临时文件,把其他根文件系统全部拷贝进去即可。
这 样启动Qemu之后,发现系统一片黑屏,这里因为Qemu启动参数被设置为禁止,Qemu本身具有显示窗口和控制窗口,利用 Ctrl+Alt+2 进入控制台,c命令继续虚拟机,Ctrl+Alt+1 返回显示窗口,Qemu的控制台可以控制很多选项,从这点来看要比VMware等要灵活一些,UML本身也支持运行时控制。
接下来使用GDB启动虚拟机,当系统停止在启动之后时,用GDB加载:
Qemu由于是完全仿真实现,所以可以在任意平台调试其他构架内核,理论上甚至可以在Windows平台交叉编译Linux内核,再去由Qemu加载调试(交叉编译比较麻烦,需要先编译目标构架的binutil,而后链接内核)。