始终强制将内存分配到相同的虚拟地址[重复]

Posted

技术标签:

【中文标题】始终强制将内存分配到相同的虚拟地址[重复]【英文标题】:Force memory allocation always to the same virtual address [duplicate] 【发布时间】:2014-02-01 23:20:27 【问题描述】:

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

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

正确的方法是什么?

谢谢

【问题讨论】:

我从没用过 numa,但是看看手册页,numa_interleave_memory() 有帮助吗? 【参考方案1】:

你可以试试 mmap(2)。

您的程序的插桩版本将使用与原始程序不同的内存布局,因为 pin 需要用于动态翻译等的内存,并且会改变内存布局。 (如果我没记错的话)

【讨论】:

谢谢!如果 Pin 真的改变了内存布局,禁用 ASLR 对我来说是不够的。【参考方案2】:

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

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

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

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

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

【讨论】:

以上是关于始终强制将内存分配到相同的虚拟地址[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在没有虚拟内存的系统上如何处理ELF入口点地址?

如何为已分配的页面获取新的虚拟内存地址?

linux内存池能分配连续物理内存吗

如何将虚拟内存地址转换为物理地址?

PG数据库配置大页

每天3分钟操作系统修炼秘籍:虚拟内存分段