保留的内存地址?
问题描述:
是否有保留的内存地址列表 - 用户空间程序的内存永远不会分配到的地址列表?我意识到这很可能是每个操作系统或每个架构,但我希望有人可能知道一些更常见的操作系统和拱门。我只能挖一个为Windows的几个版本:保留的内存地址?
用于Windows NT,2000和XP,这将是:
00000000 - 0x0000ffff - >最低页面被保护,以简化调试
0x00001000 - 0x7ffeffff - >内存为您的应用领域
0x7fff0000 - 为0x7FFFFFFF - >保护区,以保持记忆功能损坏以下部分
0x80的000000 - 0xffffffff - >内存包含驱动程序等系统所在的内存
任何人都知道Linux或BSD(或其他任何事情)?
答
Linux通常被内核配置为拥有0xC000000到0xFFFFFFFF。这是可以改变的(例如臭名昭着的4GB-4GB分割不保留)。 glibc通常加载在0xB000000。
在Linux下,0x00000000可以被特定的mmap()调用请求,除非被安全性sysctl阻塞(结果是一个不好的主意来阻止)。
Reguarding分配NULL:
NULL只有明确分配的,所以我会认为这样做是在这样做的后果准备的节目。 GCC需要至少
-fno-delete-null-pointer-checks
才能使受影响的代码正常工作。我被告知这是模仿旧的BSD行为,它在那里映射零页。
这让我感到困惑 - 如果NULL是可分配的,那么对于所有初始化为它的程序会做什么?你知道有什么好的资源来讨论这个问题吗? – Nate 2010-03-15 15:15:23
多么迷人! – Nate 2010-03-15 17:25:26