【问题标题】:Why does the kernel have a separate virtual address for a user page?为什么内核对用户页面有一个单独的虚拟地址?
【发布时间】:2015-03-05 01:53:48
【问题描述】:

我对这个说法感到困惑:

来自http://web.stanford.edu/class/cs140/projects/pintos/pintos_4.html#SEC63:

在 Pintos 中,每个用户虚拟页面都被别名为其内核虚拟页面 页。

我认为内核只能使用用户虚拟地址来引用用户页面,内核虚拟地址在它上面。比如下图中,整个 VAS 不就是 0 到 4GB,用户虚拟地址空间会被限制在 PHYS_BASE 下面的地址,而内核也可以访问它上面的地址吗?


(来自http://web.stanford.edu/class/cs140/cgi-bin/section/10sp-proj3.pdf)

这似乎不是它的工作方式,因为 PintOS 文档仍在继续:

您必须以某种方式管理这些别名。例如,您的代码 可以检查和更新两个地址的访问位和脏位。 或者,内核可以通过只访问 通过用户虚拟地址获取用户数据。

这意味着内核可以通过单独的内核虚拟地址访问用户数据。我不确定为什么这两个地址会不同。

感谢您的澄清。

【问题讨论】:

  • 嗯..这是答案吗? “内核不能直接操作未映射到内核地址空间的内存。换句话说,内核需要它自己的虚拟地址来处理它必须直接接触的任何内存。因此,多年来,物理内存的最大数量是可以由内核处理的是可以映射到内核的虚拟地址空间部分的数量,减去内核代码本身所需的空间。”来自http://www.makelinux.net/ldd3/chp-15-sect-1
  • 但是内核如何“只通过用户虚拟地址访问用户数据来避免问题”呢?

标签: memory-management operating-system kernel virtual-memory pintos


【解决方案1】:

要访问一个页面,它需要被映射到你当前的虚拟地址空间中。

所以如果内核想要访问用户页面,有两种解决方案:

  • 将页面映射到我们当前的地址空间,内核的地址空间,并确保两个页表条目保持一致(您不必严格保持一致,但您真的想要到)。
  • 切换到该页面已映射的地址空间,即用户自己的地址空间

您的内核似乎选择了选项 1,这对性能来说是件好事。切换到另一个地址空间并返回需要相当长的时间。 它可以选择选项 2 并在每次想要访问用户页面时切换到用户的地址空间,这可能会通过避免一些簿记来简化代码,但这会非常慢。

【讨论】:

  • 对于选项2,如果内核切换到用户自己的地址空间来访问该页面,那就意味着它现在处于用户态,对吧?这是否意味着它不再拥有任何内核权限来执行它想要对用户页面执行的任何操作?
  • 不,您可以在不进入用户模式的情况下切换地址空间。在 x86 上要切换地址空间,您只需在 cr3 中加载一个新值。要进入用户模式,您必须使用 iret 指令做一些技巧。完全不同的东西。 cr3 是包含指向顶级分页结构的指针的寄存器。
猜你喜欢
  • 2019-07-03
  • 1970-01-01
  • 2013-01-10
  • 2018-02-23
  • 1970-01-01
  • 2011-06-17
  • 2016-10-05
  • 2012-02-01
  • 2016-09-26
相关资源
最近更新 更多