【问题标题】:Memory address emulation or mocking内存地址仿真或模拟
【发布时间】:2020-04-27 04:00:01
【问题描述】:

我在堆栈中看到的其他帖子很少,但没有一个真正回答我的问题。 是否可以模拟或以某种方式映射或拥有模拟特定内存地址的驱动程序,否则主机上不存在这些地址?

我正在查看我需要排除故障的一段嵌入式代码,但它从我的电脑上不存在的内存空间读取值。我可以更改地址的一个实例,但是那些不存在的收件人在代码上到处都是,因此将它们全部更改是不切实际的。

【问题讨论】:

  • 如果您有一个程序正在访问该程序声明的对象以外的任何地址(这些对象必然存在),那么在该行为完全有意义的范围内,它的效果是特定于C 实现的组合,尤其是它运行的硬件。要在别处运行此类代码,您可能需要虚拟机或类似的全机模拟器。这些存在于许多目标中。但是,您不太可能找到任何类型的轻量级驱动程序或仿真器来掩盖无效的内存访问。
  • 在Windows上你可以尝试使用VirtualAlloc,分配到一个特定的地址

标签: c memory arm embedded


【解决方案1】:

可以让代码运行以进行测试,但它的难易程度取决于两件事:代码引用地址的准确程度以及内存访问应该做什么?

一般来说,您可以编写一个库来模拟其他硬件。编写这样一个库可能是容易和困难之间的任何事情,这取决于这些访问应该做什么。在一个简单的情况下,访问不会以需要模拟的方式相互影响。在更困难的情况下,您可能需要某种状态机来跟踪正在发生的事情。在中等情况下,可能需要记住早期访问中的一些值,但不需要更复杂的状态机。

不过,编写库可能还不够。您还需要使您正在排除故障的代码使用该库。在实践中,代码需要调用库提供的函数。如果内存访问已经通过一些函数调用完成,你可以简单地在你的库中拥有这些函数的自己的版本。否则,需要更多的努力。

如果访问不是通过函数调用而是直接引用地址,一种解决方案可能是尝试编写正则表达式来匹配引用。如果您有正则表达式匹配所有或至少大部分,您可以使用它们和一些工具(如 sed)自动或多或少地用函数调用替换引用。

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 2012-07-30
    • 2018-07-09
    • 2011-08-09
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    相关资源
    最近更新 更多