转自:https://zhuanlan.zhihu.com/p/65348145
关于上文提到的“关于在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位数为 ,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 Memory和cache之虚虚实实。
TLB Index(以下简称TI)的值为 =2,剩下的bit位就成了TLB Tag(以下简称TT)。
下面,我们准备读取虚拟地址为0x0334处的内容。
- 将这一地址分割成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比对。
说明:本文例子来源于https://courses.cs.washington.edu/courses/cse351/16wi/sections/8/cse351_16wi_08.pdf
原创文章,转载请注明出处。