跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

用 DSF 模拟设备

Linux 内核 Device Simulator Framework 入门

Martin Ridgeway (mridge@us.ibm.com), 软件工程师, IBM
Martin Ridgeway 是 IBM Linux Technology Center 的 Linux Test Project 的一位团队领导。去年他所从事的一些项目包括 Linux Test Project 和内核代码复盖分析。可以通过 mridge@us.ibm.com 与他联系。

简介: Device Simulator Framework(DSF)为您的所有设备提供了一个易用的输入输出控制 (ioctl) 接口,无论这些设备是否确实存在。对那些经验丰富的内核和设备驱动程序软件开发人员而言,DSF 让调试和测试设备代码变得更容易,而这些工作如果没有 DSF 将难以进行模拟和再现。

发布日期: 2004 年 3 月 01 日
级别: 初级
访问情况 : 1863 次浏览
评论: 


为 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 函数处理专用文件的底层设备参数。具体来说,很多字符专用文件(例如终端)的操作属性可以由 ioctl 请求来控制。


使用模板


模板编译完成后,在执行用户空间代码之前您可以用 insmodmodprobe 来加载内核模块。切换到 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 command\n");
                           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 NULL\n");
     return 1;
   }
   if( pci_enable_device(dev) ) {
     printk("tpci: failed to enable pci device\n");
     rc = 1;
   }
   else {
     printk("tpci: enabled pci device\n");
     rc = 0;
   }
   return rc;
   }
                

这个例子启用了一个调用 pci 内核 API 的“虚拟的”PCI 设备。这个虚拟的设备还可以用于其他测试。


结束语


如果您是一位具有一定经验的 Linux 内核和设备驱动程序开发人员,使用 DSF 将让您双重受益:由于 DSF 模板可以用于很多不同的测试,所以您可以更快地开发测试用例并保证其更加一致。而且,您还可以执行内核的特定目标区域,这样典型的用户空间测试用例执行内核代码时就不会再漫无目的。

Linux Test Project 的目标是帮助设备驱动程序开发人员标准化设备单元测试,提高 Linux 内核中设备驱动程序的稳定性。考虑到这一点,欢迎您通过 mridge@us.ibm.com与我联系并分享您使用 DSF 的经验。


参考资料

关于作者

Martin Ridgeway 是 IBM Linux Technology Center 的 Linux Test Project 的一位团队领导。去年他所从事的一些项目包括 Linux Test Project 和内核代码复盖分析。可以通过 mridge@us.ibm.com 与他联系。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=22083
ArticleTitle=用 DSF 模拟设备
publish-date=03012004
author1-email=mridge@us.ibm.com
author1-email-cc=

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。