编写设备驱动程序

故障注入

驱动程序强化测试工具截获并在请求时损坏驱动程序对其硬件进行的每次访问。本节提供您在创建故障以测试驱动程序的可复原性时应了解的信息。

Solaris 设备在名为设备树(devinfo 树)的类似树的结构内进行管理。devinfo 树的每个节点都存储着与系统中某一设备的特定实例相关的信息。每个叶节点对应于一个设备驱动程序,而其他所有节点都称为子树节点。通常,结点 (nexus) 表示总线。总线节点将叶驱动程序与总线相关项隔离,从而可以生成在体系结构上独立的驱动程序。

许多 DDI 函数(特别是数据访问函数)都会导致向上调用总线结点驱动程序。当叶驱动程序访问其硬件时,它会将句柄传递给访问例程。总线结点了解如何处理句柄和实现请求。符合 DDI 标准的驱动程序只通过使用这些 DDI 访问例程来访问硬件。在这些向上调用到达指定的总线结点之前,测试工具会截获这些向上调用。如果数据访问与驱动程序测试器指定的标准相符,访问将被损坏。如果数据访问与该标准不符,则将其提供给总线结点,以便通过常规方式进行处理。

驱动程序通过使用 ddi_regs_map_setup(9F) 函数获取访问句柄:

ddi_regs_map_setup(dip, rset, ma, offset, size, handle)

参数指定要映射哪个“板外”内存。驱动程序在引用映射的 I/O 地址时必须使用返回的句柄,因为句柄用于将驱动程序与总线层次结构的详细信息隔离开来。因此,请不要直接使用返回的映射地址 ma。直接使用映射地址会导致当前以及将来无法使用数据访问函数机制。

对于程控 I/O,数据访问函数组为:

Xrepcnt 是要传送的字节数。X 是总线传送大小,为 8、16、32 或 64 字节。

DMA 具有与之类似但更为丰富的一组数据访问函数。