cache line
cache被平均分成了多个cache line。
cache line是cache和DDR之间数据传输的最小单位。
什么意思呢?当CPU试图load一个字节数据的时候,如果cache miss,那么cache控制器会从主存中一次性的load cache line大小的数据到cache中。
例如,cache line大小是64字节。CPU即使读取一个byte,在cache缺失后,cache会从主存中load 64字节填充整个cache line
每条cache line 都有两个标志位
vaild bit:
表示cache line中数据是否有效(例如:1代表有效;0代表无效)。当系统刚启动时,cache中的数据都应该是无效的.
读:
1. 缓存没有命中(cache miss或者cache line状态为invalid),直接从内存读取数据+写入到cache+标记cache line为valid
2. 缓存命中 && cache line状态为valid,直接从cache中读取数据
写:
1. 向所有cache发送写信号
2. 如果有cache中有这条数据 && cache line状态为valid,将这个cache line的状态改为invalid
3. 将新数据写入到内存与cache,并将相关的cache line标记为valid
优点:减少了从主存中读取数据的次数
缺点:每次写操作都要刷回主存
dirty bit:
表示cache line里面的数据是否和下一级存储一致。=0非dirty,和下一级存储一致,=1 dirty,和下一级存储不一致。
cache的3种操作:
clean:
检查对应内存cache line 的dirty bit。如果dirty bit为1,将cache line的内容写回下一级存储,并将dirty bit置为0.
invalid:
检查对应内存cache line 的valid bit.如果valid bit 为1,置为0.
flush:
每条cache line 先clean,再invalid.
tips:
1.如果CPU先读了一块内存,接下来要DMA/其他硬件要访问这块内存,无需clean. DMA/其他硬件改写了这段DDR后,要将这段cache置为invalid,这样后续如果CPU访问这段内存,就不会使用cache中的数据。
2.如果CPU先写了一块内存,接下来要DMA/其他硬件要访问这块内存,要先clean,确保DMA/其他硬件访问到的DDR数据是准确的。DMA/其他硬件改写了这段DDR后,要将这段cache置为invalid,这样后续如果CPU访问这段内存,就不会使用cache中的数据。
3.如果能确认数据访问的流向,可以只使用clean或者invalid,而不是flush。
4.之前一直疑问一个问题:在CPU改写过这段内存,调用clean。再调用硬件再去改写这段内存后(DDR和cache中的数据不一样),如果调用flush接口,flush先做clean操作会不会将cache中的数据写回DDR??
不会,clean操作是检查dirty标志位,在硬件改写过程中dirty标志位一直是0(非dirty),所以此时flush操作中的clean操作只是检查一遍dirty bit,之后做invalid操作。