CPU Study - TLB & Cache

参考来源:《超标量处理器设计》—— 姚永斌

Virtual Cache

通过物理地址寻址的Cache(Physical Cache),在和TLB一同工作的过程如下:
Physical Cache

此场景下必须经过TLB才能访问Cache以及物理内存,必然增加流水线延时或者深度。
当Cache采用虚拟地址寻址(Virtual Cache),则只有miss场景下需要TLB。
Virtual Cache

但是这样会引入新的问题:

别名问题 - synonyms

即多个不同VA对应相同PA,导致Cache空间浪费和修改Cache数据引起的一致性问题。
别名问题

并不是所有Cache都会发生别名问题。由于VA到PA过程的页内偏移offset不变,对于4KB大小的页面而言,VA低12位不会发生变化。
在直接相连场景下,如果Cache Size小于4KB,则寻址Cache地址不会大于12位。
此时虽然存在两个指向相同物理地址的虚拟地址,但是在Cache中的信息是一样的(低12位一样)。
但是如果Cache Size大于4KB,则会存在映射到同一个物理地址的两个不同虚拟地址Cache信息不同(tag信息不一致)。

如果要解决别名的一致性问题,最简单的方法就是两个位置都进行更新,在Cache中增加bank结构,两个bank一起更新。
Bank方法

如图所示的一个8KB Cache被分为2个4KB的bank,VA[11:0]作为两个bank公共地址。
读取Cache:两个bank输出都会被送到由PA[12]控制的多路选择器上,选择性输出bank0/1。
写入Cache:由于一条指令只有退休时才会写入,所以此时PA已经得到信息,写入对应bank即可。
这样的方法相当于把PFN为偶数(PA[12]为0)的信息写入bank0,奇数写入bank1。
根据tag中的物理信息,保证只有一个VA存储了此物理地址信息。

同名问题 - homonyms

不同进程之间存在相同的虚拟地址,但是对应不同物理地址,如果不进行处理,进程切换时会发生错误(flush TLB and Cache)。所以为每个进程赋予了一个编号ASID(Address Space Identifier),作为VA的一部分。
引入ASID后,如果多个进程想要共享一个页面,就需要再增加一个global位(某个页面被共享时,global位置1)。
查找页表时,如果global位为1则无需关注ASID。
基于ASID的地址转换

当系统中运行的进程个数超过ASID bit width size时,就会从已经存在的ASID中回收一个不常用的值保存(旧进程再次被执行时恢复)再分配给新的进程。

Cache的一致性管理

简单回顾下常见的Cache一致性管理场景:

  • DMA需要从物理内存搬数据时,如果物理内存数据dirty,则需要将D-Cache中所有数据先写回物理内存。
  • DMA需要搬数据到物理内存时,如果D-Cache缓存了此地址数据,需要把D-Cache中数据置为无效。
  • Page Fault时,需要从硬盘读取Page 页到物理内存,如果物理内存被覆盖页面为dirty,并且D-Cache拥有此部分最新数据。需要先把D-Cache数据写回到物理内存,再写回到硬盘,最后进行相关R/W行为。
  • CPU可能自行对指令修改,新指令可能作为数据写入到D-Cache。如果希望这些指令被正确执行,则需要将D-Cache内容先写回物理内存并清空I-Cache(I/D-Cache只能通过物理内存交互)。

流水线中的Cache & TLB

TLB + Physical Cache

为了避免寻址TLB占用流水线时间,会将TLB访问单独作为一个流水段,相当于增加流水线级数(深度)。
但是此方法有一些问题,所以不常被采用:

  • I-Cache分支预测失败,深度越大,惩罚越大。
  • D-Cache深度约深,load指令延时越大,并且也会影响其他指令加载。
    TLB + Physical Cache

VIPT

考虑offset值不变,可以在VIPT(Virtually-Indexed Physically-Tagged)场景下实现TLB和Cache访问同时进行。
同时访问TLB + Cache

这样也能避免重名问题(不同VA映射同一个PA)。
因为offset相同(一个way里不会存在两个相同offset的Cache Line),Tag不同(基于PA,所以不会有两个Way存储相同PA)。
Way越多,组相联的Cache就可以映射更大的空间。
多way增加Cache容量

当一个Cache Size大于一个页面大小(默认4KB)时,又会出现重名问题。
假设Cache Size为8KB,需要13位index进行寻址。
重名问题例子

不能保证VA1,VA2寻址的Cache Index相同(BIT[12]可能不同,属于VPN)。
从而引发一致性问题以及空间浪费问题,除去之前提到的bank方法,还可以增加L2 Cache(Inclusive)解决此问题。
采用统一L2 Cache

假设VA1最初存在L1&L2 Cache中,VA2访问L1时发生Miss,于是访问L2。
大多数处理器中L2采用的是PIPT(Physically-Indexed Physically-Tagged)。
此时就会采用TLB转换后的PA寻址L2发现hit。
因此需要告知这部分数据属于VA1,需要在L2的Cache Line中增加标记a(区分这个数据属于VA1)。
在从L2读取数据到L1之前,使用L2的PA里标记a寻址L1(使用a和offset组成的信息寻址)。找到L1中对应的Cache Line(重名地址)并置为无效。
如果发现此数据为脏数据,还需要先写回L2,再置为无效。
L2 Cache解决重名问题

VIVT

Virtually-Indexed Virtually-Tagged场景下,如果命中,直接从Cache获取数据,不再需要TLB。
如果Cache Miss,再通过TLB从下级存储器获取数据。
Virtual Cache 重名问题的L2解决方案

VIVT的重名问题也可以通过L2 Cache方法解决,但是需要将整个L1的VA都存储到L2才可以定位L1中具有重名问题的VA Cache。

小结

访问存储器时的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值