我熟悉MIPS架构,它具有软件管理的TLB。因此,操作系统需要存储页面表和页面表项的方式和位置完全取决于你。例如,我曾使用单个反转的页面表完成了一个项目;我看到其他人使用每个进程的2级页面表。
但是,x86有什么故事呢?据我所知,TLB是硬件管理的。基本上,x86会告诉你,“嘿,这是你当前使用的页面表项需要放置的位置[物理地址范围]”吗?但是等等,我一直以为x86使用多级页面表,那么它会告诉你要放置第1级或者其他什么...?我很困惑。
感谢任何帮助。
我熟悉MIPS架构,它具有软件管理的TLB。因此,操作系统需要存储页面表和页面表项的方式和位置完全取决于你。例如,我曾使用单个反转的页面表完成了一个项目;我看到其他人使用每个进程的2级页面表。
但是,x86有什么故事呢?据我所知,TLB是硬件管理的。基本上,x86会告诉你,“嘿,这是你当前使用的页面表项需要放置的位置[物理地址范围]”吗?但是等等,我一直以为x86使用多级页面表,那么它会告诉你要放置第1级或者其他什么...?我很困惑。
感谢任何帮助。
因此,为了翻译32位虚拟地址,您需要将指针的前10位作为CR3表中的索引(因为有210个条目),并且 - 如果该PDE进一步细分(这意味着它不是一个“大”页面,您可以从标志中找出) - 您需要取PDE的前20位,查找该地址处的页表,并使用虚拟地址的下一个最高的10位进行索引。然后,最高的20位将引用物理页面,假设底部12位告诉您物理页面实际上存在。
如果您使用物理地址扩展(PAE),那么您在层次结构的最顶部获得另一层。
注意:为了您自己的健康(也许还有CPU的健康),您可能想要将页目录和页表映射到它们自身,否则事情会变得非常混乱。 :)
TLB是硬件管理的,因此页面表的缓存是透明的,但有一条指令InvlPG可以为您使TLB中的PTE无效。(我不知道在什么情况下应该使用它,以及何时不应该使用它。)