Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
如果我使用 分配一些页面,而不提供mmap(2)地址提示,然后使用malloc(3)/分配一些内存calloc(3),是否有可能以重叠到我之前调用或返回的地址的方式malloc调用和增长堆返回一个远离堆或栈的地址?sbrk(2)mmapmmap
mmap(2)
malloc(3)
calloc(3)
malloc
sbrk(2)
mmap
不,没有发生冲突的风险,在linux中没有,也可能在任何使用分页的实现中都没有——而且我怀疑mmap()没有分页的系统会存在。我现在不能告诉你(因为我只是不知道)mmap()使用哪些虚拟地址:可能确实离堆足够远。对于物理内存:sbrk()迟早会引发页面错误,当然,您的操作系统会注意映射您未使用的页面。mmap()无论如何都可以在整个页面上工作...
mmap()
sbrk()
编辑正如罗德里戈正确指出的那样,无论如何都会使用大请求。因此,对于使用 服务的小请求,您不必期待太多的页面错误。malloc()mmap()sbrk()
malloc()
不,你不会有重叠。
这并不意味着它们会很远,它们可能就在彼此旁边。但是,如果您尊重分配内存的限制,一切都会好起来的。
请注意,glib 的实现malloc()将使用匿名mmap()调用来满足对大块内存的请求。