x86页面表是如何工作的?

27

我熟悉MIPS架构,它具有软件管理的TLB。因此,操作系统需要存储页面表和页面表项的方式和位置完全取决于你。例如,我曾使用单个反转的页面表完成了一个项目;我看到其他人使用每个进程的2级页面表。

但是,x86有什么故事呢?据我所知,TLB是硬件管理的。基本上,x86会告诉你,“嘿,这是你当前使用的页面表项需要放置的位置[物理地址范围]”吗?但是等等,我一直以为x86使用多级页面表,那么它会告诉你要放置第1级或者其他什么...?我很困惑。

感谢任何帮助。


不要感到困惑。阅读文档。英特尔和 AMD 的官方 CPU 文档非常好地描述了页表。 - Alexey Frunze
1
这个链接可能会有所帮助。 - Ciro Santilli OurBigBook.com
1个回答

35
在进入保护模式时,CR3寄存器指向一个“页目录”(可以在进入保护模式之前将其放置在任何位置),它是一个内存页面(记住,“小”页面为4 KiB,而“大”页面为4 MiB),其中包含1024个页目录条目(PDEs),它们指向“页表”。每个条目都是指针的前10位(即页表的地址),加上一堆组成指针底部的标志(存在、权限、脏等)。
(1024只是因为页面为4096字节,指针为4字节。)
每个“页表”本身都有1024个“页表条目”(PTEs),再次包含1024个条目,这些条目指向内存中的物理页面,并带有一堆(几乎相同的)标志。

因此,为了翻译32位虚拟地址,您需要将指针的前10位作为CR3表中的索引(因为有210个条目),并且 - 如果该PDE进一步细分(这意味着它不是一个“大”页面,您可以从标志中找出) - 您需要取PDE的前20位,查找该地址处的页表,并使用虚拟地址的下一个最高的10位进行索引。然后,最高的20位将引用物理页面,假设底部12位告诉您物理页面实际上存在。

如果您使用物理地址扩展(PAE),那么您在层次结构的最顶部获得另一层

注意:为了您自己的健康(也许还有CPU的健康),您可能想要将页目录和页表映射到它们自身,否则事情会变得非常混乱。 :)

TLB是硬件管理的,因此页面表的缓存是透明的,但有一条指令InvlPG可以为您使TLB中的PTE无效。(我不知道在什么情况下应该使用它,以及何时不应该使用它。)
来源:http://wiki.osdev.org/Paging

1
好的,我还有一个问题 - 这个多级页表是针对每个进程的,是吗?这是否意味着在每次上下文切换时我们需要重新指向CR3寄存器? - JDS
抱歉有点晚了!只是想知道使用多级(或层次)页表,页面表本身可以被分页吗?因此,在上下文切换期间,调度程序(或控制进程创建和切换的实体)使用页面目录的“虚拟地址”将CR3加载到。那么,如果该VA本身没有映射会发生什么?它会递归吗?如果是,它会在哪里结束? 或者,当您说它们必须“映射到自身”时,是指可以通过这种方式避免此问题吗? - AjB
1
@HighOnMeat:CR3是页目录的物理地址;因此它的目标(仅为一段内存页面,不多)必须始终存在,不能“页故障”。然后,页目录条目再次包含页表的物理地址。但是,它具有可能为false的“存在”位,在这种情况下,您将在翻译期间遇到页错误,因此可以通过将页表加载到内存中,将“存在”位设置为true并重试翻译来处理它。在下一层中,与页表条目发生相同的情况。那回答了你的问题吗? - user541686
@Mehrdad:(1)我的问题是,操作系统如何确保CR3指向的页目录不会被分页。关于(3),据我所知,有效的PTE(页表项)意味着与PTE对应的虚拟页面地址由RAM中的物理页面支持。但是根据您上面的回答,您暗示(或者我理解为这样)这仅适用于“大页面”,即>4KB。因此,我想问的是,与4KB页面对应的PTE的“有效”是否具有不同的含义。我希望这次我表达清楚了。 - AjB
@HighOnMeat:操作系统 负责页面换出的实体。因此,如果它不想将某些页面换出,那么它就不会这样做。至于第二部分,我认为我没有很好地回答你的问题。我想说的是,在这里有一个页面表的 层次结构 :每个表项都指向另一个表或指向实际数据页(通过单个位来区分)。越早到达实际页面,它就越大;越晚到达,它就越小(更细粒度)。Valid 的意思是无论是数据还是另一个表,只要您指向的内容是有效的。 - user541686
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接