【发布时间】: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 range,https://stackoverflow.com/a/29960208/60462) - 如果没有简单的命令行解决方案,而不是进行任何精心设计的 hack,我可能会在后处理中将其翼翼化并“规范化”地址,例如通过几行 perl)。
【问题讨论】:
标签: virtual-memory