【问题标题】:Can mmap on Mac return null?Mac上的mmap可以返回null吗?
【发布时间】:2017-09-21 23:02:51
【问题描述】:

Linux manpagePOSIX standard 都指定,只要未提供 MAP_FIXED 标志,mmap 就保证不会返回从地址 0 开始的内存。但是,没有记录此类保证在 Mac 的 mmap 联机帮助页中。

我不确定 Mac 对 POSIX 的遵从性有多严格。它的mmap 是否提供此保证?

【问题讨论】:

  • 我认为您可以放心地假设 Mac 上的 mmap 不会返回以 0 开头的地址。这样做会破坏很多东西。
  • 一切顺利。但是,它可以返回 -1(强制转换为 void 指针)以指示失败。
  • @KevinBallard 我同意,但我想要一个比这更强大的保证 - 理想情况下是某个地方的文档,或者至少是达尔文源代码中的注释或其他内容。
  • @wildplasser “任何事情发生”是否意味着它可以返回 NULL?你的依据是什么?
  • 它可以返回NULL。但它不会。

标签: linux macos null posix mmap


【解决方案1】:

macOS 符合 POSIX。事实上,它是certified as officially UNIX-compliant,这意味着符合 POSIX。

此外,来自 macOS 的链接器手册页,ld

 -pagezero_size size
             By default the linker creates an unreadable segment starting
             at address zero named __PAGEZERO.  Its existence will cause a
             bus error if a NULL pointer is dereferenced.  [...]
             By default on 32-bit architectures the page zero size
             is 4KB.  On 64-bit architectures, the default size is 4GB.
             [...]

因此,除非你做了一些非常不寻常的事情来禁用它,否则从地址 0 开始已经保留了一个或多个页面。所以,mmap() 不会在那里分配新页面。

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 2016-10-17
    • 2010-11-10
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多