mmap (使用MAP_ANONYMOUS调用,即分配内存时)是否始终返回比上一次调用更高的内存地址?如果不是这样,有没有办法让它总是返回一个更高的地址?
答案 0 :(得分:3)
默认情况下,mmap
可以按任意顺序返回页面边界上对齐的任何地址。
如果要强制返回的地址是您指定的地址,可以使用MAP_FIXED
标志,但这不是非常便携和可靠。这样,您就可以在特定内核上使用mmap
的特定实现来绑定代码。
但无论如何,为什么你总是需要一个比前一个更高的地址?可能更好的方法是改变程序的逻辑。
答案 1 :(得分:3)
不一定,至少不是根据其定义。
我相信,ASLR可能会出现高位地址不再可用,因此mmap
必须选择较低的地址范围。
显然,在32位处理器(和内核)上,内存空间几乎可以填满,所以当要求一个很大的mmap
- 范围时,内核应该找到一个适合的,并且可以在任何地方。
如果您想要单调方向,请使用sbrk(但我建议您不要使用它)。
另一种可能性是在程序初始化时使用mmap
和MAP_NORESERVE
预分配非常大量(例如几兆兆字节)的地址空间,并使用{{1}调用mmap
在该范围内再次获得真正可用的空间(在更易管理的块中,例如几十兆字节)。
@MetallicPriest:你真的应该激励并解释更多你的问题。有这么神秘和奇怪(甚至我无法猜测所有的背景)回答它们并不是很有趣。