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

标签 c linux memory-mapping

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

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

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

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

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

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

据我了解:

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

    谢谢

    亨利

最佳答案

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

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

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

不过,“确切的源代码”可以隐藏许多错误,这取决于您如何解释它。例如,您的“依赖项注入(inject)”可以通过宏进行,因此单元源是“相同的”,但是您已经使用偷偷摸摸的 -D 编译器选项完全改变了它的作用。

关于c - 如何模拟内存 I/O 设备以在 Linux 上进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10841410/

相关文章:

将程序的输出复制到屏幕和文件

我们可以在 C 中将一个数组映射到另一个数组,就像映射一个文件一样吗?

c - 从屏幕获取像素颜色

c - "new_dollars = dollars + cents/100"没有变化

android - 如何在 beaglebone black 上使用 RS485

java - Java中排序(内存映射?)文件中的二进制搜索

io - 内存映射 IO - IO 设备如何知道值已更改?

客户端 read() 获取消息的随机尾随字符(使用套接字的 TCP 客户端-服务器)

更改 C 代码以完全运行(包括 if 的所有部分)

c++ - 使用 glibc 2.7 编译包含路径失败