Linux kernel 与qemu和gdb的问题

Linux kernel 与qemu和gdb的问题,linux-kernel,gdb,qemu,Linux Kernel,Gdb,Qemu,我有一个设备驱动程序正在冻结操作系统。这只老鼠甚至一动不动。我正在尝试调试这个问题,我相信一个很好的方法是将gdb与qemu一起使用,这两件事我以前从未使用过。有更好的方法吗 所以首先我需要用调试符号编译内核,我已经完成了 现在,生成了一个名为vmlinux的新文件,它与源文件位于同一文件夹中。似乎我还需要一个bzImage文件,这样我就可以使用以下方法运行新编译的内核: qemu-system-i386 -kernel bzImage 或处于调试模式 qemu-system-i386 -s

我有一个设备驱动程序正在冻结操作系统。这只老鼠甚至一动不动。我正在尝试调试这个问题,我相信一个很好的方法是将gdb与qemu一起使用,这两件事我以前从未使用过。有更好的方法吗

所以首先我需要用调试符号编译内核,我已经完成了

现在,生成了一个名为vmlinux的新文件,它与源文件位于同一文件夹中。似乎我还需要一个bzImage文件,这样我就可以使用以下方法运行新编译的内核:

qemu-system-i386 -kernel bzImage 
或处于调试模式

qemu-system-i386 -s -S -kernel bzImage
我找不到bzImage文件。我在哪里找到它或者这里缺少什么?bzImage是指我使用qemu img create创建的OS映像吗

另外,我不明白的是,现在内核已经编译(vmlinux)了,我如何使用qemu运行它?所以我的问题是,当我使用qemu运行它时,或者调试器是作为应用程序在我的主操作系统中运行的内核

另外,如何安装设备驱动程序?我的理解是内核不是Ubuntu,所以没有UI

另外,我安装了qemu,当我键入qemu时,我找不到get命令。我猜我必须选择一个特定的处理器模拟器,如qemu-system-i386、qemu-system-x86_64或qemu-x86_64

qemu与kvm命令有何不同或相似


谢谢。

因此,如果我正确理解了这个问题,您有一个不需要特定硬件的内核模块。当您使用模块时,系统会冻结,但内核日志不包含任何特殊内容

以下内容可能会有所帮助

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

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

这通常很容易做到。例如,包含主机操作系统和来宾操作系统为Ubuntu 11.10时的详细说明

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

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

  • 创建一个虚拟机,并在那里安装作为来宾操作系统所需的Linux发行版
  • 在虚拟机的配置中启用串行端口(COM1,…),并将其配置为连接到主机上的特殊文件(“主机管道”),例如
    /tmp/vbox\u serial
  • 启动来宾操作系统并调整其引导选项:至少,在引导加载程序菜单中的内核选项中添加
    console=ttys0115200
    或类似的内容
  • 在主机上,启动
    minicom
    socat
    或从
    /tmp/vbox\u serial
    读取的任何内容
  • 就是这样。现在,您应该通过
    /tmp/vbox\u serial
    获得来宾操作系统的内核日志。如果来宾系统崩溃,那么即使日志没有保存到来宾系统本身的文件中,您也会得到日志
为了简化操作,您可以在主机系统上使用
socat
,而不是该博客作者建议的
minicom
。这里可能不需要
minicom
的功能

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

socat /tmp/vbox_serial - | tee guest.log
如果出现内核oops或死机,日志中的回溯通常有助于找出原因 出了问题

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

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

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

  • -一种可以在内核中几乎任意位置设置的断点。可用于跟踪函数调用等,对性能影响不大
  • -用于分析内核中正在发生的事情的强大系统。它的一部分基于Kprobes
  • -内核中包含的跟踪系统比Kprobes产生的开销要少(如果这很重要的话)

您可能在系统冻结后重新启动系统时查看了系统日志?那里有关于内核错误的消息吗?如果你没有,我建议你这样做。有时,从分析系统日志开始可能比按照您描述的路线更容易。如果系统日志中没有保存有关故障的信息,您可以尝试以其他方式获取。如果有故障的驱动程序可以在虚拟机的来宾操作系统(看起来像是使用Ubuntu)中运行,那么您可以在引导时配置该操作系统,将日志输出到串行端口,并从主机上的串行端口检索日志。如果驱动程序用于虚拟机不支持的硬件,QEMU也不会有帮助。关于QEMU和KVM,请访问它们的官方网站:。简而言之,QEMU允许创建虚拟机,它模拟目标系统。当与KVM(一组特殊的内核模块等)一起使用时,QEMU获得了使用主机CPU的虚拟化支持而不是仿真的能力,从而实现在VM中运行的操作系统的更好性能。kern.log中没有任何内容。不确定