x86页表如何工作?

JDS*_*JDS 24 x86 operating-system computer-architecture virtual-memory

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

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

谢谢你的帮助.

Meh*_*dad 30

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

(1024只是因为页面是4096字节而指针是4字节.)

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

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

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

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

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

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