如何在Linux上模拟内存I / O设备进行单元测试?

时间:2012-05-31 21:16:41

标签: c linux memory-mapping

如何在Linux上模拟内存I / O设备进行单元测试?

我正在为嵌入式部署的一些源代码编写单元测试。

代码正在访问特定的地址空间以与芯片通信。

  • 我想在Linux上对此代码进行单元测试(UT)。
  • 单元测试必须能够在没有人为干预的情况下运行。
  • 我需要以普通用户身份运行UT。
  • 必须测试的代码必须与目标系统上运行的源代码完全相同。

关于如何解决这个问题,我可以从哪里获得灵感?

普通用户能否以某种方式告诉MMU必须在特定地址进行特定的内存分配。 或者数据块必须位于特定的内存区域?

据我所知:

  • sigsegv不能使用;因为从处理程序返回后,将再次调用相同的mem访问代码并再次失败。 (或者意外地,内存区域实际上可能包含有效数据,而不是我想要的内容)

    由于

    亨利

2 个答案:

答案 0 :(得分:2)

首先,使地址被读取代码的注入依赖性,而不是硬编码的依赖性。现在你不必担心测试条件下的位置,它可以是你喜欢的任何东西。

然后,根据您正在测试的内容,您可能还需要注入一个函数来从/向魔术地址读取/写入作为依赖项。现在,您不必担心它会如何欺骗被测试的代码,使其认为它正在执行I / O.您可以存根/模拟/无论硬件I / O行为如何。

在您描述的条件下测试低级代码非常困难,同时在非测试模式下保持超高效,因为您不希望引入太多级别的间接。

“确切地说,源代码”可以隐藏大量的罪行,具体取决于你如何理解它。例如,你的“依赖注入”可能是通过一个宏,所以单位源是“相同的”,但你完全改变了它使用偷偷摸摸的-D编译器选项所做的事情。

答案 1 :(得分:0)

AFAIK你需要创建一个块设备(我不确定字符设备是否可以工作)。创建一个内核模块,将该内存范围映射到自身。 创建读/写功能,因此只要触摸该存储器范围,就会调用这些读/写功能。

向内核注册那些读/写函数,这样每当对这些地址进行读/写操作时,就会调用内核并由内核代表用户执行读/写功能。