强制将内存分配给同一个虚拟地址

时间:2014-01-14 01:10:10

标签: c linux memory-management instrumentation intel-pin

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

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

什么是正确的方法?

由于

2 个答案:

答案 0 :(得分:3)

您可以尝试mmap(2)。

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

答案 1 :(得分:2)

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

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

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

由于各种原因,例如使用线程或使用异步信号或进程间通信,您的程序可能会以不同的方式执行。您可以在程序中控制它。

通常,内存分配不保证可重现。您获得的结果可能是原样。