是否有一个保留的内存地址列表 - 用户空间程序的内存永远不能分配给的地址列表?我意识到这很可能是每个操作系统或每个架构,但我希望有人可能知道一些更常见的操作系统和拱门。我只能为几个版本的Windows挖掘一个:
对于Windows NT,2k和XP将是:
0x00000000 - 0x0000ffff - >最低页面受到保护以简化调试
0x00001000 - 0x7ffeffff - >应用程序的内存区域
0x7fff0000 - 0x7fffffff - >保护区域,以防止记忆功能损坏以下部分
0x80000000 - 0xffffffff - >包含驱动程序等系统所在的内存
任何人都知道Linux或BSD(或其他任何事情)?
答案 0 :(得分:1)
Linux通常配置为由内核拥有0xC000000到0xFFFFFFFF。这可以改变(例如臭名昭着的4GB-4GB分割,不保留)。 glibc通常加载为0xB000000。
在Linux下,特定的mmap()调用可以请求0x00000000,除非被安全sysctl阻止(结果是一个坏主意阻塞)。
重新分配NULL:
NULL只能显式分配,所以我假设执行它的程序是为这样做的结果而准备的。 GCC需要至少
-fno-delete-null-pointer-checks
才能使受影响的代码正常运行。我被告知这是为了模拟在那里映射零页面的旧BSD行为。