Operating system x86页表是如何工作的?

Operating system x86页表是如何工作的?,operating-system,x86,virtual-memory,computer-architecture,Operating System,X86,Virtual Memory,Computer Architecture,我熟悉MIPS体系结构,它有一个软件管理的TLB。因此,您(操作系统)希望如何以及在何处存储页表和页表条目完全取决于您。例如,我做了一个项目,有一个倒转的页面表;我看到其他人在每个进程中使用2级页面表 但是x86的故事是什么呢?据我所知,TLB是硬件管理的。x86是否基本上告诉您,“嘿,这就是您当前使用的页表条目需要转到的位置[物理地址范围]”?但是等等,我一直认为x86使用多级页表,所以它会告诉你把第一级放在哪里还是什么。。。?我很困惑 感谢您的帮助。进入保护模式后,CR3寄存器指向一个“页面

我熟悉MIPS体系结构,它有一个软件管理的TLB。因此,您(操作系统)希望如何以及在何处存储页表和页表条目完全取决于您。例如,我做了一个项目,有一个倒转的页面表;我看到其他人在每个进程中使用2级页面表

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


感谢您的帮助。

进入保护模式后,CR3寄存器指向一个“页面目录”(在进入保护模式之前,您可以将其放在任何您想要的地方),这是一个内存页面(请记住,“小”页面是4kib,“大”页面是4mib),有1024个指向“页面表”的页面目录条目(PDE)。每个条目是指针的前10位(页表的地址),加上一组组成指针底部的标志(存在、权限、脏等)

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

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

因此,要转换32位虚拟地址,需要将指针的前10位作为索引放入CR3的表中(因为有210个条目),如果PDE进一步细分(这意味着它不是一个“大”页面,可以从标记中看出),则需要取PDE的前20位,在该地址查找页面表,并将虚拟地址的下一个前10位编入索引。然后,最上面的20位表示物理页,假设最下面的12位表示物理页实际存在

如果您使用的是物理地址扩展(PAE),则为

注意:为了您自己的理智(可能还有CPU),您可能需要将页面目录和页面表映射到它们自己,否则事情很快就会变得混乱起来。:)

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


来源:

非常好的总结,谢谢!CR3寄存器提供了开始翻译所需的关键硬件支持,并为程序员提供了更大的灵活性。然而,在翻译虚拟地址时,我认为它是这样工作的:前10位,页面目录条目,OK(告诉您哪个页面表)。但接下来的10位将告诉您正在查看特定页面表中的哪个条目。这将为您提供一个页表条目(PTE),其中前20位是物理页码;然后取原始vaddr的偏移量(底部12位,对于2^12=4K页面),瞧,你完成了。(因为我没有文本了)-也许我们在这里说的是相同的事情。我的观点如下:-见幻灯片26@YoungMoney当前位置是的,看起来我们在说同样的话。。。但无论如何,我认为你说的是对的好的,我还有一个问题-这个多层次的页面表格将用于每个流程,是吗?这是否意味着在每个上下文切换上,我们都需要重新指向CR3寄存器?@HighOnMeat:CR3是页面目录的物理地址;因此,它的目标(只有一页内存——不是很多)必须始终存在,并且不能出现“页面错误”。页面目录条目再次包含页面表的物理地址。但是,它的当前位可能为false,在这种情况下,在翻译过程中会出现页面错误,因此可以通过将页面表加载到内存中,将当前位设置为true,然后重试翻译来处理它。下一层的页面表条目也会发生同样的情况。这回答了你的问题吗?不要困惑。阅读文档。英特尔和AMD的官方CPU文档非常好地描述了页面表。也许会有帮助。