CPU cache知识二 —— ARM架构cache结构和细节

一、cache的基本概念和结构

 cache本质就是一个硬件hash表+SRAM。

从上面的cache结构图可以解答如下疑问:

  1. cache有哪些属性?
  2. cache如何寻址?
  3. cache的一般结构是什么样子?

下面分点作答:

1. cache有哪些属性?

    line:代表一个cacheline,cache中最小访问单元,常见的cache line大小是32/64 Byte

    set(组):相同index的cache line组成的一个组。

    way(路):在组相联的cache中,cache被分成大小相同的几个快,一个cache块就是一个way。

2. cache如何寻址?

    处理器访问cache时,cache电路会将CPU地址进行解码,分成3个部分,分别是:

    offset: 用于某个cache line——字抽取

    index: 用于匹配某个cache line——组选择

    tag: 用于判断匹配到的cache line存放的数据是否和处理器想要的一致——行匹配

3.cache的一般结构是什么样子?

    这里展示一个便于理解的抽象结构,而非实际物理结构(实际物理结构就是一块SRAM硅片,并不是上图的立体结构),再进一步,为了方便理解上图,抽象出如下三维坐标系:

将这个三维坐标和上图的cache立体结构对应起来,可以看出以下cache属性的关系:

way: 对应坐标系中一个(set,line)平面

set: 对应坐标系中一个(line,way)平面

index:用于匹配cache line所在的set(组)

二、cache的类型

直接映射高速缓存(一个路,多个组,每个组包含一个cache line)——缺点是多个组索引(Index)指向相同的cacheline,容易导致cache颠簸

组相联高速缓存(多个路,多个组,每个组包含多个cache line)——各缺点介于二者之间

全相联高速缓存(一个组,多个路,这个组包含cache的所有cache line)——缺点是要维护更庞大的cache查找表(Tag字段)

三、Data cache的组织方式以及各种的优缺点

处理器在进行存储器访问时,处理器访问的地址是虚拟地址,经过MMU的转换,得到物理地址。那么查询cache组是用虚拟地址还是物理地址的Index域呢?当找到cache组时,使用虚拟地址,还是物理地址的Tag域来匹配cache line呢?

VIVT(Virtual Index Virtual Tag):使用虚拟地址Index域和虚拟地址Tag域

VIPT(Virtual Index Physical Tag):使用虚拟地址Index域和物理地址Tag域

PIPT(Physical Index Physical Tag):使用物理地址Index域和物理地址Tag域

说明:这里的V/P其实就是指上图中address中的Tag/Index/Line来自V(虚拟地址)还是P(物理地址)

下面以VIPT方式cache工作流程举例说明:

情形一:TLB hit并且cache hit

  1. CPU发出VA,给TLB/MMU和cache
  2. cache用VA的Index域匹配cache line组
  3. 用VA查找TLB,如果TLB hit,直接获取VA对应的PA
  4. 用PA中的tag域匹配cache line
  5. 如果cache hit,执行cache line字抽取动作

情形二:TLB hit并且cache miss

  1. CPU发出VA,给TLB/MMU和cache
  2. cache用VA的Index域匹配cache line组
  3. 用VA查找TLB,如果TLB hit,直接获取VA对应的PA
  4. 用PA中的tag域匹配cache line
  5. 如果cache miss,那么用获取到的PA访问系统主存,获取数据,并更新缓存

情形三:TLB miss并且cache hit

  1. CPU发出VA,给TLB/MMU和cache
  2. cache用VA的Index域匹配cache line组
  3. 用VA查找TLB,如果TLB miss,CPU重新查询页表,通过MMU将VA映射到PA,并更新TLB
  4. 用PA中的tag域匹配cache line
  5. 如果cache hit,执行cache line字抽取动作

情形四:TLB miss并且cache miss

  1. CPU发出VA,给TLB/MMU和cache
  2. cache用VA的Index域匹配cache line组
  3. 用VA查找TLB,如果TLB miss,CPU重新查询页表,通过MMU将VA映射到PA,并更新TLB
  4. 用PA中的tag域匹配cache line
  5. 如果cache miss,那么用获取到的PA访问系统主存,获取数据,并更新缓存

VIVT/VIPT/PIPT的优缺点分析:

VIVT:多个VA可能映射到同一PA,导致多个cache line组(VA不同,index域不同,查找到的cache 组则不同)映射到同一物理地址,这种现象叫做cache alias(高速缓存别名)。一旦一个VA到PA的映射关系改变,cache内容将会写回物理内存。此时,由于物理内存内容的变化需要同步到cache,就需要clean和invalidate(这两个操作结合起来就叫做flush)其余同名cache line,导致系统性能下降。

VIPT:如果index域位于地址的bit0~bit11(因为linux kernel以4KB(12bit位宽)大小为页面进行物理内存管理),就不会引起cache alias,否则还是会引起该问题。因为对于一个页面来说,虚拟地址和物理地址的低12bit是完全一样的,如果index域位于bit0~bit11,此时VIPT等价于PIPT。

PIPT:就不会存在cache alias问题,但是结构更复杂。ARM Cortex-A系列处理器使用的是PIPT方式。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

denglin12315

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值