强制内存分配总是到相同的虚拟地址

我正在试验Pin ,一个测量工具,我使用它来根据variables的内存地址计算一些统计数据。 我想用我的工具工具收集的信息重新运行我的程序,但是至关重要的是虚拟内存地址通过不同的运行保持不变。

一般来说,我应该让操作系统处理内存分配,但在这种情况下,我需要某种方式来强制它始终分配到相同的虚拟地址。 特别是,我感兴趣的是一个非常长的数组,我正在用numa_alloc_onnode()分配,尽pipe我可以使用其他的东西。

什么才是正确的方法呢?

谢谢

你可以试试mmap(2)。

您的程序的仪表版本将使用与原始程序不同的内存布局,因为引脚需要动态翻译等内存,并将更改内存布局。 (如果我没记错的话)

除地址空间布局随机化之外,给定相同的调用和数据的大多数内存分配器,加载器和用于分配虚拟内存地址的系统例程将返回相同的结果(不是通过故意设计,而是由软件的工作原理自然产生) 。 所以,你需要:

  • 禁用地址空间布局随机化。
  • 确保您的程序每次都以相同的方式执行。

地址空间布局的随机化是故意改变地址空间来阻止攻击者:如果地址在每个程序执行中被改变,攻击就更难以使用各种漏洞来控制被执行的代码。 应该暂时禁用,仅用于调试目的。 这个答案显示了一个这样做的方法和链接到更多的信息,但确切的方法可能取决于你使用的Linux版本。

由于各种原因(例如使用线程或使用异步信号或进程间通信),您的程序可能会执行不同的操作。 这将取决于你在你的程序中控制它。

一般来说,内存分配不保证是可重复的。 你得到的结果可能是按原样。