我有一个冻结操作系统的设备驱动程序。老鼠甚至不会移动。我正在尝试调试这个问题,我相信一个好的方法是使用gdb和qemu,这是我以前从未使用过的两件事。有更好的方法吗?
首先,我需要使用已经完成的调试符号编译内核。
现在,生成了一个名为vmlinux的新文件,该文件位于与源相同的文件夹中。看来我还需要一个bzImage文件according to this所以我可以运行新编译的内核:
qemu-system-i386 -kernel bzImage
或处于调试模式
qemu-system-i386 -s -S -kernel bzImage
我找不到bzImage文件。我在哪里找到它或在这里缺少什么? bzImage是指我使用qemu-img create创建的操作系统映像吗?
另外,我不明白的是现在内核被编译(vmlinux)我如何用qemu运行它?所以我的问题是当我用qemu运行它或调试器是在我的主OS中作为应用程序运行的内核?
我该如何安装设备驱动程序?我对内核的理解不是Ubuntu,所以没有UI?
另外,我安装了qemu,当我输入qemu时,我找不到命令。我猜我必须选择qemu-system-i386,qemu-system-x86_64或qemu-x86_64中的特定处理器模拟器?
qemu与kvm命令有何不同或相似之处?
感谢。
答案 0 :(得分:2)
因此,如果我正确理解了问题,那么您就拥有一个不需要特定硬件的内核模块。当您使用该模块时,系统会冻结,但内核日志中没有任何特殊内容。
以下内容可能会有所帮助。
您描述的症状可能仍然是内核oops或恐慌的结果。日志记录工具有时会在将错误信息输出到日志文件之前死掉。您可以尝试通过串口输出日志,这应该更可靠。
由于您的内核模块不需要任何特定硬件,最简单的方法可能是安装与虚拟机相同的Linux发行版,并将该计算机的虚拟串行端口(COM)连接到主机上的管道系统。
这通常很容易做到。例如,this blog post包含主机操作系统和客户操作系统是Ubuntu 11.10的详细说明。
VirtualBox用于管理虚拟机。如果你更喜欢QEMU,这也是可能的。我认为使用VirtualBox更容易,但这是个人偏好的问题。
基本上,您需要执行以下步骤。
/tmp/vbox_serial
或类似内容添加到启动加载程序菜单中的内核选项。console=ttyS0,115200
,minicom
或其他任何可以从socat
读取的内容。/tmp/vbox_serial
获取来宾操作系统的内核日志。如果guest虚拟机系统崩溃,即使未将其保存到guest虚拟机本身的文件中,也会获取日志。为了简化操作,您可以在主机系统上使用/tmp/vbox_serial
,而不是该博客帖子的作者所建议的socat
。这里可能不需要minicom
的力量。
这样,您可以使用minicom
和socat
将日志保存到tee
文件,同时仍将其输出到控制台:
guest.log
如果有内核oops或恐慌,日志中的回溯通常有助于找出内容 出了问题。
如果您已通过串行连接或其他方式获取完整日志,但仍然没有任何可疑信息,您怀疑内核中存在死锁,
socat /tmp/vbox_serial - | tee guest.log
工具可能有所帮助。它包含在内核中(但您可能需要使用lockdep
重建内核)。
Lockdep检测到潜在的死锁并将结果输出到内核日志。 This presentation可以帮助您分析其输出。
如果你需要跟踪内核中的一些事件来调试你的系统,有一些工具可以很方便。