【问题标题】:Reserved Memory Addresses?保留内存地址?
【发布时间】:2010-03-15 14:59:21
【问题描述】:

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

对于 Windows NT、2k 和 XP 来说:

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

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

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

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

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

【问题讨论】:

    标签: memory memory-management reserved


    【解决方案1】:

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

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

    重新分配NULL:

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

    【讨论】:

    • 这让我有点困惑——如果 NULL 是可分配的,那么它对所有初始化它的程序有什么作用?你知道有什么好的资源可以讨论这个问题吗?
    猜你喜欢
    • 2011-04-24
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 2014-07-05
    • 2021-04-08
    • 2013-11-10
    相关资源
    最近更新 更多