【问题标题】:Linux IA-32 memory modelLinux IA-32 内存模型
【发布时间】:2010-01-12 09:55:13
【问题描述】:

我正在查看一个进程的 Linux IA-32 内存模型,我有一个简单的问题。图片中的灰色区域包含什么?它们是否仅用于显示内存的开始和结束?那么,文本从 0x0 开始,堆栈从 0xFFFFFFFF 开始吗?

重新打开: 嗨,在我正在参加的操作系统课程中,这个问题再次变得相关。具体来说,我需要知道灰色区域包含什么。根据到目前为止的答案,我可以看到它在顶部包含内核代码,在底部包含一个空指针取消引用页面。但是内核代码是什么?我不认为它是整个操作系统本身,但它可能是嵌入式调度程序、内核库调用还是?

最好的问候,Lasse Espeholt

alt text http://img403.imageshack.us/img403/3156/capturecj.png

【问题讨论】:

    标签: linux memory model x86


    【解决方案1】:

    我认为这更准确:

    【讨论】:

    • 啊似乎有道理;)但根据该图,进程只有 ~1GB 内存可以使用。 (0xC0000000 - 0x80480000) 但它可能会增加到内核虚拟内存?
    • 它是 0x08048000,而不是 0x80480000。所以它小于 3 GB。
    • 0x00000000+ 通常对用户空间可用。通常不使用它,因为通常认为将页面映射到 0x0 是一个坏主意,而且最近的内核有一个安全选项来保留前几 kb 的内存。但它不是一个完整的 0x08000000 保留,这是肯定的。
    【解决方案2】:

    我认为灰色区域仅代表未定义大小的区域。程序文本肯定不会从 0x0 开始,因为大多数操作系统将它们用作无效页面,因此可以轻松捕获空取消引用。线程堆栈也不会直接达到 0xffffffff,因为通常上四分之一(或一半)的内核内存映射到其中。

    【讨论】:

      【解决方案3】:

      另请注意,由于address space layout randomization,某些部分的起始地址与图中的值随机偏移。

      【讨论】:

        【解决方案4】:

        似乎没有人提到并非可用空间中的所有内存都必须映射(而且几乎从来没有)。

        【讨论】:

          【解决方案5】:

          请注意,地址空间底部的零页区域并非实际上禁止在常见的 linux 发行版下应用程序使用。内核曾经这样做,然后最终将该决定交给 LSM 模块(例如 SELinux、AppArmor)。而且他们没有强制执行相同的规则,因此进程可以将内存映射到 0x0。这是最近“内核空指针取消引用”攻击背后的漏洞的一部分。

          【讨论】:

          • /proc/sys/vm/mmap_min_addr 被 vanilla 内核默认为非零值,所以这仅在您有一个更改它或使用 LSM 的发行版时才重要。我不知道这有多普遍。 Debian 没有,Ubuntu 没有(除非安装了 Wine),Gentoo 没有,……这就是我使用的所有发行版。
          • Fedora 和 Red Hat 默认启用 SELinux。 Novell/SuSE 提供 AppArmor,最近版本的 Ubuntu 也是如此。在现代世界中,LSM 更像是规则而不是例外,并且碰巧这导致了空页保护的倒退。
          猜你喜欢
          • 1970-01-01
          • 2011-02-28
          • 2010-09-28
          • 1970-01-01
          • 2011-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多