编写适用于 Oracle® Solaris 11.2 的设备驱动程序

退出打印视图

更新时间: 2014 年 9 月
 
 

使用 kmdb 内核调试器

    kmdb 调试器是可提供以下功能的交互式内核调试器:

  • 控制内核执行

  • 检查内核状态

  • 实时修改代码

本节假定您已熟悉 kmdb 调试器。本节重点介绍在设备驱动程序设计中非常有用的 kmdb 功能。要详细了解如何使用 kmdb,请参阅 kmdb(1) 手册页和Oracle Solaris Modular Debugger Guide。如果您熟悉 kadb,请参阅 kadb(1M) 手册页以了解 kadbkmdb 的主要差别。

可以任意装入和卸载 kmdb 调试器。《Oracle Solaris 模块调试器指南》中包含有关装入和卸载 kmdb 的说明。为了安全和方便起见,强烈建议使用替代内核进行引导。如本节中所述,在 SPARC 平台与 x86 平台上引导过程略有不同。


注 - 缺省情况下,当 kmdb 运行时,kmdb 使用 CPU ID 作为提示符。在本章的示例中,除非另有指定,否则使用 [0] 作为提示符。

在 SPARC 平台上使用替代内核引导 kmdb

使用以下任一命令通过 kmdb 和替代内核引导 SPARC 系统:

boot kmdb -D kernel.test/sparcv9/unix 
boot kernel.test/sparcv9/unix -k

在 x86 平台上使用替代内核引导 kmdb

使用以下任一命令通过 kmdb 和替代内核引导 x86 系统:

b kmdb -D kernel.test/unix 
b kernel.test/unix -k

kmdb 中设置断点

使用 bp 命令设置断点,如以下示例中所示。

示例 23-5  kmdb 中设置标准断点
[0]> myModule`myBreakpointLocation::bp
        

如果尚未装入目标模块,则会显示指示这一情况的错误消息,并且不会创建断点。在这种情况下,可以使用延迟断点。装入指定的模块时,会自动激活延迟断点。通过在 bp 命令后面指定目标位置可以设置延迟断点。以下示例对延迟断点进行了说明。

示例 23-6  kmdb 中设置延迟断点
[0]>::bp myModule`myBreakpointLocation       

有关使用断点的更多信息,请参见《Oracle Solaris 模块调试器指南》。也可以通过键入以下任意一行来获取帮助:

> ::help bp
> ::bp dcmd

为驱动程序开发者提供的 kmdb

kmdb(1M) 调试器支持可用于显示内核数据结构的宏。可以使用 $M 来显示 kmdb 宏。宏的使用形式为:

[ address ] $<macroname

注 - 这些宏所显示的信息以及显示信息所用的格式都不构成接口。因此,该信息和格式可以随时更改。

下表中的 kmdb 宏对于设备驱动程序的开发者特别有用。为方便起见,给出了传统的宏名称(如果适用)。

表 23-1  kmdb
Dcmd
传统宏
说明
::devinfo
devinfo
devinfo_brief
devinfo.prop
列显设备节点的摘要
::walk devinfo_parents
devinfo.parent
遍历设备节点的祖先
::walk devinfo_sibling
devinfo.sibling
遍历设备节点的同级节点
::minornodes
devinfo.minor
列显与给定设备节点对应的次要节点
::major2name
列显绑定到给定设备节点的设备的名称。
::devbindings
列显绑定到给定设备节点或主设备号的设备节点。

::dev info dcmd 显示节点状态,其值为以下所列之一:

DS_ATTACHED

驱动程序的 attach(9E) 例程成功返回。

DS_BOUND

节点已绑定到驱动程序,但尚未调用驱动程序的 probe(9E) 例程。

DS_INITIALIZED

父结点已为驱动程序指定总线地址。特定于实现的初始化已完成。此时尚未调用驱动程序的 probe(9E) 例程。

DS_LINKED

设备节点已链接至内核的设备树中,但系统尚未找到用于此节点的驱动程序。

DS_PROBED

驱动程序的 probe(9E) 例程成功返回。

DS_READY

设备已完全配置。