1. Cache 的基本概念和使用场景
1.1 为什么要用cache?
ARM 架构刚开始开发时,处理器的时钟速度和内存的访问速度大致相似。今天的处理器内核要复杂得多,并且时钟频率可以快几个数量级。然而,外部总线和存储设备的频率并没有达到同样的程度。可以实现可以与内核以相同速度运行的小片上 SRAM块,但与标准 DRAM 块相比,这种 RAM 非常昂贵,标准 DRAM块的容量可能高出数千倍。在许多基于ARM 处理器的系统中访问外部存储器需要数十甚至数百个内核周期。
缓存是位于核心和主内存之间的小而快速的内存块。它在主内存中保存项目的副本。对高速缓冲存储器的访问比对主存储器的访问快得多。每当内核读取或写入特定地址时,它首先会在缓存中查找。如果它在高速缓存中找到地址,它就使用高速缓存中的数据,而不是执行对主存储器的访问。通过减少缓慢的外部存储器访问时间的影响,这显着提高了系统的潜在性能。通过避免驱动外部信号的需要,它还降低了系统的功耗
1.2 不同的Master硬件共享数据时-invalid cache
1.3不同的Master硬件共享数据时-flush cache
1.4不同的缓存策略的系统共享数据时-flush cache
1.5 不同的缓存策略的系统共享数据时-invalid
1.6 cache操作系统中软件维护——Cache一致性的API:
linux/arch/arm64/mm/cache.S
linux/arch/arm64/include/asm/cacheflush.h
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)
1.7ATF
/arm-trusted-firmware/lib/aarch64/cache_helpers.S
1.8 optee
/optee/core/arch/arm/kernel/cache_helper_a64.S
1.9 下电时序中
/optee_os-3.20.0/core/arch/arm/plat-rockchip/psci_rk322x.c
思考
总结一下: modified的数据地址,在执行invalidate的时候,会先自动执行clean。即DCIVAC等效于DC CIVAC
软件维护cache的场景都有哪些?
- 不同Master之间共享数据。(最常用,比如CPU与DMA直接的数据交互)
- 相同Master不同缓存策略的软件系统共享数据
- 下电时序