编写设备驱动程序

使用 kmdb 内核调试程序

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

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

可以任意装入和卸载 kmdb 调试程序。《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 命令设置断点,如以下示例中所示。


示例 22–7 在 kmdb 中设置标准断点


[0]> myModule`myBreakpointLocation::bp
        

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


示例 22–8 在 kmdb 中设置延迟断点


[0]>::bp myModule`myBreakpointLocation       

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


> ::help bp
> ::bp dcmd

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

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


[ address ] $<macroname

注 –

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


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

表 22–1 kmdb

Dcmd 

传统宏 

说明 

::devinfo

devinfo

devinfo_brief

devinfo.prop

列显设备节点的摘要 

::walk devinfo_parents

devinfo.parent

遍历设备节点的祖先 

::walk devinfo_sibling

devinfo.sibling

遍历设备节点的同级节点 

::minornodes

devinfo.minor

列显与给定设备节点对应的次要节点 

::major2name

 

列显绑定到给定设备节点的设备的名称。 

::devbindings

 

列显绑定到给定设备节点或主设备号的设备节点。 

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

DS_ATTACHED

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

DS_BOUND

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

DS_INITIALIZED

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

DS_LINKED

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

DS_PROBED

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

DS_READY

设备已完全配置。