3

我有一个冻结操作系统的设备驱动程序。鼠标甚至不会移动。我正在尝试调试这个问题,我相信一种好的方法是将 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 命令有何不同或相似之处?

谢谢。

4

1 回答 1

3

所以,如果我正确理解了这个问题,那么你就有一个不需要特定硬件的内核模块。当您使用该模块时,系统会冻结,但内核日志没有任何特别之处。

以下内容可能会有所帮助。

获取日志

您描述的症状可能仍然是内核 oops 或恐慌的结果。日志记录工具有时在将有关错误的信息输出到日志文件之前就死了。您可以尝试通过串口输出日志,这样应该更可靠。

由于您的内核模块不需要任何特定硬件,因此最简单的方法可能是安装与您使用的虚拟机相同的 Linux 发行版,并将该机器的虚拟串行端口 (COM) 连接到主机系统上的管道。

这通常很容易做到。例如,这篇博文包含主机操作系统和客户操作系统是 Ubuntu 11.10 的详细说明。

VirtualBox用于管理虚拟机。如果您更喜欢 QEMU,这也应该是可能的。我认为使用 VirtualBox 会更容易一些,但这是个人喜好问题。

基本上,您需要执行以下步骤。

  • 创建一个虚拟机并在那里安装您需要的 Linux 发行版作为来宾操作系统。
  • 在虚拟机的配置中启用串行端口(COM1,...)并将其配置为连接到主机上的特殊文件(“主机管道”),例如/tmp/vbox_serial.
  • 启动来宾操作系统并调整其引导选项:至少,console=ttyS0,115200在引导加载程序菜单中的内核选项中添加或类似的内容。
  • 在主机上, startminicomsocat其他要读取的内容/tmp/vbox_serial
  • 这就对了。现在您应该通过/tmp/vbox_serial. 如果来宾系统崩溃,您将获得日志,即使它没有保存到来宾本身的文件中。

为了使事情更容易,您可以socat在您的主机系统上使用,而不是minicom该博客文章的作者所建议的。minicom这里可能不需要的力量。

这样,您可以使用socattee将日志保存到guest.log文件,同时仍将其输出到控制台:

socat /tmp/vbox_serial - | tee guest.log

如果出现内核 oops 或 panic,日志中的回溯通常有助于找出问题所在。

检测死锁

如果您通过串行连接或其他方式获得了完整的日志,但仍然没有任何可疑之处,并且您怀疑内核中存在死锁,那么该 lockdep工具可能会有所帮助。它包含在内核中(但您可能需要使用 重建内核CONFIG_LOCKDEP_SUPPORT=y)。

Lockdep 检测潜在的死锁并将结果输出到内核日志。此演示文稿可以帮助您分析其输出。

追踪设施

如果您需要跟踪内核中的某些事件来调试您的系统,那么有些工具可能会很方便。

  • Kprobes - 一种可以在内核中几乎任意位置设置的断点。可用于跟踪函数调用等,对性能的影响适中。
  • SystemTap - 一个强大的系统来分析内核中发生的事情。其中一部分基于 Kprobes。
  • Ftrace - 一个包含在内核中的跟踪系统,如果重要的话,比 Kprobes 产生的开销更少。
于 2013-02-20T07:51:27.933 回答