我熟悉MIPS架构,它有一个软件管理的TLB。因此,如何以及在何处存储页表和页表条目完全取决于您。例如,我做了一个带有单个倒排页表的项目;我看到其他人每个进程使用 2 级页表。
但是 x86 的情况又如何呢?据我所知,TLB 是由硬件管理的。 x86 是否基本上告诉您,“嘿,这是您当前使用的页表条目需要进入的位置[物理地址范围]”?但是等等,我一直认为 x86 使用多级页表,所以它会告诉你在哪里放置第一级或其他什么......?我很困惑。
进入保护模式后,CR3寄存器指向一个“页目录”(在进入保护模式之前你可以把它放在任何你想要的地方),这是一个内存页(记住,一个“小”页是4 KiB, “大”页为 4 MiB),具有 1024 个指向“页表”的页目录条目 (PDE)。每个条目都是指针的前 10 位(页表的地址),加上一堆构成指针底部部分的标志(存在、权限、脏等)。
(1024只是来自于一个页面是4096字节,一个指针是4字节。)
每个“页表”本身就是 1024 个“页表条目”(PTE),其中又包含 1024 个指向内存中“物理页”的条目,以及一堆(几乎相同的)标志。 因此,要转换 32 位虚拟地址,您将指针的前 10 位作为 CR3 处表的索引(因为有 2
10条目),并且 - 如果该 PDE 进一步细分(这意味着它不是一个“大”页面,您可以从标志中找出这一点)——您获取 PDE 的前 20 位,查找该地址处的页表,并使用虚拟地址的 对其进行索引下一个-最高 10 位。然后,假设底部 12 位告诉您实际存在物理页,那么顶部 20 位将您引向物理页。 如果您使用物理地址扩展 (PAE),
那么您将在最顶层的层次结构中获得另一个级别。 注意:为了您自己的理智(也许还有 CPU 的理智),您可能希望将页目录和页表映射到它们自己
,否则事情很快就会变得混乱。 :)TLB 是硬件管理的——因此页表的缓存是透明的——但是有一条指令 InvlPG 可以使 TLB 中的 PTE 无效。 (我不知道什么时候应该使用它,什么时候不应该使用它。)
来源:http://wiki.osdev.org/Paging