【问题标题】:Why does mmap() use MAP_FAILED instead of NULL?为什么 mmap() 使用 MAP_FAILED 而不是 NULL?
【发布时间】:2014-08-25 02:35:32
【问题描述】:

有人知道为什么 mmap() 返回 MAP_FAILED 而不是 NULL 吗?在大多数系统上,MAP_FAILED 似乎是 (void*)-1。为什么 mmap() 不直接使用 NULL 呢?我知道地址 0x0 在技术上是一个有效的内存页面,而 (void*)-1 永远不会是一个有效的页面。然而我的猜测是 mmap() 在实践中永远不会真正返回页面 0x0。例如,在 Windows 上,VirtualAlloc() 出错时返回 NULL。

假设 mmap() 永远不会返回 0x0 是否安全?据推测,对 mmap() 的成功调用应该将可用内存返回给调用者。地址 0x0 永远不可用,因此永远不应该在成功时返回它。在这种情况下,使用 0x0 作为故障前哨似乎是明智的,这就是为什么我首先对 MAP_FAILED 的存在感到困惑。

【问题讨论】:

    标签: ios linux macos posix mmap


    【解决方案1】:

    在极少数情况下,mmap() 实际上会在地址 0x0 处创建映射。如今,它通常需要 root 权限(或在 Linux 系统上将 mmap_min_addr sysctl 设置为零),但这是可能的。如果创建了这样的映射,则可以写入该地址。

    另一方面,MAP_FAILED 绝不是来自mmap() 的有效返回值,因此它可用作哨兵。

    【讨论】:

    • mmap_min_addr 很有意思。因此,在某些情况下,您似乎确实可以在地址 0x0 处请求映射。鉴于此,请允许我对我的问题进行更具体的说明。我问过 mmap() 在实践中是否会返回 NULL,但我真正想问的是,像 mmap(NULL, size, flags, MAP_ANON | MAP_PRIVATE, -1, 0) 这样的 MAP_ANON 调用是否会返回在实践中为空。这是我的实际用例,所以这才是我真正好奇的地方。
    • 不,mmap() 永远不会返回该地址的映射,除非您使用 MAP_FIXED 请求它。
    • @duskwuff 我很确定你是对的,但你有来源吗?
    • @Guido From the spec:“当实现为 pa 选择一个值时,它永远不会在地址 0 处放置一个映射。”
    猜你喜欢
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    相关资源
    最近更新 更多