为什么mmap()使用MAP_FAILED而不是NULL?

时间:2014-07-03 20:21:36

标签: ios linux macos posix mmap

有人知道为什么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的存在感到困惑。

1 个答案:

答案 0 :(得分:11)

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

另一方面,

MAP_FAILED永远不是mmap()的有效返回值,因此它可用作哨兵。