如何在Linux上模拟内存I / O设备进行单元测试?
我正在为嵌入式部署的一些源代码编写单元测试。
代码正在访问特定的地址空间以与芯片通信。
关于如何解决这个问题,我可以从哪里获得灵感?
普通用户能否以某种方式告诉MMU必须在特定地址进行特定的内存分配。 或者数据块必须位于特定的内存区域?
据我所知:
sigsegv不能使用;因为从处理程序返回后,将再次调用相同的mem访问代码并再次失败。 (或者意外地,内存区域实际上可能包含有效数据,而不是我想要的内容)
由于
亨利
答案 0 :(得分:2)
首先,使地址被读取代码的注入依赖性,而不是硬编码的依赖性。现在你不必担心测试条件下的位置,它可以是你喜欢的任何东西。
然后,根据您正在测试的内容,您可能还需要注入一个函数来从/向魔术地址读取/写入作为依赖项。现在,您不必担心它会如何欺骗被测试的代码,使其认为它正在执行I / O.您可以存根/模拟/无论硬件I / O行为如何。
在您描述的条件下测试低级代码非常困难,同时在非测试模式下保持超高效,因为您不希望引入太多级别的间接。
“确切地说,源代码”可以隐藏大量的罪行,具体取决于你如何理解它。例如,你的“依赖注入”可能是通过一个宏,所以单位源是“相同的”,但你完全改变了它使用偷偷摸摸的-D
编译器选项所做的事情。
答案 1 :(得分:0)
AFAIK你需要创建一个块设备(我不确定字符设备是否可以工作)。创建一个内核模块,将该内存范围映射到自身。
创建读/写功能,因此只要触摸该存储器范围,就会调用这些读/写功能。
向内核注册那些读/写函数,这样每当对这些地址进行读/写操作时,就会调用内核并由内核代表用户执行读/写功能。