2010-03-15 126 views
3

是否有保留的内存地址列表 - 用户空间程序的内存永远不会分配到的地址列表?我意识到这很可能是每个操作系统或每个架构,但我希望有人可能知道一些更常见的操作系统和拱门。我只能挖一个为Windows的几个版本:保留的内存地址?

用于Windows NT,2000和XP,这将是:

00000000 - 0x0000ffff - >最低页面被保护,以简化调试

0x00001000 - 0x7ffeffff - >内存为您的应用领域

0x7fff0000 - 为0x7FFFFFFF - >保护区,以保持记忆功能损坏以下部分

0x80的000000 - 0xffffffff - >内存包含驱动程序等系统所在的内存

任何人都知道Linux或BSD(或其他任何事情)?

回答

1

Linux通常被内核配置为拥有0xC000000到0xFFFFFFFF。这是可以改变的(例如臭名昭​​着的4GB-4GB分割不保留)。 glibc通常加载在0xB000000。

在Linux下,0x00000000可以被特定的mmap()调用请求,除非被安全性sysctl阻塞(结果是一个不好的主意来阻止)。

Reguarding分配NULL:

NULL只有明确分配的,所以我会认为这样做是在这样做的后果准备的节目。 GCC需要至少-fno-delete-null-pointer-checks才能使受影响的代码正常工作。我被告知这是模仿旧的BSD行为,它在那里映射零页。

+0

这让我感到困惑 - 如果NULL是可分配的,那么对于所有初始化为它的程序会做什么?你知道有什么好的资源来讨论这个问题吗? – Nate 2010-03-15 15:15:23

+0

多么迷人! – Nate 2010-03-15 17:25:26