页表本身有虚拟地址吗?

页表本身有虚拟地址吗?

如果不是,那么内核如何在创建新进程时构建页表,并在换入/换出进程的页面时修改页表项?

我认为,无论是在用户模式还是内核模式下运行的指令都只能使用虚拟地址(然后由 CPU 内部硬件转换为物理地址)来访问 RAM(和内存映射外围设备)中的任何位置,除非禁用 MMU。

我知道内核负责创建和维护页表,而CPU内部硬件逻辑在页表中查找(x86中的CR3存储当前进程的页表的基地址,即物理地址)以将虚拟地址转换为物理地址。

我的问题是:当内核代码中试图修改页表项内容的指令正在执行时,页表本身的虚拟地址(如果有)如何转换为物理地址? 在此期间是否必须禁用 MMU,以便不需要地址转换?

答案1

这些应该可以回答你的问题:
JamesM 的内核开发教程(阅读“6.4.2. 必需定义”下的解释)
分页 - OSDev Wiki(阅读第 6 节 操纵)


原始的不成熟的答案:

的物理地址当前页面目录1存储在 CPU 寄存器中CR3

虚拟地址转换由内核决定,CPU 中没有神秘的内部硬件。


直接引自虚拟地址和物理地址 - 滑铁卢大学

动态重定位

  • CPU 的内存管理单元 (MMU) 包含重定位寄存器
  • 每当线程尝试访问内存位置(通过虚拟地址)时,重定位寄存器的值就会添加到虚拟内存地址 - 动态绑定。
  • 内核维护一个单独搬迁价值对于每个进程来说都是 1(作为虚拟地址空间的一部分);每次上下文切换时都会更改重定位寄存器。

相关内容