64位Linux上32位进程的地址空间

6
这个答案中,作者指出: 使用64位x86_64内核时,32位进程可以使用整个4GB地址空间,除了由内核管理的末尾几页(8KB)。 这个由内核管理的内存有什么作用?难道不应该在内核空间中,以防止用户意外破坏吗?
2个回答

7
引用内核源代码:“内核指针有冗余信息,因此我们可以使用一种方案,其中我们可以返回错误代码或带有相同返回值的指针。”
数值-1..-4095(映射到32位模式下的0xfffff000–0xffffffff)保留用于内核级errno值。从0xffffe000–0xffffefff的另外4KB被保留用于vsyscall vdso魔术页面,但由于自很久以来vdso页面是可重定位的,因此这个区域仍然可能未被填充,也就是说,/proc/*/maps中的[stack]条目始终在0xffffdfff结束,无论[vdso]是否映射到0xffffe000或其他位置。

1
-4095 .. -10xfffff001 .. 0xffffffff0xfffff000-4096,而不是 -4095,因此它是从mmap返回的有效非错误值。(映射该页面实际上不起作用,但我并不认为这是原因,除非有一个隐藏的VMA保留了顶部页面,以便内核不必担心用户空间将它们作为参数传递给read或其他函数。) - Peter Cordes

2

一些内核内存可以位于应用程序用户空间地址空间中,并以PROT_NONE的方式进行类似于mmap的映射。这样就会使用一些地址空间,但程序无法访问(因此不可能发生损坏)。


为什么内核会在用户空间分配内存?你能指出任何相关的资源吗? - pbp
它正在分配地址空间,而不是真正的内存... Jorgensen在stackoverflow.com上的回答https://dev59.com/3l7Va4cB1Zd3GeqPJWak#8547556解释了原因... - Basile Starynkevitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接