2

我对mmap()系统调用有点困惑。我意识到它映射内存,我不明白从应用程序mmap()调用调用如何干扰(或不)已经运行的 malloced 段,特别是那些使用.sbrk()

让我进一步解释一下我的意思:假设我通过简单的where
分配了几个结构。根据 glibc,这些调用将使用 sbrk() 调用 (v2.15/malloc.c) 来满足,这将使数据段向上增长。malloc(x);x < 1MB

sbrk()将导致虚拟数据段连续增长。所以我的问题是,当sbrk()被调用到通过mmap().

对此有何想法或评论?非常感激!

4

2 回答 2

3

我在 64 位 OS X (Mountain Lion) 上尝试了一些实验。和文档不相互引用,因此其中一些内容是在字里行间阅读的,但看起来像sbrkmmap

  • 有一大片区域可供sbrk生长。当你超过那个预留时,sbrk就会失败。
  • mmap允许为地图选择位置时(它被称为不带MAP_FIXED标志),它选择除保留之外的区域sbrk
  • 所以,在正常使用中,sbrk不要mmap互相干扰。此外,无论malloc使用哪种实现,它都应该接受它获得的内存并将其合并到它的数据库中而不会出现问题,无论它是从其他地方获取内存sbrk还是mmap从其他地方获取内存。并且不应该干扰程序对sbrkand的独立正常使用mmap
  • 如果您调用mmapwithMAP_FIXED并指定位于 的保留区域中的地址sbrk,则将mmap在那里映射内存。
  • sbrk如果您在 a 之后继续调用,即使新的中断地址与映射的内存重叠mmap,也会返回成功。此时,您的程序可能已损坏。sbrkmmap

因此,除非您有充分的理由知道您指定的地址是可以的,否则使用mmapwith是不明智的。MAP_FIXED

于 2013-04-26T20:58:19.323 回答
1

堆和堆栈之间的简单划分是一种简化。现代操作系统支持具有许多对进程可见的独立内存区域的大型虚拟地址空间。尽管这些区域是同一地址空间的一部分,但它们不是连续的,它们中有孔。返回的地址mmap()位于许多漏洞之一:它可能在堆和堆栈之间,在堆栈之后,在堆之前 - 只要这些区域永远不会相遇,它就不会产生影响。

还要记住,在线程程序中没有单个堆栈,有多少线程就有多少。

于 2013-04-26T19:37:54.677 回答