每日一问(20210921)—— VIPT 和 PIPT是什么东西?

问题:
VIPT 、 PIPT 分别是什么东西,怎么一回事?

CPU 缓存实现方式

1. 缓存结构

ARM中的缓存结构
  • CPU 是由多个缓存行(cache line)组成的,每个缓存行包括:

    • 一个有效为(valid bit)
    • 一个标记地址(用于标识其对应的物理地址(在 ARM 中))
    • 一些其他的状态信息
  • 通常,CPU的缓存行(常见的是64B)为单位把物理内存中的数据读取到CPU缓存中。

  • 为了定位缓存行,物理地址被分为三个部分:

    • Tag
      • 也被称为 (way)
      • 同一组中,支持的最大Tag数称为路
    • Index
      • 也称为 (Set)
      • Set段能表示的最大数目称为组
      • 组内全相联,组间直接映射
    • Offset
      • 块内偏移量
  • 以64位机器,44位物理地址,32KB大小cache,缓存行64字节,2路组相连为例

    63 - 44位TagIndexOffset
    ddd…dddccc…ccc (32个)bbbbbbbbaaaaaa
    ARM中不使用到的位除 index 和 offset 外的可用位用作tag(44 - 8 - 6 = 32 位),而不是说2路组相连就只有2位32KB÷64B ÷2路= 256个组(8 位)一个缓存行64B(6 位)
定位一个缓存行的过程
  1. 先定位组(对比 Index),找到组内的n个缓存行(n 路)
  2. 再定位缓存行(对比 Tag)

2. Cache 组织方式

上述过程中,提到的地址是物理地址,然而我们知道,CPU 发出的地址实际上是虚拟地址,虚拟地址经过 MMU 转换后成为物理地址

  • 在 ARM Cortex-A CPU中,通常使用的是物理地址(PIPT),而其他类型的 CPU 中,则可能使用虚拟地址。
  • 上面过程中,为了定位一个缓存行,会有对比 Index 和 对比 Tag 两个过程,这两个过程使用物理地址还是虚拟地址,是不同的 cache 组织方式。
  • 可以分成三种:
    • VIVT(virtual index virtual tag):虚拟高速缓存
    • VIPT(virtual index physical tag):物理高速缓存
    • PIPT(physical index physical tag):物理标记的虚拟高速缓存

一、VIVT

1. 步骤
  1. CPU 把虚拟地址送到 cache
  2. 使用虚拟地址的 index 和 tag 定位缓存行
  3. 如果缓存命中,则使用缓存中的数据;
  4. 如果缓存不命中,则把虚拟地址发给 MMU,经过 MMU 转换为物理地址,访问内存。
2. 优点
  • 硬件设计简单
  • 若能缓存命中,那么不需要 MMU 把虚拟地址转换为物理地址的过程,提升了 cache 的访问速度。
3. 缺点
  • 引入软件上的问题——操作系统在管理cache的时候,主要会遇到两个问题:
    • 歧义(ambiguity)
    • 别名(alias)
  • 这两个问题的软件维护成本极高,最难管理,现在基本没有硬件还在使用了。
歧义
  • 由于操作系统中,不同进程拥有自己的虚拟内存空间,会出现不同进程上有相同的虚拟地址,对应不同的物理地址,会产生歧义
  • 所以在切换进程过程中,必须对 cache 进行 flush 操作。
    • 这将导致刚切换后的进程出现大量的cache miss(这是3C 中的强制缺失类型)
别名
  • 不同的虚拟地址映射到相同的物理地址,而这些虚拟地址的 index 不同,会发生别名
  • 通俗的说,同一个物理地址的内容被加载到不同的 cache line 中。
  • 这些不同的虚拟地址,有可能是不同进程的(可以通过flush cache 解决别名问题);也可能是同一个进程的(通过 nocache 解决)。
  • 别名情况出现在共享内数据的情况下,同一数据所在的块才有可能会有不同的虚拟地址,被加载到缓存中多次。

二、PIPT

1. 步骤
  1. CPU 把虚拟地址送给 MMU,经过 MMU 转换为物理地址,送到 cache
  2. 使用物理地址的 index 和 tag 定位缓存行
  3. 如果缓存命中,则使用缓存中的数据;
  4. 如果缓存不命中,则直接根据物理地址访问内存
2. 优点
  • 物理地址是唯一的,不会产生歧义和别名
3. 缺点
  • 不管是否 cache 命中,都会经过 MMU 转换地址,性能最差。

三、VIPT

1. 步骤
  1. 虚拟地址的 index 部分进行cache查找
  2. 同时,虚拟地址送到 MMU 转换成物理地址(硬件上可以并行进行)
  3. 1,2 完成后,此时比较物理地址的 tag 部分定位缓存行
  4. 如果缓存命中,使用缓存中的数据;
  5. 如果缓存不命中,也可以直接使用物理地址访问内存。
2. 优点
  • 查找 cache index 部分和 MMU 转换地址 同时进行
  • VIPT 使用物理地址部分作为tag,不会存在歧义问题
  • 有可能避免别名问题
    • 虚拟地址转换物理地址 —— 以页为单位的(4KB),那么页内 offset 的位数为 12 位,在地址转换的过程中,低12位是不会发生变化的;
    • 对比上面ddd…ccc…bbbbbbbbaaaaaa的例子,其中b部分数字作为index,如果说b和a的位数加起来刚好也等于12位,地址转换后由于低12位没有变化,那么VI和PI其实是一样的,这时的VIPT实际上 = PIPT,也就不会产生别名问题
3. 缺点
  • 也可能不能避免别名问题
    • 当上述情况下,b和a的位数加起来不等于页大小位数时,无法让VI = PI,也就无法避免别名问题
    • 需要软件技术解决
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值