为什么内核有一个单独的用户页面虚拟地址?
Why does the kernel have a separate virtual address for a user page?
我对这个说法感到困惑:
来自 http://web.stanford.edu/class/cs140/projects/pintos/pintos_4.html#SEC63:
In Pintos, every user virtual page is aliased to its kernel virtual
page.
我以为内核只能使用用户虚拟地址来引用用户页面,内核虚拟地址在它之上。比如下图中,整个VAS不就是0到4GB,用户虚拟地址space会被限制在PHYS_BASE以下的地址,而内核也可以访问地址在上面吗?
(来自 http://web.stanford.edu/class/cs140/cgi-bin/section/10sp-proj3.pdf)
虽然 PintOS 文档继续说,但这似乎不是它的工作方式:
You must manage these aliases somehow. For example, your code
could check and update the accessed and dirty bits for both addresses.
Alternatively, the kernel could avoid the problem by only accessing
user data through the user virtual address.
这意味着内核可以通过单独的内核虚拟地址访问用户数据。我不确定为什么这两个地址会不同。
感谢您的澄清。
要访问页面,需要将其映射到您当前的虚拟地址space。
所以如果内核想要访问用户页面,有 2 个解决方案:
- 映射我们当前地址space中的页面,内核地址space,并确保两个页面table条目保持一致(你不必严格保持它是一致的,但你真的想要)。
- 切换到该页面已映射的地址space,用户自己的地址space
您的内核似乎选择了选项 1,这对性能来说是一件好事。切换到另一个地址 space 并返回需要花费大量时间。
它可以选择选项 2,并在每次它想要访问用户页面时切换到用户地址 space,这可能会通过避免一些簿记来简化代码,但那会非常慢。
我对这个说法感到困惑:
来自 http://web.stanford.edu/class/cs140/projects/pintos/pintos_4.html#SEC63:
In Pintos, every user virtual page is aliased to its kernel virtual page.
我以为内核只能使用用户虚拟地址来引用用户页面,内核虚拟地址在它之上。比如下图中,整个VAS不就是0到4GB,用户虚拟地址space会被限制在PHYS_BASE以下的地址,而内核也可以访问地址在上面吗?
(来自 http://web.stanford.edu/class/cs140/cgi-bin/section/10sp-proj3.pdf)
虽然 PintOS 文档继续说,但这似乎不是它的工作方式:
You must manage these aliases somehow. For example, your code could check and update the accessed and dirty bits for both addresses. Alternatively, the kernel could avoid the problem by only accessing user data through the user virtual address.
这意味着内核可以通过单独的内核虚拟地址访问用户数据。我不确定为什么这两个地址会不同。
感谢您的澄清。
要访问页面,需要将其映射到您当前的虚拟地址space。
所以如果内核想要访问用户页面,有 2 个解决方案:
- 映射我们当前地址space中的页面,内核地址space,并确保两个页面table条目保持一致(你不必严格保持它是一致的,但你真的想要)。
- 切换到该页面已映射的地址space,用户自己的地址space
您的内核似乎选择了选项 1,这对性能来说是一件好事。切换到另一个地址 space 并返回需要花费大量时间。 它可以选择选项 2,并在每次它想要访问用户页面时切换到用户地址 space,这可能会通过避免一些簿记来简化代码,但那会非常慢。