一. Cache基本概念
1. TLB与Cache的关系
TLB是位于内存的页表cache,用于改进物理地址到虚拟地址的转换的缓存。Cache是为缓和CPU和存储器之前的速度差异而增加的高速缓存,有多级cache结构。
CPU访问时,EPN(Effective Page Number)进行虚实地址转换,CLN(Cache Line Number)用来找到合适的Cache。这两步可以同时进行。
- EPN经过转换变为VPN(Virtual Page Number),在TLB命中的情况下,VPN(Virtual Page Number)经查找可得到RPN(Real Page Number),并依据RPN(Real Page Number)得到PA(Physical Address)。
- 通过CLN(Cache Line Number)进行索引找到单个Cache Block.
Data字段存放的是cache block中的数据,在多数微处理器架构中,Data为32位或64字节。Satus字段存放当前Cache Block的状态。在有些微架构的Cache Block中,还存在一个L位,表示当前Cache Block是否可以锁定。许多将Cache模拟成SRAM的微架构就是利用了这个L位。RAT(Real Address Tag)中存放的是部分物理地址信息,CPU发出的寻址信息都是针对物理内存发出的。虽然在一个CPU中物理地址可能有40,46或者48位,但是在Cache中并不需要存放全部地址信息。因为从Cache角度看, CPU访问Cache并不使用全部的物理地址信息。
补充:CPU访问Cache地址字段解读
- Cache Line Index字段,与Cache Line Number类似,CPU用该字段从Cache中选择一个或一组Cache。
- Bank和Byte字段之和确定了Cache Block中Data字段的长度(Cache行长度),在处理器微架构中,将地址为Bank和Byte两个字段出于提高Cache Block访问效率的考虑。Multi-Bank Mechanism是一种常用的提高访问效率的方法,采用这种机制后,CPU访问Cache时,只要不是对同一个Bank进行访问,即可并发执行。Byte字段决定了Cache的端口位宽,在现代微架构中,访问Cache的总线位宽为64位或者为128位。
- Real Address Tag字段,与Cache中RAT字段长度一致,CPU使用该字段与Cache中的该字段及状态位进行联合比较,以判断Cache是否命中。
二. Cache的访问
1. 物理地址访问的cache结构
流水线在使用PC访问cache的时候,首先要利用TLB进行虚实地址转换,然后访问cache。由于页表所表示的一个页的空间比较大,例如有4KB或者更大,因此,在一般情况下,TLB的失效率不会很高,但带来的问题就是:每次访问cache都要访问一次TLB,而如果TLB失效,流水线的性能损失非常大,因此TLB一般是存储在外部存储器中。而如果一段指令一直存储在cache中,流水线还是要每次访问TLB才能访问到cache,就感觉会:多此一举。而事实是带来流水线一个流水级的性能损失。所以用物理地址访问cache的方法是不被挑剔的人类所接受的。
- 物理内存地址划分
根据物理地址的中间三位(index字段)来定位当前数据应该在cache的哪一行,把物理地址的tag字段和该地址对应的内容放入对应的cache line的tag字段和data字段,并把相应的valid位置1。那么在之后进行cache寻找的时候就可以根据cache line的tag字段来辨认当前line中的数据是数据哪个block的。
Block Offset的位数决定Block字节大小,也是cache line的data字段包含的字节大小。
Index字段决定Cache字段的行数量(组数量)。
- 物理地址cache方式的节拍
- 节拍-1:利用虚拟地址访问TLB,进行虚实地址转换,假设TLB命中(概率很大),需要一个时钟周期;
- 节拍-2:利用得到的物理地址访问cache,取出cache行的TAG信息和data信息;假设cache命中,需要一个时钟周期;
- 节拍-3:基于物理地址,对TAG信息进行比较以及选择合适的cache data;还是需要一个时钟周期。
这种模式下,如果TLB和cache都命中,需要3个时钟周期得到需要的指令。
2.虚拟地址访问cache
a.虚拟地址访问Cache存在的主要问题:
1)如果两段进程的虚拟PC正好相同,则会出现虚地址访问cache冲突的情况;
2)现代操作系统注重安全保护观念,而安全保护的方法是基于进程描述符ID,体现到了内存页表上,因此操作系统的保护概念是需要依赖于页表的安全,而如果cache直接用虚拟地址访问,就绕过了页表机制,从而使用流水线中指令的执行不再存在保护;
3)现代操作系统允许有多个虚拟页面空间映射到同一个物理地址页面空间,因此,如果纯粹是虚拟地址访问,就可能出现读写不一致的情况,就好像多处理器的cache一致性问题一样,如果希望利用其他协议在流水线和cache之间解决这个问题,则性能浪费太大了;
4)读写外部设备的问题:现在外部IO设备的地址映射一般是物理地址映射;而我们有TLB把虚拟地址映射为物理地址,但是在读写外部IO设备时,我们是没有机制把物理地址映射为虚拟地址的。
b.针对虚拟地址访问Cache存在的主要问题的解决机制:
虚拟地址访问cache,物理地址比较Tag。
这种模式其实是利用了页表的虚拟地址和物理地址其实在地位是相同的,不同的是高位映射。
- 虚拟地址Cache方式的节拍
- 节拍-1:利用虚拟地址访问TLB,进行虚实地址转换;同时在这个周期中,利用虚拟地址的低位访问cache,取出cache中存储的TAG信息和data信息,但注意,这个时候的TAG信息其实对应的是物理地址的TAG;
- 节拍-2:假设TLB和cache都命中,则利用上个节拍得到的物理地址进行TAG比较,并选择合适的cache data数据。
这种模式下,仅需要2个时钟周期就能得到所需要的cache数据。