mmap(2) 返回的地址是否有可能与堆冲突?
Is there any chance of an address returned by mmap(2) clashing with the heap?
如果我使用 mmap(2)
分配一些页面而不提供地址提示,然后使用 malloc(3)
/ calloc(3)
分配一些内存,是否有可能 malloc
调用 sbrk(2)
并以某种方式增大堆,使其与我之前调用 mmap
时重叠的地址 return 或者 mmap
始终保证 return 远离堆或栈的地址?
不,您不会有重叠。
那并不意味着他们会很远,他们可能只是挨着一个。但是,如果您遵守分配内存的限制,一切都会好起来的。
请注意,malloc()
的 glib 实现将使用匿名 mmap()
调用来满足对大块内存的请求。
不,不存在冲突的风险,在 linux 中没有,而且可能在使用分页的任何实现中都没有——而且我怀疑在没有分页的系统上会有 mmap()
。我现在不能告诉你(因为我只是不知道)哪个虚拟地址 mmap()
使用:可能确实离堆足够远。对于物理内存:sbrk()
迟早会引发 页面错误 ,当然,您的 OS 会为您映射一个 [=26] 的页面=]没有在使用中。 mmap()
无论如何都可以在整个页面上工作...
edit 正如 rodrigo 正确指出的那样,big 对 malloc()
的请求使用 mmap()
无论如何。因此,对于使用 sbrk()
服务的小请求,您不必期望 太多 很多页面错误。
如果我使用 mmap(2)
分配一些页面而不提供地址提示,然后使用 malloc(3)
/ calloc(3)
分配一些内存,是否有可能 malloc
调用 sbrk(2)
并以某种方式增大堆,使其与我之前调用 mmap
时重叠的地址 return 或者 mmap
始终保证 return 远离堆或栈的地址?
不,您不会有重叠。
那并不意味着他们会很远,他们可能只是挨着一个。但是,如果您遵守分配内存的限制,一切都会好起来的。
请注意,malloc()
的 glib 实现将使用匿名 mmap()
调用来满足对大块内存的请求。
不,不存在冲突的风险,在 linux 中没有,而且可能在使用分页的任何实现中都没有——而且我怀疑在没有分页的系统上会有 mmap()
。我现在不能告诉你(因为我只是不知道)哪个虚拟地址 mmap()
使用:可能确实离堆足够远。对于物理内存:sbrk()
迟早会引发 页面错误 ,当然,您的 OS 会为您映射一个 [=26] 的页面=]没有在使用中。 mmap()
无论如何都可以在整个页面上工作...
edit 正如 rodrigo 正确指出的那样,big 对 malloc()
的请求使用 mmap()
无论如何。因此,对于使用 sbrk()
服务的小请求,您不必期望 太多 很多页面错误。