问题:
VIPT 、 PIPT 分别是什么东西,怎么一回事?
CPU 缓存实现方式
1. 缓存结构
ARM中的缓存结构
-
CPU 是由多个缓存行(cache line)组成的,每个缓存行包括:
- 一个有效为(valid bit)
- 一个标记地址(用于标识其对应的物理地址(在 ARM 中))
- 一些其他的状态信息
-
通常,CPU的缓存行(常见的是64B)为单位把物理内存中的数据读取到CPU缓存中。
-
为了定位缓存行,物理地址被分为三个部分:
- Tag
- 也被称为 路(way)
- 同一组中,支持的最大Tag数称为路
- Index
- 也称为 组(Set)
- Set段能表示的最大数目称为组
- 组内全相联,组间直接映射
- Offset
- 块内偏移量
- Tag
-
以64位机器,44位物理地址,32KB大小cache,缓存行64字节,2路组相连为例
63 - 44位 Tag Index Offset ddd…ddd ccc…ccc (32个) bbbbbbbb aaaaaa ARM中不使用到的位 除 index 和 offset 外的可用位用作tag(44 - 8 - 6 = 32 位),而不是说2路组相连就只有2位 32KB÷64B ÷2路= 256个组(8 位) 一个缓存行64B(6 位)
定位一个缓存行的过程
- 先定位组(对比 Index),找到组内的n个缓存行(n 路)
- 再定位缓存行(对比 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. 步骤
- CPU 把虚拟地址送到 cache
- 使用虚拟地址的 index 和 tag 定位缓存行
- 如果缓存命中,则使用缓存中的数据;
- 如果缓存不命中,则把虚拟地址发给 MMU,经过 MMU 转换为物理地址,访问内存。
2. 优点
- 硬件设计简单
- 若能缓存命中,那么不需要 MMU 把虚拟地址转换为物理地址的过程,提升了 cache 的访问速度。
3. 缺点
- 引入软件上的问题——操作系统在管理cache的时候,主要会遇到两个问题:
- 歧义(ambiguity)
- 别名(alias)
- 这两个问题的软件维护成本极高,最难管理,现在基本没有硬件还在使用了。
歧义
- 由于操作系统中,不同进程拥有自己的虚拟内存空间,会出现不同进程上有相同的虚拟地址,对应不同的物理地址,会产生歧义。
- 所以在切换进程过程中,必须对 cache 进行 flush 操作。
- 这将导致刚切换后的进程出现大量的cache miss(这是3C 中的强制缺失类型)
别名
- 不同的虚拟地址映射到相同的物理地址,而这些虚拟地址的 index 不同,会发生别名。
- 通俗的说,同一个物理地址的内容被加载到不同的 cache line 中。
- 这些不同的虚拟地址,有可能是不同进程的(可以通过flush cache 解决别名问题);也可能是同一个进程的(通过 nocache 解决)。
- 别名情况出现在共享内数据的情况下,同一数据所在的块才有可能会有不同的虚拟地址,被加载到缓存中多次。
二、PIPT
1. 步骤
- CPU 把虚拟地址送给 MMU,经过 MMU 转换为物理地址,送到 cache
- 使用物理地址的 index 和 tag 定位缓存行
- 如果缓存命中,则使用缓存中的数据;
- 如果缓存不命中,则直接根据物理地址访问内存
2. 优点
- 物理地址是唯一的,不会产生歧义和别名
3. 缺点
- 不管是否 cache 命中,都会经过 MMU 转换地址,性能最差。
三、VIPT
1. 步骤
- 虚拟地址的 index 部分进行cache查找
- 同时,虚拟地址送到 MMU 转换成物理地址(硬件上可以并行进行)
- 1,2 完成后,此时比较物理地址的 tag 部分定位缓存行
- 如果缓存命中,使用缓存中的数据;
- 如果缓存不命中,也可以直接使用物理地址访问内存。
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,也就无法避免别名问题
- 需要软件技术解决