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