【ARM Cache 与 MMUMPU 系列文章 1 -- Cache基础概念学习】
1.1 Cache 概念简介

1.1.1 Cache Type
Cache 通常按照层级分类,比如常见的 L1 Cache/L2 Cache/L3 Cache …:

通常 L1 Cache 又分为 ICache (instruction Cache) 和 DCache (data Cache)。
其中 ICache 用于缓存 CPU 执行的指令;
其中 DCache 用于缓存 CPU 所使用的数据。
1.1.2 Cache Size
以两路组相连缓存(Two-way set associative Cache)为例进行 Cache size 介绍,假设 64 Bytes Cache size,Cache line size 是 8 Bytes。
那么什么是路(way) ?
我们将 Cache 平均分成多份,每一份就是一路(Way)。因此,两路组相连缓存就是将 Cache平均分成 2 份,每份 32 Bytes。Cache 被分成 2 路(Way),每路包含 4 行 Cache line。
我们将所有索引一样的Cache line组合在一起称之为组(Set)。

1.1.3 Cache maintenance operations
对 Cache Maintenance (操作)主要为两种:Invalidate 和 Clean:
- Invalidate指的是将相应位置的 Cache line 状态置为无效(invalid),这时候并不需要真的清除相应位置的Cacheline数据;
- Clean Cacheline意味着将dirty状态的Cacheline写入主存,同时清除掉Cacheline的dirty比特。通过这种方式可以让Cacheline中的数据和主存中的数据一致;
- Cache invalid 还可以只针对对应的 Cache Set、Way 或者对应的地址 Tag。
有些文章中还会提到 Invalidate & Clean
具体解释见:

1.1.3.1 Cache Invalidate & Clean scenario
一个应用 Cache invalid 和 Clean 的典型场景就是DMA。
对于 DMA 控制器读取的地址空间,需要内核 write-back 的 Cache 内容对DMA控制器可见,所以需要Clean这个Cache。
当使用DMA控制器对外部内存写入数据时,为了让这个主存的改动对Cache可见,就需要对受影响的Cache空间执行invalid。
1.1.4 Cache interaction with memory system
- 在 disable 或者 enable 指令Cache之后,必须执行一条ISB指令,用来flush cpu pipeline。
- 在 reset之后,必须在做了Cache Invalidate操作之后才能进行 Cache enable操作,因为如果不做Invalidate Cache的在Cache enable之后有可能发生 Cache hit, 这个时候 Cache中的数据是未知,可能会导致致命问题。
- 在 disable Cache之后必须要 Clean Cache, 这样才能确保 dirty data 被写入外部存储。
- 在使能data Cache 之前,必须先进行 Invalidate 整个data Cache, 因为在外部存储中的数据再关闭data Cache之后可能被改写,如果没有做 Invalidate操作,这时如果Cache hit,那么cpu拿到的数据并不是外部存储中最新的数据而是旧数据,这样可能会导致致命问题。
- 在使能 指令Cache同样需要先进行整个 指令Cache 的 Invalidate 操作。
1.1.5 write back/write allocate
1.1.5.1 CPU 读 Cache
Read Through : 即直接从内存中读取数据;
Read Allocate : 先把数据读取到Cache中,再从Cache中读数据。
1.1.5.2 CPU 写 Cache
(1) 若 hit 命中 ,有两种处理方式:
Cache 的 write-through/write-back policy 是基于 Cache 命中的基础上,如果Cache 没有命中,是没有意义的:
Write-through : 在数据更新时,把数据同时写入Cache和后端存储。此模式的优点是操作简单;缺点是因为数据修改需要同时写入存储,数据写入速度较慢。
Write-back : 在数据更新时只写入缓存Cache,并使用 dirty 标志位记录 Cache 的修改,直到被修改的Cache 块被替换时,才把修改的内容写回 main memory。优点是数据写入速度快,因为不需要写存储;缺点是一旦更新后的数据未被写入存储时出现系统掉电的情况,数据将无法找回。
(2) 若 miss ,有两种处理方式:
在写失效(write miss)时,即所要写的地址不在 Cache tag 中:
Write Allocate : 把要写的地址调入Cache 中,再写Cache,后面再通过flush方式写入到内存中。
No-write allocate : 并不将写入地址读入Cache,而是直接把要写的数据写入到内存中。
同理,read allocate policy 就是当要读的地址不在 Cache 中时,把要读的地址所在的块先从 main memory调入Cache中,然后再从Cache中读。需要注意的是配置成write allocate 和 no write allocate 差异是很大的


浙公网安备 33010602011771号