【问题标题】:32-bit process’s address space on 64-bit linux64位Linux上32位进程的地址空间
【发布时间】:2012-01-22 17:47:50
【问题描述】:

this 回答作者指出: With the 64-bit x86_64 kernel, a 32-bit process can use the entire 4GB address space, except for a couple pages (8KB) at the end of the 4GB address space which are managed by the kernel.

这个内核管理内存的目的是什么?它不应该在内核空间中,以防止用户意外损坏吗?

【问题讨论】:

    标签: linux memory linux-kernel x86-64 32bit-64bit


    【解决方案1】:

    引用内核源代码:“内核指针具有冗余信息,因此我们可以使用一种可以返回错误代码或具有相同返回值的 [...] 指针的方案。

    值 -1..-4095(在 32 位模式下映射到 0xfffff000–0xffffffff)保留用于内核级 errno 值。 0xffffe000–0xffffefff 的另外 4KB 为 vsyscall vdso 魔术页面保留,但由于 vdso 页面可重定位,因为许多卫星,该区域仍然可能无人居住,也就是说,/proc/*/maps 中的 [stack] 条目结束于0xffffdfff 始终不管 [vdso] 是否映射到 0xffffe000 或其他位置。

    【讨论】:

    • -4095 .. -10xfffff001 .. 0xffffffff0xfffff000-4096,而不是 -4095,因此它是来自 mmap 的有效非错误返回值。 (mmaping that page doesn't actually work,但我不相信这是原因,除非有一个隐藏的 VMA 保留首页,因此内核不必担心用户空间将它们作为 args 传递给 read 或其他东西。)
    【解决方案2】:

    一些内核内存可以在应用程序用户空间地址空间内,并且可以与mmap-ed 和PROT_NONE 混为一谈。然后将使用一些地址空间,但程序无法访问(因此不会损坏)。

    【讨论】:

    • 为什么内核要在用户空间分配内存?你能指出任何相关的资源吗?
    • 它是在分配地址空间,而不是真正的内存... Jorgensen 的回答stackoverflow.com/a/8547556/841108 解释了原因...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 2013-05-19
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多