1

在我们的一项任务中,我们需要在两台机器之间构建一个分布式共享内存,我使用了一种基于分页的技术,这样两台机器上的基地址都不同。但是有这个链表测试用例几乎要求两个地址范围相同。mmap 使用 MAP_FIXED 的固定地址会导致从机崩溃(因为回复服务器线程的堆栈被覆盖),我认为在两个进程的初始化期间创建一个保证在开始时免费的地址是合理的。但是,经过数小时的网络搜索后,我仍然很不幸地找到了该默认地址。我们的要求是 10000 页。如果有人可以指出 sbrk 保证不会增长的堆地址基址,我可以使用它。

最好的,Subramanian

4

1 回答 1

3

我认为没有人能够保证任何地址将始终有效。虚拟地址的选择总是由内核决定,并且MAP_FIXED总是会踩到它的脚趾。

我可以建议不要使用-m32来编译您的应用程序吗?有了这么多可用地址,如果您选择随机地址,发生冲突的可能性将降低 4294967296 倍。

我会建议以下黑客之一:

  • 由于您在 Linux 上,请阅读并解析/proc/self/maps. 找到任意两个映射之间的最大间隙,并在该间隙的中点选择一个地址。万一之前的映射向上爬行或下一个映射在后续运行中向下爬行,您应该是相当安全的。将此地址传达给其他进程,以便它可以尝试在同一地址进行映射。希望其他进程的内存映射足够相似,并且在同一个地方或多或少会有这么大的差距。
  • 临时分配大量匿名内存而不使用MAP_FIXED. 对于您的固定映射,请尝试紧跟此映射的地址。将此地址传达给其他进程,以便它可以尝试在同一地址进行映射,然后摆脱临时映射。希望另一个进程的内存映射足够相似,并且您在选择的地址之前为自己留下了大量的备用地址,这样如果第二个进程占用了其中的一些地址,您仍然可以。

请记住,这些都是黑客行为。

于 2012-04-11T22:37:34.147 回答