Cache一致性

Cache一致性问题,主要是指由于某些操作导致Cache和内存(如DDR)之间的数据不一致,且我们无法正确取到最新的数据。

正常情况下,Cache控制器有一套完善协议去保证我们对内存读写操作的正确性。但在某些复杂场景下,会发生cache一致性问题,此问题常发生在多核之间或使用DMA进行数据搬运前后。

本文主要讨论DMA搬运数据前后的cache一致性问题。考虑如下场景:

1)读0x80000000地址的数据

2)经过一系列操作后,我们通过DMA将结果拷贝到0x80000000地址所在的内存

3)读上一步中的结果

分析:
第1步,读操作会将内存中数据先加载到对应的cache(cache-line)中(cache操作都是以cache-line为最小单元进行操作的,常见的大小为64bytes),假设此时此地址的数据为0xFF,即cache中数据为0xFF;

第2步,DMA对地址0x80000000写数据,由于DMA操作都是直接对物理内存进行操作的,即跳过cache,直接将内存中数据改写,假设为0x55。那么此时便产生了cache一致性问题(cache中数据和内存中数据不一致,且cache并未更新数据状态(dirty))。

第3步,我们在代码中去访问此地址,由于cache状态未更新(cache控制器以为cache中数据是最新数据),从而读到错误数据。

解决:
一般的,在遇到这种情况的时候,需要对cache进行flush或者invalidate操作。

通常可以在DMA写数据之前进行flush或者DMA写数据之后invalidate,具体需要看当时的实际情况。但需要特别注意cache的invalidate操作,有较大风险引起“把有效数据无效掉”的问题。

备注:了解cache机制,推荐阅读下一章“Cache的几种读写机制”。

posted @ 2020-10-20 20:43  arthurchn  阅读(2221)  评论(0编辑  收藏  举报