cache用来存放最近CPU访问的一些memory的数值
L1 Cache:离CPU比较近的cache,有i-Cache,D-Cache
L2 Cache:离CPU比较远的cache,如果没有内部的,可以在外面加
CPU尽可能从cache里取数据,就减少了向外面访问的频率
同时也减小了功耗,外部功耗会比较大,内部memory功耗较小
尽可能让cpu对onchip的部件进行操作
Cache结构:
采用组相联映射
RAM分为Data RAM和Tag RAM 分别存数据和地址
一个line一般是4到8word
way由很多line组成,可以理解为片,data RAM里由很多位组成,
memory地址空间里面的数据可以放在不同的way里面
set是不同way中的同一个line
Tag用于标记memory地址,来自于访问地址,往往是最上面的
存放在Tag RAM里面
CPU访问cache的时候,首先会访问Tag RAM,有没有对应的地址,如果匹配,那么就从cache里拿数据或者把数据写到cache里面
Index来自地址,查找到底数据在那个cache line里面
地址由 组号 组内块号 块内地址组成,其中块内地址又被进一步分开成offset 和bytes的选择
举例:
valid代表cache line是不是有效的
dirty bit 代表cacheline里面的数据是不是最新的,和外面的是不是一致的
如果是dirty就是不一致的
cache line是怎么分配的
根据index找到是哪个cache line,然后把tag的物理区域,和index找到的tag RAM里存放的tag值进行比较,如果匹配,就cache hit 否则就cache miss
在两个ways里都会去找
这里也是两个ways,4个sets,但是CPU起始的位置变了,从0x70开始
CPU发出访问地址的时候,会分配到set3,30也是,已经被分配好了
B0本来也应该分配到set3,但是set3已经被占去了,这时候有三种策略
一、 随机策略(Random):B0中的数据随机分配到way0或者way1的某个set中
二、 轮询方式(Round Robin),先是way0再是way1
三、 LRU(Least Recently Used) 看哪个最近最少使用
Read Allocation:
发生cachemiss的时候,这时候要分配cache line了,会读一整行的数据到cache line里面来,这个过程叫cache linefill
Write Allocation
写的地址首先会到cache中,发现有cache miss的情况发生,同样的,也需要cache linefill。之后把写的东西写到cache line里面去或者memory里面去。
write的时候有个策略:
把数值从memory写到cache line里面,然后CPU写Cache line,就认为结束了,等待cache一块写道memory中,称为Write Back。另一种是不光要写Cache中的内容,还要写Memory中的内容,这样两个存储体里的数据保持一致。
Cache 分类
根据Cache的index和tag来源,可以把cache分为很多种类:
VIVT: Virtual Index Virtual Tag,顾名思义,索引Cache时的Index来自Virtual Address(虚拟地址),Tag同样也来自虚拟地址
VIPT: Virtual Index Physical Tag,顾名思义,索引Cache时的Index来自Virtual Address(虚拟地址),Tag来自Physical Address(物理地址),通常用于Instruction cache
PIPT: Physical Index Physical Tag,顾名思义,索引Cache时的Index和Tag 都来自Physical Address(物理地址),通常用于Data cache