01-简述cache的基本概念和使用场景

快速链接:

1、为什么要用cache?

ARM 架构刚开始开发时,处理器的时钟速度和内存的访问速度大致相似。今天的处理器内核要复杂得多,并且时钟频率可以快几个数量级。然而,外部总线和存储设备的频率并没有达到同样的程度。可以实现可以与内核以相同速度运行的小片上 SRAM块,但与标准 DRAM 块相比,这种 RAM 非常昂贵,标准 DRAM 块的容量可能高出数千倍。在许多基于 ARM 处理器的系统中,访问外部存储器需要数十甚至数百个内核周期。

高速缓存是位于核心和主内存之间的小而快速的内存块。它在主内存中保存项目的副本。对高速缓冲存储器的访问比对主存储器的访问快得多。每当内核读取或写入特定地址时,它首先会在缓存中查找。如果它在高速缓存中找到地址,它就使用高速缓存中的数据,而不是执行对主存储器的访问。通过减少缓慢的外部存储器访问时间的影响,这显着提高了系统的潜在性能。通过避免驱动外部信号的需要,它还降低了系统的功耗
在这里插入图片描述

2、为什么要学习cache呢?

cache和我们软件工程师有啥关系?其实在很多时候,硬件都会自动去维护cache和内存直接的一致性,这和我们软件工程师都没有太大的关系,所以很多时候我们也无需去理解cache的原理。但是实就是事实,不管你有没有理解,你都是一直在使用的。做为一名底层的软件开发者,有些时候,你也不得不去主动刷新cache,即软件中维护内存一致性 。
那么一般什么时候需要主动刷cache呢(软件中维护内存一致性) ? 以下便举了几个最常见的示例。

2.1、 不同的Master硬件共享数据时

例如一个core和一个crypto engine硬件,在共享数据的时候。需要软件主动去invalid或flush cache的操作。

2.1.1、软件中维护内存一致性 – flush cache

在这里插入图片描述

2.1.2、软件中维护内存一致性 – invalid cache

在这里插入图片描述

2.2、 不同的缓存策略的系统共享数据时

例如在一个TEE + linux的系统中,且两个系统有着不同的缓存策略。如linux kernel中是outer cacheable,TEE中是non-cacheable

2.2.1、软件中维护内存一致性 – flush cache

在这里插入图片描述

2.2.2、软件中维护内存一致性 – invalid cache

在这里插入图片描述

3、怎么去刷cache呢? (软件维护cache的一致性)

ARM提供了操作cache的指令, 软件维护操作cache的指令有三类:

  • Invalidation:其实就是修改valid bit,让cache无效。
  • Cleaning: 清除cache中的data和TAG,这其实就是我们所说的flush cache,这里会将cache数据回写到内存,并清除dirty标志
  • Zero:将cache中的数据清0.

那么一般什么时候需要软件维护cache一致性呢?
(1)、当有其它的Master改变的external memory,如DMA操作
(2)、MMU的enable或disable的整个区间的内存访问,
(3)、当不同缓存策略的系统使用同一块内存通信时,如REE enable了mmu,TEE disable了mmu.

针对第(2)点,cache怎么和mmu扯上关系了呢?那是因为: mmu的开启和关闭,影响了内存的permissions, cache policies

3.1、cache一致性指令介绍

查阅armv8/armv9的aarch64体系中,定义了如下的缓存一致性操作指令
在这里插入图片描述
指令太多,不太好记,然后我们总结如下:
在这里插入图片描述
按照指令,分为:

  • IC : 操作instruction cache
  • DC : 操作data cache

按照操作,分为以下三类:

  • Invalidation:其实就是修改valid bit,让cache无效。
  • Cleaning: 清除cache中的data和TAG,这其实就是我们所说的flush cache,这里会将cache数据回写到内存,并清除dirty标志
  • Zero:将cache中的数据清0.

Points的定义:
其描述的是操作cache的范围

  • Point of Unification (PoU) : instruction、data、TLB访问一致性的点
  • Point of Coherency (PoC):agents访问内存一致性的点
  • Point of Persistence (PoP) : 和FEAT_DPB、FEAT_DPB2 feature相关
  • Point of Deep Persistence (PoDP) :访问memory一致性的点
    在这里插入图片描述
3.2、cache一致性指令的使用示例

在这里插入图片描述

3.3、 操作系统中软件维护cache一致性的API

在操作系统中,我们只需要调用相关的API即可,也无需牢记以上的维护cache一致性的命令。

比如在Linux Kernel 操作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)

关注"Arm精选"公众号,备注进ARM交流讨论区。
在这里插入图片描述

FIFO(First-In-First-Out)是一种常用的数据结构,用于在数据流中存储和传输数据。它可以在不同的场景使用,并且使用方法也有所不同。 FIFO的使用场景包括但不限于以下几个方面: 1. 数据缓存:FIFO可以用作数据缓存,用于临时存储数据,以便后续处理。在这种情况下,大的FIFO可以使用内部BLOCK RAM资源,而小的FIFO可以使用寄存器资源进行实现\[2\]。 2. 数据传输:FIFO可以用于数据的传输和交换。例如,在通信系统中,FIFO可以用于存储接收到的数据,然后按照一定的顺序进行处理和传输。 3. 数据流控制:FIFO可以用于控制数据流的速率。通过调整FIFO的读写速度,可以实现数据的流量控制,以避免数据丢失或溢出。 FIFO的使用方法取决于具体的应用场景和需求: 1. 宽度选择:FIFO的宽度是指一次读写操作的数据位数。在单片成品IC中,FIFO的宽度是固定的,但在使用FPGA自己实现FIFO时,宽度可以自己定义\[1\]。 2. 同步与异步:FIFO可以分为同步FIFO和异步FIFO。同步FIFO的读写操作使用相同的时钟,而异步FIFO的读写操作使用不同的时钟。选择同步FIFO还是异步FIFO取决于具体的设计需求和时钟域的要求\[2\]。 3. 存储和读取:数据可以通过写入操作存储到FIFO中,然后通过读取操作从FIFO中读取出来。在设计中,可以根据需要选择合适的存储和读取策略,例如使用大的FIFO作为主缓存,而小的FIFO用于写入和读取的控制\[3\]。 总之,FIFO是一种常用的数据结构,可以在不同的场景使用使用FIFO时,需要根据具体的应用需求选择合适的宽度、同步方式和存储读取策略。 #### 引用[.reference_title] - *1* *2* *3* [fifo在FPGA中的应用小结](https://blog.csdn.net/doghan11/article/details/69263945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值