Cache的基本概念和使用场景
不同的Master硬件共享数据时—invalid cache
外设和DDR之间没有cache,所以外设直接把数据写入DDR中,但是cpu和DDR之间有cache,cpu会首先访问cache,如果命中直接从cache中拿数据,但是此时的cache并不是最新的数据,cache没有刷新,就拿不到DDR中的数据。此时的解决办法就是在cpu读取数据之前,让cache中的缓存无效,这样就会直接从DDR中读取数据。
不同的Master硬件共享数据时—flush cache
同样还有下面情况,需要刷新cache
不同的缓存策略的系统共享数据时—flush cache
不同的缓存策略的系统共享数据时—invalid cache
操作系统中软件维护cache一致性的API
void __flush_icache_range(unsigned long start, unsigned long end);
int invalidate_icache_range(unsigned long start, unsigned long end);
void __flush_dcache_area(void *addr, size_t len);
void __inval_dcache_area(void *addr, size_t len);
void __clean_dcache_area_poc(void *addr, size_t len);
void __clean_dcache_area_pop(void *addr, size_t len);
void __clean_dcache_area_pou(void *addr, size_t len);
long __flush_cache_user_range(unsigned long start, unsigned long end);
void sync_icache_aliases(void *kaddr, unsigned long len);
void flush_icache_range(unsigned long start, unsigned long end)
void __flush_icache_all(void)
modified的数据地址,在执行invalidate的时候,会先自动执行clean。即
DC IVAC等效于DC CIVAC
cache指令
为什么要用cache?
ARM 架构刚开始开发时,处理器的时钟速度和内存的访问速度大致相似。今天的处理器内核要复杂得多,并且时钟频率可以快几个数量级。然而,外部总线和存储设备的频率并没有达到同样的程度。可以实现可以与内核以相同速度运行的小片上 SRAM 块,但与标准 DRAM 块相比,这种 RAM 非常昂贵,标准DRAM 块的容量可能高出数千倍。在许多基于 ARM 处理器的系统中,访问外部存储器需要数十甚至数百个内核周期。缓存是位于核心和主内存之间的小而快速的内存块。它在主内存中保存项目的副本。对高速缓冲存储器的访问比对主存储器的访问快得多。每当内核读取或写入特定地址时,它首先会在缓存中查找。如果它在高速缓存中找到地址,它就使用高速缓存中的数据,而不是执行对主存储器的访问。通过减少缓慢的外部存储器访问时间的影响,这显着提高了系统的潜在性能。通过避免驱动外部信号的需要,它还降低了系统的功耗。
怎么去刷cache呢? (软件维护cache的一致性)
ARM提供了操作cache的指令, 软件维护操作cache的指令有三类:
• Invalidation:其实就是修改valid bit,让cache无效。
• Cleaning: 这其实就是我们所说的flush cache,这里就是清除dirty标志,这里会将cache数据回写到内存
• Zero:将cache中的数据清0.