64位linux进程的虚拟内存的内核部分里面有什么?

64位linux进程的虚拟内存的内核部分里面有什么?

我想到了这个问题:

Linux进程的虚拟内存空间中拥有内核部分有什么用?

并根据答案和对答案的评论:

内核内存映射包括所有物理内存的直接映射,因此内存中的所有内容都出现在那里;它还包括内核、模块等的单独映射,因此包含内核的物理地址至少出现在两个不同的映射中

这是真的吗?我找不到任何来源或参考资料,为什么它会包含整个物理内存的映射,然后又有单独的内核模块映射?这不是多余的吗?

有人可以简单地解释一下64位Linux中进程虚拟内存的内核部分是什么吗?和请提供答案的来源!因为我在任何书籍或论文中都找不到与此相关的内容。

答案1

x86-64 上的内核内存映射是记录在内核本身中。内核映射

  • 用户空间(当前进程)
  • PTI 数据结构
  • 所有物理内存
  • 内核的数据结构,位于各个块中,存在 ASLR 漏洞
  • 内核本身
  • 它的模块

拥有物理内存的完整映射很方便,但与它所产生的安全风险及其地址空间负担相比,其相关性存在争议(因为物理内存实际上被限制为地址空间的一半;这促使了最近的扩展)到具有 56 位地址的五级页表)。

答案2

“64位内存空间大。你简直不敢相信它有多么巨大、巨大、令人难以置信。我的意思是,您可能认为距离化学家还有很长的路要走,但这对于 64 位内存空间来说只是微不足道的事情。”

保持思维简单是件好事。

因此决定分配一半用于直接映射硬件,只是硬件地址的一对一映射。一半用于虚拟映射。放两次东西比不放两次要便宜。想象一下,如果某些内容位于另一个映射中,则使用条件代码将其从直接映射中排除。想象一下事情会变得多么复杂,现在并不是所有的东西都在直接映射中,所以我们播种更多的条件代码,以找到我们想要的东西。只是映射两次更简单。 (这可能过于简化,有些细节可能有错误,但总体思路是正确的。)

相关内容