首发于术道经纬
虚拟地址转换[二] - 具体实现

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

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

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

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

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

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

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

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

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

  1. 将这一地址分割成VPN和VPO

2. 将VPN分割成TT和TI

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

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

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

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

4. 使用VPN (0x0C) 作为index在page table中查找。一个只有one level的page table(单级页表)构成如下:

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

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

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

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

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


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


说明:本文例子来源于courses.cs.washington.edu


原创文章,转载请注明出处。

编辑于 04-17

文章被以下专栏收录