CPU的Cache和MMU

HarderHeng Lv5

一、缓存

多数精简指令集的嵌入式MCU内核都没有配备高速缓存,例如cortexM4。在ARMv7-M中,cortexM7配备了L1的高速缓存。ARMv7-A的CPU都配备了高速缓存。

随着CPU制程的提升, CPU的运行频率也不断提高,但是Flash或者SRAM的速度却没有对应的提升,在嵌入式系统中可以看到总线频率往往是CPU的分频,也就是说CPU速度和访存速度不匹配。缓存就是用来缓解二者之间的不匹配问题的。

缓存行:每次从主存读取到缓存中的字数被称为缓存行长度,不同的缓存设计有不同的缓存行长度。CortexM7的缓存行长度为8个word,也就是32个字节。

1.缓存组织方式

2.缓存策略

写策略

  • 写通(write through):CPU向内存中写数据,先检查Cache中是否有数据备份,如果有则写入到Cache中,之后立即从Cache写回到内存中。
  • 写回(write back):CPU向内存中写数据,先检查Cache中是否有数据备份,如果有则写入到Cache中,并将数据标记为“脏”,在数据需要被下一次使用时则写回到内存。
  • 写分配(write alloc):CPU向内存中写数据,Cache中没有数据备份,将数据从内存中读取到Cache中,然后执行写操作。
  • 非写分配(no write alloc):CPU向内存中写数据,Cache中没有数据备份,不从内存中读取到Cache中,直接写入到内存中。

其中写回写分配搭配使用,写通非写分配搭配使用

读策略

  • 读分配(read alloc):从内存中读取数据,先从缓存中读取,如果没有则从内存中读取到Cache中,然后执行读操作。

  • 非读分配(no read alloc):不从内存中读取到Cache中,直接从内存中进行读取

3.缓存和DMA一致性

DMA全称DirectMemoryAccess,用来实现内存IO设备之间的直接访问,不需要CPU的参与。

而当CPU和DMA访问同一块内存区域时,这块内存区域又已经被缓存,就会出现数据一致性问题

  • 采用写回策略时,脏数据不能够及时更新到内存中,而DMA可能读取这一块内存,就只能读取到旧的数据。
  • 采用非读分配策略时,如果DMA已经修改了内存的数据,而缓存中的数据没有被更新,CPU就只能读取到旧的数据。

解决:

  1. 在DMA写入内存之前,将Cache中的对应内存缓存失效,这样下次CPU读取内存就只能从内存中读取。
  2. 缓存清除,也就是在写回策略中,DMA读取数据之前,将对应的缓存清除掉,那么“脏“数据就会更新到内存中。

缓存的行为受到硬件的管理,在DMA时需要手动调用管理Cache的MPU或者MMU。很多操作系统中已经集成了对缓存的管理。

4.CPU和缓存一致性

对简单的嵌入式MCU来说,可能没有高速缓存或者只有一级高速缓存。但是对于高性能的CPU来说,可能会有三级缓存。

三级缓存的组织形式一般是:

  • L1缓存每个核心独占,不管是嵌入式MCU还是高性能CPU,都具有指令和数据分离的缓存设计。
  • L2缓存可以每个核心独占,也可以每个cluster(簇)共享。
  • L3缓存基本上都是多个核心共享。

在多核CPU中由多个L1缓存,为了保证数据一致性,使用一致性协议MESI

  • Modified修改:该CacheLine有效,但是被修改了和内存中的不一致,数据只存在于本Cache中。在这种状态下必须时刻监听其他要读取或者修改主存内该CacheLine对应的数据,在行为发生前将本Cache中的数据写回到主存中。
  • Exclusive独享:该CacheLine有效,数据和内存中的数据一致,数据只存在于本Cache中。
  • Title: CPU的Cache和MMU
  • Author: HarderHeng
  • Created at : 2025-02-19 15:40:27
  • Updated at : 2025-02-20 09:36:48
  • Link: https://harderheng.life/2025/02/19/CPU的Cache和MMU/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments