Cache学习笔记


文章目录

    • 应用场景——什么时候需要刷cache
      • 1、在不同硬件之间共享数据时
      • 2、在不同系统之间共享数据时(如linux / optee)

应用场景——什么时候需要刷cache

1、在不同硬件之间共享数据时

场景:CPU往src地址处写入了一串数据,然后交给Crypto硬件进行加解密处理,加解密后的数据放在了dst地址处,然后cpu读取dst地址处的数据获取结果。

(1)、cpu在往内存(src地址)写数据时,cache中会缓存这些数据,并没有立即同步到DDR, 只有该地址在cache中被换出去时候,才会同步到ddr
在这里插入图片描述
(2)、Device和ddr直接无cache,device直接从ddr(src地址)中读取数据, 此时当然读不到前面cpu写入的数据.
解决办法, 在device读取ddr数据之前, 先做__flush_dcache_area, 将cache数据刷到到内存
在这里插入图片描述
(3)、Device和ddr直接无cache,device将数据直接写入到ddr(dst地址)
在这里插入图片描述
(4)、cpu再次读取该地址(dst)数据时,发现cache中已经缓存了该地址数据,就会直接从cache中拿,就不会去ddr中拿了. 就拿不到device写入到ddr中的数据了.
解决办法:device写入数据到DDR后,调用__invalid_dcache_area, 让cache中缓存的数据无效,这样cpu再次读取的时候,发现cache中的缓存无效,就会从DDR中读取
在这里插入图片描述

2、在不同系统之间共享数据时(如linux / optee)

如果是VIVT的cache(virtual index virtual tag),在linux kernel中有一份地址空间,在optee中也有一份地址空间.
linux kernel和optee通过share memory进行通信. 对于同一块物理地址,在linux kernel和optee中映射的虚拟地址是不同的, 所以对于该物理地址的数据,在linux kernel和optee中,缓存到了不同的cache中:
在这里插入图片描述
当linux往该区域写入数据时,并没有直接写入到物理内存,而是写到了cache中。只有cache中的数据将被换出去时,cache中的数据才会被真正写入到内存;

而TEE去该区域读取数据,该区域如果在TEE中miss了,那么TEE会到物理内存中读取,此时拿到的不是有效数据。
而如果在TEE中hit,此时会到Cache中读取数据,该cache并不是linux缓存共享物理buf的那段cache,显然也拿不到有效数据。

解决方案: linux中写入数据后,请flush_dcache,在optee读取数据之前,请先invalid_dcache。