MMU 如何找到它应该翻译的地址?

MMU 如何找到它应该翻译的地址?

当我们尝试从特定地址读取/写入一些数据时,我们必须知道第一页目录的存储位置以及我们想要转换的地址。

至于第一页目录(据我所知linux使用4级分页,所以第一个应该是PGD),而对于Intel -CR3寄存器将包含PGD的地址,但是虚拟地址存储在哪里? MMU 如何理解它应该准确地翻译这个或那个地址?

UPD:我认为我应该澄清我的问题并提供一些我的看法的细节:

据我了解,当要转换某些虚拟地址时,我们有以下步骤:

  1. 检查 TLB。
  2. 如果 TLB 命中,那么我们就有物理地址 (PA)
  3. 如果没有,我们必须处理翻译错误
  4. 在翻译错误期间我们必须走过软件页表找到 PA。
  5. 这里必须切换到内核模式。(顺便说一句,我知道通常内核页表和用户页表是相同的,区别仅在于权限,所以有没有办法让我们不切换到内核模式?)
  6. 然后我们要设置CR3注册到 PGD 地址(或另一个顶级页目录)
  7. 现在我们的工作就是遍历这张表吗?如果软件应该自己完成,那么我们就知道某些 var 中的 VA(虚拟地址),并且可以在页表中查找 PA ???或者这个在 MMU 上工作(或者像那样),它将遍历这些表,至于 CR3 将知道 PGD 在哪里,但它如何理解它正在翻译什么地址?它是在某个寄存器中还是已经加载到内存中的某个位置?

感谢您的时间!

答案1

您列出的步骤不太正确;希望解决这个问题能让您了解发生了什么。

  1. CPU 尝试访问内存(例如读取指令,或者因为当前指令访问内存)——这就是虚拟地址的来源。

  2. 检查 TLB。

  3. 如果TLB有虚拟地址的条目,我们就得到了相应的物理地址。

  4. 否则,MMU 必须处理 TLB 未命中(这在 x86 上不是故障;它会被计数,但内核不知道)。

  5. MMU 遍历页表,可能从存储在 中的值开始CR3。从步骤 0 开始,它就知道需要解析的虚拟地址。

  6. 没有切换到内核模式,这全部由 MMU 处理(在 x86 上)。

  7. CR3并且页表必须在内存访问之前设置,这里没有任何改变。 (看对页面行走一致性的深入分析.)

一些架构(MIPS,我认为)处理 TLB 未命中时涉及内核;在这种情况下,需要处理的虚拟地址在故障信息中提供。

相关内容