3

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

对于 Windows NT、2k 和 XP,这将是:

0x00000000 - 0x0000ffff -> 保护最低页以简化调试

0x00001000 - 0x7ffeffff -> 应用程序的内存区域

0x7ffff0000 - 0x7fffffff -> 保护区域以防止内存功能损坏以下部分

0x80000000 - 0xffffffff -> 包括驱动等系统所在的内存

有人知道 Linux 或 BSD(或其他任何东西)吗?

4

1 回答 1

1

Linux 通常被内核配置为拥有 0xC000000 到 0xFFFFFFFF。这可以更改(例如,臭名昭著的 4GB-4GB 拆分不保留任何内容)。glibc 通常在 0xB000000 加载。

在 Linux 下,特定的 mmap() 调用可以请求 0x00000000,除非被安全 sysctl 阻止(结果证明阻止是个坏主意)。

重新分配 NULL:

NULL 只能显式分配,所以我假设执行它的程序已经为这样做的后果做好了准备。至少-fno-delete-null-pointer-checks需要 GCC 才能使受影响的代码正常运行。有人告诉我这是为了模仿旧的 BSD 行为,将零页映射到那里。

于 2010-03-15T15:05:44.323 回答