在这个答案中,作者指出:
使用64位x86_64内核时,32位进程可以使用整个4GB地址空间,除了由内核管理的末尾几页(8KB)。
这个由内核管理的内存有什么作用?难道不应该在内核空间中,以防止用户意外破坏吗?使用64位x86_64内核时,32位进程可以使用整个4GB地址空间,除了由内核管理的末尾几页(8KB)。
这个由内核管理的内存有什么作用?难道不应该在内核空间中,以防止用户意外破坏吗?一些内核内存可以位于应用程序用户空间地址空间中,并以PROT_NONE
的方式进行类似于mmap的映射。这样就会使用一些地址空间,但程序无法访问(因此不可能发生损坏)。
-4095 .. -1
是0xfffff001 .. 0xffffffff
。0xfffff000
是-4096
,而不是-4095
,因此它是从mmap返回的有效非错误值。(映射该页面实际上不起作用,但我并不认为这是原因,除非有一个隐藏的VMA保留了顶部页面,以便内核不必担心用户空间将它们作为参数传递给read
或其他函数。) - Peter Cordes