Post

虚拟地址转换[二] - 具体实现

转载:虚拟地址转换[二] - 具体实现

虚拟地址转换[二] - 具体实现

关于上文提到的“关于在TLB中具体是怎么找的,在page table中又是怎么”walk”的问题,下面通过一个简单的例子说明一下。

假设当前CPU支持的虚拟地址是14位,物理地址是12位,page size为64字节(这里要说明一下,通常情况下呢,虚拟地址和物理地址的位数是一样的,但其实并不一定需要一样,因为本来就可以多个虚拟地址指向同一个物理地址嘛)。

不管是虚拟地址还是物理地址,因为最小管理单位都是page,在转换过程中,代表页内的偏移地址(offset)的低位bits部分是不需要参与的,需要转换的只是代表page唯一性标识的高位bits部分,称作page number。由此产生了4个概念:VPNvirtual page number),PPNphysical page number),VPOvirtual page offset)和PPOphysical page offset)。

img

VPOPPO占的bit位数为$\log_{2}p$,ppage size大小,即64,因而VPOPPO的值为6。因为所有pages都是同样大小的,所VPO始终等于PPO

img

虚拟地址中剩下的bit位就成了VPN,物理地址中剩下的bit位就成了PPN

img

假设我们的TLB一共有16个entries,是4路组相关(4-way set associative)的,则有16/4=4个sets。TLB本身是一个硬件缓存,关于cacheway, set, index, tag的基础概念,如果还不熟悉的,可以参考这两篇文章:“浅谈Cache Memory”和“cache之虚虚实实”。

TLB Index(以下简称TI)的值为 =2,剩下的bit位就成了TLB Tag(以下简称TT)。

img

下面,我们准备读取虚拟地址为0x0334处的内容。

  1. 将这一地址分割成VPNVPO

img

  1. VPN分割成TTTI

img

  1. 使用TT(0x03)TI (0)TLB中查找。一个TLB entry的构成如下:

img

作为cacheTLB index是用来索引的,不会存储在TLB entry中,TLB entry中存的只有tag,有效位,权限位和内容(对于TLB来说就是PPN)。

假设现在TLB中的内容是这样的(这里为了简化,省略了permission bits):

img

虽然在set/index为0这一行,找到了tag为03的一个entry,但这个entryPPN是不存在的,整个entry目前是invalid的,也就是说TLB miss了,需要去page table中找。

  1. 使用VPN(0x0C)作为indexpage table中查找。一个只有one levelpage table(单级页表)构成如下:

img

index作为索引,也是不会存储于page table entry中的,PTE存的只有权限位,有效位和内容(对于PTE来说也是PPN)。

假设现在的page table是这样的(同样为了简化,省略了permission bits):

img

对应的PTEpage table entry)中的PPN不存在,依然是invalid的,这将触发一个page fault

实现的细节展开后,上文中的图也可以展开了(只用关注左半部分)

img

对比一下,你可能会发现一个TLB entry比一个page table entry多了一个tagTLB使用的是tag比对【1】,而页表使用的是index索引,在PTE数目很大的情况下这会带来一系列问题,详情请看下回分解。

【1】:如果是full associativeTLB,则只有tag没有index;如果是n-way set associativeTLB,则先通过index索引,再进行tag比对。

This post is licensed under CC BY 4.0 by the author.