27

我熟悉 MIPS 架构,它有一个软件管理的 TLB。因此,您(操作系统)想要存储页表和页表条目的方式和位置完全取决于您。例如,我做了一个带有单个倒置页表的项目;我看到其他人在每个进程中使用 2 级页表。

但是 x86 的故事是什么?据我所知,TLB 是硬件管理的。x86 是否告诉您,“嘿,这是您当前使用的页表条目需要去的地方 [物理地址范围]”?但是等等,我一直认为 x86 使用多级页表,所以它会告诉你在哪里放置第一级或其他什么...?我很困惑。

谢谢你的帮助。

4

1 回答 1

35

进入保护模式后,CR3 寄存器指向一个“页面目录”(在进入保护模式之前你可以把它放在任何你想要的地方),它是一个内存页面(记住,一个“小”页面是 4 KiB,一个“大”页面为 4 MiB),包含 1024 个指向“页表”的页面目录条目 (PDE)。每个条目是指针的前 10 位(页表的地址),加上构成指针底部部分的一堆标志(存在、权限、脏等)。

(1024 只是来自页面是 4096 字节,指针是 4 字节的事实。)

每个“页表”本身就是 1024 个“页表条目”(PTE),其中又包含 1024 个指向内存中物理页面的条目,以及一堆(几乎相同的)标志。

因此,要转换 32 位虚拟地址,您将指针的前 10 位作为 CR3 表中的索引(因为有 2个 10条目),并且 -- 如果该 PDE 被进一步细分(意味着它是'不是一个“大”页面,您可以从标志中找出)-您获取 PDE 的前 20 位,查找该地址的页表,并使用虚拟地址的下一个索引到它-topmost 10位。然后最高 20 位指向物理页面,假设最低 12 位告诉您物理页面实际存在。

如果您使用的是物理地址扩展 (PAE),那么您会在最顶层的层次结构中获得另一个级别。

注意:为了您自己的理智(也许是 CPU),您可能希望将页面目录和页表映射到它们自己,否则事情会很快变得混乱。:)

TLB 是硬件管理的——因此页表的缓存是透明的——但是有一条指令 InvlPG 会为您使 TLB 中的 PTE 无效。(我不知道什么时候应该使用它,什么时候不应该使用它。)

来源:http ://wiki.osdev.org/Paging

于 2012-05-20T06:02:20.670 回答