编写设备驱动程序

使用脚本自动完成测试过程

可以使用日志记录访问类型 th_define(1M) 实用程序来创建故障注入测试脚本:


# th_define -n name -i instance -a log [-e fixup_script]

th_define 命令使实例脱机,然后再使其恢复联机。然后,th_define 运行 fixup_script 描述的工作负荷并记录驱动程序实例进行的 I/O 访问。

将会使用可选参数的集合调用 fixup_script 两次。会在实例脱机前调用该脚本一次,然后在实例恢复联机后再次调用该脚本。

以下变量将被传递到调用的可执行文件的环境中:

DRIVER_PATH

实例的设备路径

DRIVER_INSTANCE

驱动程序的实例编号

DRIVER_UNCONFIGURE

当实例即将脱机时设置为 1

DRIVER_CONFIGURE

当实例已恢复联机时设置为 1

通常,fixup_script 可确保所测试的设备处于适合脱机的状态(未配置)或处于适合注入错误的状态(例如,已配置、无错误并为工作负荷服务)。以下脚本是用于网络驱动程序的最小脚本:

#!/bin/ksh
driver=xyznetdrv
ifnum=$driver$DRIVER_INSTANCE
 
if [[ $DRIVER_CONFIGURE = 1 ]]; then
   ifconfig $ifnum plumb	
   ifconfig $ifnum ...	
   ifworkload start $ifnum
elif [[ $DRIVER_UNCONFIGURE = 1 ]]; then	
   ifworkload stop $ifnum	
   ifconfig $ifnum down	
   ifconfig $ifnum unplumb
fi
exit $?

注 –

ifworkload 命令应将工作负荷作为一项后台任务来启动。故障注入发生在 fixup_script 配置所测试的驱动程序并使其联机(DRIVER_CONFIGURE 设置为 1)之后。


如果存在 -e fixup_script 选项,它必须是命令行中的最后一个选项。如果不存在 -e 选项,则使用缺省脚本。缺省脚本会反复尝试使所测试的设备脱机和联机。因此,工作负荷由驱动程序的 attach()detach() 路径构成。

生成的日志将转换为一组适合运行独立的 (unassisted) 故障注入测试的可执行脚本。这些脚本创建在当前目录的子目录中,名称为 driver.test.id。脚本将在运行 fixup_script 描述的工作负荷的同时向驱动程序中注入故障,一次一个。

驱动程序测试器可对测试自动化过程生成的 errdef 进行实质性控制。请参见 th_define(1M) 手册页。

如果测试器为测试脚本选择了合适的工作负荷范围,则工具可为驱动程序各方面的强化提供良好的覆盖率。但是,要取得满覆盖率,测试器可能需要手动创建其他测试案例。请将这些案例添加至测试脚本。为确保测试可及时完成,您可能需要手动删除重复的测试案例。

自动化测试过程

    以下过程介绍了自动化测试:

  1. 确定要测试的驱动程序的各个方面。

    测试驱动程序中与硬件交互的所有方面:

    • 连接和分离

    • 在堆栈下检测和取消检测

    • 正常数据传送

    • 记录的调试模式

    必须为每种使用模式生成单独的工作负荷脚本 (fixup_script)。

  2. 对于每种使用模式,准备可执行程序 ( fixup_script),该可执行程序可对设备进行配置和取消配置,并可创建和终止工作负荷。

  3. 使用 errdef 以及访问类型 -a log 运行 th_define(1M) 命令。

  4. 等待日志填充。

    日志中包含 bofi 驱动程序的内部缓冲区的转储。此数据包含在脚本的前面。

    由于创建日志可能需要几秒钟到几分钟的时间,因此可使用 th_manage broadcast 命令检查进度。

  5. 转到已创建的测试目录并运行主测试脚本。

    主脚本将按顺序运行每个生成的测试脚本。每个寄存器集会生成单独的测试脚本。

  6. 存储结果,以用于分析。

    成功的测试结果(如 success (corruption reported)success (corruption undetected))表明所测试的驱动程序工作正常。如果工具检测到驱动程序在报告故障后无法报告服务影响或者驱动程序无法检测到访问或 DMA 句柄已被标记为有故障,则结果将报告为 failure (no service impact reported)

    输出中出现几个 test not triggered 故障并不碍事。但是,若干个此类故障将表明测试没有正常工作。当驱动程序访问的寄存器与生成测试脚本时的寄存器不同时,会出现这些故障。

  7. 同时对驱动程序的多个实例运行测试,以测试错误路径的多线程。

    例如,每个 th_define 命令都会创建一个单独的目录,其中包含测试脚本和主脚本:


    # th_define -n xyznetdrv -i 0 -a log -e script
    # th_define -n xyznetdrv -i 1 -a log -e script
    

    创建后,并行运行主脚本。


    注 –

    生成的脚本只生成仿真的故障注入,这些故障注入基于日志记录 errdef 处于活动状态期间记录的内容。定义工作负荷时,请确保记录所需结果。此外,还要分析生成的日志和故障注入规范。请验证生成的测试脚本所创建的硬件访问覆盖率是否满足需要。