在主存与处理器之间加入一个小容量的存储器保存 CPU 最近一段时间内的历史访问数据,将在 CPU 发起访问的时候优先提供数据快速访问,这个介于 CPU 与主存储器之间的小容量高速存储空间我们称之为 Cache,即高速缓存。Cache 作为处理器与主存之间的数据交换中心,其对所保存程序数据的分配调度策略的好坏对于整个系统性能的提升至关重要。
Cache的哈佛结构设计:
嵌入式ARM内核一般采用的都是哈佛结构,哈佛结构中Cache设计采用了指令 Cache(简称 I-Cache)和数据Cache(简称 D-Cache)分开的方式,也就是说运行的时候程序Code存储在flash中,数据Data存储在RAM中,也就是说CPU从flash中取Code指令,之后在到RAM中取数据。
- I-Cache中存储有CPU需要的指令,在CPU的取指阶段,通过程序计数器PC提供给I-Cache的地址,CPU可以获取需要的指令。
- D-Cache则是作为一个数据的存储,并提供对于Load/Store指令所要操作地址的数据,它地址则来自于ALU运算的结果。
- I-Cache和CPU的接口以及I-Cache和L2 Cache的接口都是单向的。D-Cache和CPU的接口以及D-Cache和L2 Cache的接口是双向的。这样处理的原因在于I-Cache存储的是指令,不需要更改所存储的数据的值。而D-Cache 中存储的是数据,其值会根据指令操作的不同而改变。比如:在运行 Store 指令的时候会对 D-Cache 中相应地址进行写入数据的操作。
Cache的读过程:
若 CPU 发出读请求,并且 Cache 中相应数据存在,就可以从 Cache 中读出,这称为命中(hit),否则称为缺失(miss)。
当 Cache 发生缺失时,系统将把包括相应数据的一块从下一级存储器读入 Cache 中。
若此时 Cache 已满,则需要决定将 Cache 中某块移出去,判定哪块移出需要判断规则,称为替换算法。
Cache的写过程:
CPU 发出写请求,若只把数据写入Cache(而没有改变主存RAM中的内容),在这种情况下,高速缓存和主存称为不一致。
保持Cache和RAM一致的最简单的方法就是不仅把数据写入Cache,也把它写入RAM,这种写的方法称为写通法。尽管这种设计方案处理写操作十分简单,但它不能提供很好的性能。写通法每次写操作都要把数据写入主存, 这些写操作需要花费很长的时间(一般至少 100 个处理器周期), 这很大大降低了处理器的速度。
写通法的另一个变种就是写回法,是指处理器在执行写操作时,被写的数据只写入 Cache,不写入主存,仅当需要替换时,才把已经修改的 Cache 块写入主存RAM。这种方法的 Cache 中每一块都包括了一个脏(Dirty)位,以标志数据被处理器修改过。写通法是指处理器执行写操作时,必须把数据同时写入 Cache 和主存。这样 Cache 中就不需要 Dirty 位,替换时也不需要写回到主存,新调入的块直接可进行替换。
I-Cache读指令流程:
- Cortex-M7(单核)
- Cortex-A7(单核含MMU)
D-Cache读写指令流程:
- D-cache 的读操作流程
- D-cache 写操作流程
参考:
【Cache篇】Cache的映射方式_cache采用什么映射-CSDN博客
【Cache篇】Cache策略_cache probe-CSDN博客