Lec04 Page tables (Frans)

对于任何一条带有地址的指令,其中的地址应该认为是虚拟内存地址而不是物理地址。假设寄存器a0中是地址0x1000,那么这是一个虚拟内存地址。虚拟内存地址会被转到内存管理单元(MMU,Memory Management Unit)。内存管理单元会将虚拟地址翻译成物理地址。之后这个物理地址会被用来索引物理内存,并从物理内存加载,或者向物理内存存储数据。从CPU的角度来说,一旦MMU打开了,它执行的每条指令中的地址都是虚拟内存地址。为了能够完成虚拟内存地址到物理内存地址的翻译,MMU会有一个表单,表单中,一边是虚拟内存地址,另一边是物理内存地址。举个例子,虚拟内存地址0x1000对应了一个我随口说的物理内存地址0xFFF0。这样的表单可以非常灵活。

学生提问:所以MMU并不会保存page table,它只会从内存中读取page table,然后完成翻译,是吗? Frans教授:是的,这就是你们应该记住的。page table保存在内存中,MMU只是会去查看page table,我们接下来会看到,page table比我们这里画的要稍微复杂一些。

这里的基本想法是每个应用程序都有自己独立的表单,并且这个表单定义了应用程序的地址空间。所以当操作系统将CPU从一个应用程序切换到另一个应用程序时,同时也需要切换SATP寄存器中的内容,从而指向新的进程保存在物理内存中的地址对应表单。这样的话,cat程序和Shell程序中相同的虚拟内存地址,就可以翻译到不同的物理内存地址,因为每个应用程序都有属于自己的不同的地址对应表单。这样说得通吗?

学生提问:在这个机制中,TLB发生在哪一步,是在地址翻译之前还是之后? Frans教授:整个CPU和MMU都在处理器芯片中,所以在一个RISC-V芯片中,有多个CPU核,MMU和TLB存在于每一个CPU核里面。RISC-V处理器有L1 cache,L2 Cache,有些cache是根据物理地址索引的,有些cache是根据虚拟地址索引的,由虚拟地址索引的cache位于MMU之前,由物理地址索引的cache位于MMU之后。

学生提问:为什么通过3级page table会比一个超大的page table更好呢? Frans教授:这是个好问题,这的原因是,3级page table中,大量的PTE都可以不存储。比如,对于最高级的page table里面,如果一个PTE为空,那么你就完全不用创建它对应的中间级和最底层page table,以及里面的PTE。所以,这就是像是在整个虚拟地址空间中的一大段地址完全不需要有映射一样。 学生:所以3级page table就像是按需分配这些映射块。 Frans教授:是的,就像前面(4.6)介绍的一样。最开始你只有3个page table,一个是最高级,一个是中间级,一个是最低级的。随着代码的运行,我们会创建更多的page table diretory。

最后更新于