刷cache的3种操作:clean/invalid/flush

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操作。

  • 34
    点赞
  • 169
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值