x86页表如何工作?

时间:2012-05-20 05:55:21

标签: operating-system x86 virtual-memory computer-architecture

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

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:29)

进入保护模式后,CR3寄存器指向“页面目录”(您可以在进入保护模式之前将其放在任何位置),这是一页内存(记住,“小”页面是4 KiB和一个“大”页面是4 MiB),其中有1024个页面目录条目(PDE),指向“页面表”。每个条目都是指针的前10位(页表的地址),加上构成指针底部的一堆标志(存在,允许,脏等)。

(1024只是因为页面是4096字节,指针是4字节。)

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

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

如果您正在使用物理地址扩展(PAE),then you get another level in the hierarchy at the very top

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

TLB是硬件管理的 - 因此页表的缓存是透明的 - 但是有一条指令InvlPG可以让TLB中的PTE无效。 (我不知道你何时应该使用它以及什么时候不应该使用它。)

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