1.概念
处理器访问主存储器使用地址编码的方式。Cache也使用类似的地址编码,因此处理器使用这些编码地址可以访问各级cache。下图是经典的Cache架构图

处理器在访问存储器时,会把地址传给TLB和cache,TLB是一个存储虚拟地址到物理地址转换的小缓存。处理器先使用EPN在TLB 中查找最终的RPN(Real Page Number)。如果在这期间发生TLB Miss, 将会带来一系列的系统惩罚,处理器需要查询页表,假设这里TLB Hit, 此时很快获得合适的RPN,并得到相应的物理地址PA(Physical Address)。
同时,处理器通过cache编码地址可以很快找到相应的cache line组。但是这里的cache block数据不一定是处理器所需要的,因此需要进行检查,将cache line中存放的地址和通过虚拟地址转换的物理地址进行比较,如果相同则会发生cache命中,那么处理器通过字节选择和偏移部件,就可以获取到最终数据。如果发生cache miss,处理器需要用物理地址进一步访问不主存储器获得最终数据。
Cache的基本结构图
Cache地址编码:处理器访问cache地址时的地址编码,分为3个部分,分别是偏移量、索引和标记
Cache Line:cache中最小的访问单元,包含一小段主存储器的数据,常见的大小为32/64Byte
索引:用于查找在哪一行
组:相同索引区域的cache Line组成一个组
路:在组相连的cache中,cache被分为大小相同的几个块
标记:cache地址编码的一部分,用于判断cache line存放的数据是否和处理器想要的一致。
2.cache映射方式的区别
(1)直接映射
根据每个组的高速缓存行数,cache可以分成不同的类。当每个组只有一行cache line时称为直接映射高速缓存。
如下图,这个cache只有4行cache line,每行有4个字(word,一个字4Byte)。发生cache命中的时候,只能同时有一个cache line,因为cache line的频繁换入换出,会导致严重的cache颠簸。
(2)组映射
为了直接解决高速映射缓存中的cache颠簸问题,组相联的cache结构得到了广泛应用。
如上图两路组相连的cache,每路包括4个cache line,那么每组有两个cache line 可以以提高cache line替换。地址0x00,0x40或0x80的数据可以映射到同一组的任意一个cache line。当cache line发生替换操作时,就有50%概率可以不被替换,从而减少了cache颠簸
(3)全关联
3.PIPT和VIVT的Data Cache组织方式有什么不同?
处理器在访问存储器访问时,处理器访问地址是虚拟地址,经过TLB和MMU映射,最终变成物理地址PA。那么查询cache组是用虚拟地址还是物理地址的索引呢?当找到cache时,我们使用虚拟地址还是物理地址的tag来匹配cache line呢?
Cache可以设计成通过虚拟地址或者物理地址访问,可以分为3类。
VIVT(Virtual Index Virtual Tag)
VIPT(Virtual Index Physical Tag)
PIPT(Physical Index Physical Tag)
4.多核处理器中,cache(高速缓存)一致性是如何实现的,简述MESI协议的含义。
Cache一致性产生的原因是不同CPU核上的数据cache和内存可能具有同一个数据的多个副本。Cache一致性协议主要有两大类别,监听协议和目录协议
ARM采用MESI协议来维护cache一致性,MESI的含义:修改态(Modified)、独占态(Exclusive)、共享态(Shared)和失效态(Invalid)。
5.Cache在Linux内核中的妙用