在我们的任务之一,我们需要建立2台机器之间分布式共享存储器,I是使用寻呼基础的技术,使得基地址在两个不同的机器。 但是有这个链表测试案例几乎任务,这两个地址范围是相同的。 使用MAP_FIXED的mmap的固定地址,导致从机器崩溃(因为回复服务器线程的堆栈被覆盖掉了),我想,创造出一种gauranteed是免费的在地址初始化期间最开始的两个过程是合理的。 然而,淘净的小时后我仍然在寻找默认地址不走运。 我们的要求是10000页。 如果有人可以点超出该SBRK是gauranteed堆地址的基地不增长,我可以利用这一点。
最好,萨勃拉曼尼亚
我不认为任何人将是能够保证永远是可行的任何地址。 虚拟地址的选择始终是内核和MAP_FIXED
总是要踩到脚趾。
可能我建议不要使用-m32
编译你的应用程序? 有了这么多的更多的地址,你会4294967296倍不太可能,如果你选择一个随机地址命中冲突。
我建议以下的黑客之一:
- 既然你是在Linux上,读取和解析
/proc/self/maps
。 查找任意两个映射之间的最大差距,就在这个间隙的中点选择一个地址。 如果以前的映射向上爬行或下一个映射在随后的运行中向下爬行你应该是相当安全的。 沟通这个地址到其他进程,以便它可以在同一地址尝试映射。 我们希望其他进程的内存映射将足够类似,它都会有这个很大的差距或多或少在同一个地方。 - 暂时分配一个巨大的匿名内存量没有
MAP_FIXED
。 为了您的固定映射,马上试试这个映射之后的地址。 沟通这个地址到其他进程,以便它可以在同一地址尝试映射,然后摆脱暂时的映射。 我们希望其他进程的内存映射就足够相似,你离开了自己一个巨大的备用地址的数量您选择的地址之前,这样,如果第二个进程占据其中的一些,你仍然会确定。
并且记住,这些都是黑客。
文章来源: Reasonable valid start address for mmap address hint so as to be gauranteed that things work