3

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

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

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

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

关于如何解决这个问题的任何想法?

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

据我了解:

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

    谢谢

    亨利

4

2 回答 2

2

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

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

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

不过,“正是源代码”可以隐藏许多罪恶,这取决于您如何解释它。例如,您的“依赖注入”可能是通过宏,因此单元源是“相同的”,但您已经完全改变了它使用偷偷摸摸的-D编译器选项所做的事情。

于 2012-05-31T21:22:37.760 回答
0

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

向内核注册这些读/写功能,以便每当对这些地址进行读/写时,都会调用内核并由内核代表用户执行读/写功能。

于 2012-05-31T21:46:17.573 回答