我有一个设备驱动程序正在冻结操作系统。鼠标甚至不动了。我正在尝试调试这个问题,我相信一个好的方法是将gdb与qemu一起使用,这两件事我以前从未使用过。有更好的方法吗?
因此,首先我需要用调试符号编译内核,我已经做过了。
现在,生成了一个名为vmlinux的新文件,该文件与源文件位于同一文件夹中。我似乎还需要一个bzImage文件,这样我就可以使用运行新编译的内核
qemu-system-i386 -kernel bzImage
或处于调试模式
qemu-system-i386 -s -S -kernel bzImage
我找不到bzImage文件。我在哪里找到它,或者这里缺少什么?bzImage是指我使用qemu img create创建的操作系统映像吗?
另外,我不明白的是,现在内核已经编译好了(vmlinux),我该如何使用qemu运行它?所以我的问题是,当我用qemu或调试器运行它时,内核是作为应用程序在我的主操作系统中运行的吗?
以及如何安装设备驱动程序?我的理解是内核不是Ubuntu,所以没有UI?
此外,我安装了qemu,当我键入qemu时,我得到的命令没有找到。我猜我必须选择一个特定的处理器模拟器,如qemu-system-i386、qemu-system-x86_64或qemu-x86_64?
qemu与kvm命令有何不同?
谢谢。
因此,如果我正确理解问题,您就有了一个不需要特定硬件的内核模块。当您使用该模块时,系统会冻结,但内核日志不包含任何特殊内容。
以下内容可能会有所帮助。
获取日志
您描述的症状可能仍然是内核错误或恐慌的结果。日志记录功能有时在将有关错误的信息输出到日志文件之前就失效了。您可以尝试通过串行端口输出日志,这应该更可靠。
由于内核模块不需要任何特定的硬件,最简单的方法可能是将与您使用的Linux发行版安装到虚拟机上,并将该虚拟机的虚拟串行端口(COM)连接到主机系统上的管道。
这通常很容易做到。例如,这篇博客文章包含了主机操作系统和来宾操作系统为Ubuntu 11.10时的详细说明。
VirtualBox用于管理虚拟机。如果您更喜欢QEMU,这也应该是可能的。我想使用VirtualBox会更容易一些,但这是个人偏好的问题。
基本上,您需要执行以下步骤。
- 创建一个虚拟机,并在那里安装您需要的Linux发行版作为来宾操作系统
- 在虚拟机的配置中启用串行端口(COM1,…),并将其配置为连接到主机上的特殊文件("主机管道"),例如
/tmp/vbox_serial
- 启动来宾操作系统并调整其引导选项:至少,在引导加载程序菜单中的内核选项中添加
console=ttyS0,115200
或类似的内容 - 在主机上,启动
minicom
、socat
或其他任何要从/tmp/vbox_serial
读取的内容 - 就是这样。现在您应该通过
/tmp/vbox_serial
将来宾操作系统的内核日志倾倒到您的主机系统中。如果访客系统崩溃,即使日志没有保存到访客本身的文件中,您也会得到日志
为了简化操作,您可以在主机系统上使用socat
,而不是该博客文章作者建议的minicom
。这里可能不需要minicom
的功率。
这样,您可以使用socat
和tee
将日志保存到guest.log
文件中,同时仍将其输出到控制台:
socat /tmp/vbox_serial - | tee guest.log
如果出现内核错误或死机,日志中的回溯通常有助于找出出了问题。
检测死锁
如果您通过串行连接或其他方式获得了完整的日志,但仍然没有任何可疑之处,并且怀疑内核中存在死锁,lockdep
工具可能会有所帮助。它包含在内核中(但您可能需要使用CONFIG_LOCKDEP_SUPPORT=y
重建内核)。
Lockdep检测潜在的死锁并将结果输出到内核日志。本演示文稿可以帮助您分析其输出。
伴热设施
如果您需要跟踪内核中的一些事件来调试系统,那么有一些工具可能很方便。
- Kprobes-一种可以在内核中几乎任意位置设置的断点。可用于跟踪函数调用等,具有适度的性能影响
- SystemTap-一个强大的系统,可以分析内核中正在发生的事情。部分基于Kprobes
- Ftrace是一个包含在内核中的跟踪系统,如果这很重要的话,它会比Kprobes产生更少的开销