用 DSF 模拟设备
扫描二维码
随时随地手机看文章
为 Linux 内核创建测试用例相当简单;通常要么要求特定的范围,要么要求广泛的范围。不过,当在用户空间进行测试时,有一些特殊情况可能很难测试。很少执行的分支代码、不存在的设备以及错误路径代码等难以测试。
Device Simulator Framework(DSF)可以解决这一问题,它拥有一个内核空间到用户空间的输入输出控制接口,让测试用例开发人员可以执行内核的特定目标区域。当设备可能不存在时,DSF 特别有助于执行设备驱动程序内核代码。虽然 DSF 不能取代真正的设备测试,但是它可以在很大程度上帮助您调试和测试驱动程序代码。
DSF 还可以加快测试用例的开发,因为您不必去学习用于用户/内核空间通信的输入输出控制接口。
到目前为止,只支持最近发布的 Linux 2.5.xx 到当前的 2.6.xx 之间的内核版本。
入门
首先,我建议您下载整个 Linux Test Project (LTP) 测试套件,其中包括 DSF 代码。Linux Test Project 是 IBM Linux Technology Center (LTC) 与其他一些组织合作的项目(请参阅
参考资料中的链接)。
解压存档文件后,您将在 testcases/kernel/device-drivers/dev_sim_framework 目录下找到用户/内核模板测试代码。编译 LTP 测试套件并安装它,然后切换到 DSF 目录。进入 DSF 目录后,您将看到 kernel_space 目录和 user_space 目录。相应的内核模块和用户空间文件分别在这两个目录中。切换到这两个目录并运行
make
来编译模板。
ioctl 函数处理专用文件的底层设备参数。具体来说,很多字符专用文件(例如终端)的操作属性可以由 ioctl 请求来控制。
回页首
使用模板
模板编译完成后,在执行用户空间代码之前您可以用 insmod
或 modprobe
来加载内核模块。切换到 user_space 目录,执行用户空间代码。由于模板只是与已经注册的内核模块通信并返回,所以用户代码将运行并迅速返回结果。
修改模板来执行期望的内核代码相对也比较简单。不过,还是需要一些内核编程的知识。 EXPORT_SYMBOL
标签内定义的函数对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用。您还可以手工修改内核源代码来导出另外的函数,用于重新编译并加载新内核后的测试。
回页首
DSF 应用
下面的代码是一个如何实现设备类型测试的例子:
清单 1. 虚拟设备代码
switch(cmd) { case LTP_OPTION1: rc = test_option(); break; case PCI_ENABLE: rc = pci_enable(); break; default: printk("Mismatching ioctl commandn"); break; } . . . /* * pci_enable * enable a pci device so that it may be used in * later testing in the user test program */ static int pci_enable() { int rc = 0; struct pci_dev *dev = ltp_pci.dev; /* check if can enable the device pointer */ if(!dev) { printk("tpci: dev is NULLn"); return 1; } if( pci_enable_device(dev) ) { printk("tpci: failed to enable pci devicen"); rc = 1; } else { printk("tpci: enabled pci devicen"); rc = 0; } return rc; }
这个例子启用了一个调用 pci 内核 API 的“虚拟的”PCI 设备。这个虚拟的设备还可以用于其他测试。
回页首
结束语
如果您是一位具有一定经验的 Linux 内核和设备驱动程序开发人员,使用 DSF 将让您双重受益:由于 DSF 模板可以用于很多不同的测试,所以您可以更快地开发测试用例并保证其更加一致。而且,您还可以执行内核的特定目标区域,这样典型的用户空间测试用例执行内核代码时就不会再漫无目的。
Linux Test Project 的目标是帮助设备驱动程序开发人员标准化设备单元测试,提高 Linux 内核中设备驱动程序的稳定性。考虑到这一点,欢迎您通过 mridge@us.ibm.com与我联系并分享您使用 DSF 的经验。
参考资料
您可以参阅本文在 developerWorks 全球站点上的 英文原文.Linux Test Project(LTP) 是 IBM's Linux Technology Center与一些行业合作伙伴的合作项目。
IBM Linux Technology Center 去年对 2.4 内核进行了极其严格的全面基准测试。在 测试 Linux 的可靠性( developerWorks, 2003 年 12 月)一文中给出了他们的工作成果。
IBM Linux Technology Center 的 Paul Larson 在 从 2.4 到 2.6 内核开发中的改进( developerWorks, 2004 年 2 月)一文中揭密了制造 2.6 内核过程中用到的工具和测试。
Linux at IBM站点以报道整个 IBM 的 Linux 新闻和信息为特征。
在 IBM Systems Journal 中您可以阅读很多关于 IBM 如何进行软件测试的文章。
IBM 还提供 Performance Management, Testing and Scalability Services。
Linux Kernel Archives是 Linux 内核源代码的最主要站点;它还编录并链接了从初级到高级的大量信息。
在 developerWorks Linux 专区可以找到更多为 Linux 开发人员准备的参考资料。
在 Developer Bookstore 的 Linux 区可以找到很多精选的关于 Linux 书籍。
关于作者
Martin Ridgeway 是 IBM Linux Technology Center 的 Linux Test Project 的一位团队领导。去年他所从事的一些项目包括 Linux Test Project 和内核代码复盖分析。可以通过 mridge@us.ibm.com 与他联系。