【问题标题】:Restricting virtual address range of a process?限制进程的虚拟地址范围?
【发布时间】:2020-04-28 09:08:45
【问题描述】:

在 Linux x86_64 上,我有一个简单的应用程序,我使用 Intel 的 PIN 跟踪所有内存访问。该程序仅使用“一点”内存,其中大部分用于动态分配的矩阵(我用ulimit 将正确的值一分为二)。但是,内存访问跨越了 VM 地址空间的整个范围,我认为代码中的全局变量的低地址,malloc()ed 数组的高地址。 中间有一个巨大的差距,即使在高地址,范围也在 0x7fff4e1a37f4 和 0x7fea3af99000 之间,这比我假设我的应用程序总共使用的要大得多。

我需要对内存访问进行的后处理处理这些稀疏访问非常糟糕,因此我正在寻找一种方法来限制进程可用的虚拟地址范围,以便“它正好适合”,并且访问将显示介于 0 和一些更合理的动态分配内存值之间的地址(我通过ulimit 发现的大约 40 Mb)。


问:有没有一种简单的方法可以将可用地址空间(以及隐含的可用内存)限制在 Linux 上的单个进程中,最好是在每个进程的命令行中进行?


补充说明:

  • 我可以静态链接我的应用程序。
  • 即使我使用 ulimit 限制内存,该进程仍然使用完整的 VM 地址范围(并非完全出乎意料)。
  • 我知道 /proc/${pid}/maps,但想避免创建包装器来处理这个问题,以及如何实际使用其中的数据。
  • 我听说过prelink(它可能不适用于我的静态二进制文件,而仅适用于库?)并且可以想象有更多侵入性的方法可以干扰malloc(),但这些解决方案离我们太远了我的专业知识来评估它们的有用性(Limiting the heap area's Virtual address rangehttps://stackoverflow.com/a/29960208/60462
  • 如果没有简单的命令行解决方案,而不是进行任何精心设计的 hack,我可能会在后处理中将其翼翼化并“规范化”地址,例如通过几行 perl)。

【问题讨论】:

    标签: virtual-memory


    【解决方案1】:

    ld.so(8) 将LD_PREFER_MAP_32BIT_EXEC 列为将地址空间限制为较低 2GiB 的一种方式,这明显小于正常的 64 位地址空间,但可能不足以满足您的目的。

    也可以使用 prctl(2) PR_SET_MM 选项来控制程序不同部分的地址来解决您的问题。

    【讨论】:

      猜你喜欢
      • 2011-08-21
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-29
      • 2014-05-28
      相关资源
      最近更新 更多