本节介绍如何使用 th_define(1M) 和 th_manage(1M) 命令创建并注入故障。
th_define 实用程序为 bofi 设备驱动程序提供了一个接口,以用于定义 errdef。errdef 对应于有关如何损坏设备驱动程序对其硬件的访问的规范。th_define 命令行参数确定要注入的故障的确切性质。如果提供的参数定义了一致的 errdef,th_define 进程将使用 bofi 驱动程序存储 errdef。该进程将使自身暂停,直至 errdef 给定的条件得到满足为止。实际上,当访问计数达到零 (0) 时,暂停将结束。
测试工具在数据访问级别运行。数据访问具有以下特征:
正在访问的硬件类型(驱动程序名称)
正在访问的硬件实例(驱动程序实例)
正在测试的寄存器集
作为目标的寄存器集的子集
传送的方向(读取或写入)
访问类型(PIO 或 DMA)
测试工具截获数据访问并将适当的故障注入驱动程序。th_define(1M) 命令指定的 errdef 可对以下信息编码:
正在测试的驱动程序实例和寄存器集(-n name、-i instance 和 -r reg_number)。
满足损坏资格的寄存器集的子集。通过提供进入寄存器集的偏移和距离该偏移的长度 (-l offset [len]) 来指示该子集。
要截获的访问的种类: log、pio、dma、pio_r、pio_w、dma_r、dma_w、intr (-a acc_types)。
应视为有故障的访问数量 (-c count [failcount ])。
应对合格的访问应用的损坏种类 (-o operator [operand])。
使用固定值替换数据 (EQUAL)
对数据执行按位操作 (AND, OR, XOR)
忽略传送(对于主机到 I/O 访问,为 NO_TRANSFER)
丢失、延迟或注入虚假中断 (LOSE, DELAY, EXTRA)
使用 -a acc_chk 选项可仿真 errdef 中的框架故障。
注入故障的过程涉及两个阶段:
使用 th_define(1M) 命令创建 errdef。
通过向 bofi 驱动程序传递测试定义来创建 errdef,该驱动程序会存储这些定义,因此可以使用 th_manage(1M) 命令来访问它们。
创建工作负荷,然后使用 th_manage 命令激活和管理 errdef。
th_manage 命令是到 bofi 工具驱动程序可以识别的各种 ioctl 的用户接口。th_manage 命令在驱动程序名称和实例级别运行并且包含以下命令: get_handles 用于列出访问句柄,start 用于激活 errdef,stop 用于取消激活 errdef。
激活 errdef 将导致合格的数据访问出现故障。th_manage 实用程序支持以下命令: broadcast 用于提供 errdef 的当前状态,clear_errors 用于清除 errdef。
有关更多信息,请参见 th_define(1M) 和 th_manage(1M) 手册页。
可对测试工具进行配置,以便通过以下方法来处理警告消息:
将警告消息写入控制台
将警告消息写入控制台,然后使系统进入紧急状态
使用第二种方法有助于确定问题的根本原因。
如果将 bofi-range-check 属性值设置为 warn,当工具检测到驱动程序违反 DDI 函数的范围时,该工具将列显以下消息(或者,如果设置为 panic,则会进入紧急状态):
ddi_getX() out of range addr %x not in %x ddi_putX() out of range addr %x not in %x ddi_rep_getX() out of range addr %x not in %x ddi_rep_putX() out of range addr %x not in %x
X 为 8、16、32 或 64。
当工具已请求插入 1000 个以上额外中断时,如果驱动程序未检测到中断逾限 (jabber),则会列显以下消息:
undetected interrupt jabber - %s %d