mmap是否总是返回更高的地址

时间:2011-12-14 12:12:41

标签: c linux 64-bit x86 mmap

mmap (使用MAP_ANONYMOUS调用,即分配内存时)是否始终返回比上一次调用更高的内存地址?如果不是这样,有没有办法让它总是返回一个更高的地址?

2 个答案:

答案 0 :(得分:3)

默认情况下,mmap可以按任意顺序返回页面边界上对齐的任何地址。

如果要强制返回的地址是您指定的地址,可以使用MAP_FIXED标志,但这不是非常便携和可靠。这样,您就可以在特定内核上使用mmap的特定实现来绑定代码。

但无论如何,为什么你总是需要一个比前一个更高的地址?可能更好的方法是改变程序的逻辑。

答案 1 :(得分:3)

不一定,至少不是根据其定义。

我相信,ASLR可能会出现高位地址不再可用,因此mmap必须选择较低的地址范围。

显然,在32位处理器(和内核)上,内存空间几乎可以填满,所以当要求一个很大的mmap - 范围时,内核应该找到一个适合的,并且可以在任何地方。

如果您想要单调方向,请使用sbrk(但我建议您不要使用它)。

另一种可能性是在程序初始化时使用mmapMAP_NORESERVE预分配非常大量(例如几兆兆字节)的地址空间,并使用{{1}调用mmap在该范围内再次获得真正可用的空间(在更易管理的块中,例如几十兆字节)。

@MetallicPriest:你真的应该激励并解释更多你的问题。有这么神秘和奇怪(甚至我无法猜测所有的背景)回答它们并不是很有趣。