自学内容网 自学内容网

超标量处理器设计笔记(7) Cache同义重名问题、同名问题,VIPT PIPT VIVT 介绍和对比

Cache 的设计

同义问题 (重名问题)

问题描述

定义:不同名字对应相同的物理位置
重名问题导致虚拟 cache 存在下面问题

  • 浪费宝贵的 cache 空间
  • 执行 store 指令,写到 cache 时,需要将同一 pa 对应的所有 va 同时修改
    如图下,VA1 修改后,VA2 也需要修改 image.pngl200

问题原因

什么时候会导致同名问题
对于 4KB 的页,

  • 小于 4KB 的 cache,其访问地址不会大于 12 位
    • 同一 PA 对应的 VA 一定相同
  • 大于 4KB 的 cache,其访问地址大于 12 位时
    • Va[11:0] 相同, 但是VPN 不同,但是 PFN 相同,页面偏移也相同
    • 如下图,8KB 的 cache,导致[12]只用于访问 cache 行 ?还是也会参与到 TLB 之中呢? image.pngl200

问题案例

使用 bank 来解决重名问题
image.pngl200

Cache 中数据部分和 Tag 部分都采用上述 bank 结构
读写过程如下

  • 读取 Cache 时,va[11:0]同时访问 bank0/1,根据 TLB 翻译出的 PA[12] 进行选择,PA 与 tag 内的 PA 进行比对
  • 写 Cache 时,只有指令 retire 时才会写入到 cache 中,可以根据 pa[12]判断写入哪个 bank 中

这样确实可以增大 cache 的容量
#问题
va[12] == pa[12] 一定等于?会不会干涉到 va 转换 pa?

同名问题

定义

相同名字对应不同的物理地址

原因

当一个进程切换到另外进程时,新进程使用 va 来访问虚拟 cache 时(虚拟地址作为 cache 的 tag 部分),则会出现错误

解决方式

最简单的方式是将虚拟 Cache 所有内容置为无效,对于 TLB 也是如此。

所以带入 PID(process ID),ASID (address Space IDentifier),每个进程都有一个 4GB 的虚拟存储区域。
8 位 ASID 则有 2^8=256 个虚拟存储器,一共有 256 * 4GB=1024GB 虚拟地址空间
Global 位:表示所有进程共享的页,不需要理会 ASID 的值

image.pngl200

查找方式如下
image.pngl200

该方式需要多一次物理内存的查找,造成 TLB 缺失时间增长。
所以第一级 PT 会用 PTR 寄存器来保存
还有一个寄存器来保存当前进程的 ASID 值
TLB 的内容是:ASID + VA

当 ASID PT 用完时,会剔除不常用的 asid,将其在 TLB 的内容里清空
由于新进程的进来会覆盖旧的 PTR 寄存器,为了恢复进程,将 PTR 存储在物理内存中

#问题 虚拟 cache 和物理cache 区别(访问 cache 的是用虚拟地址还是物理地址)AMD 案例是什么 cache? 虚拟地址

对 cache 进行控制

特殊情况

  • DMA 将物理内存的数据搬运到其他地方,最新数据还在 D-cache 中,需要将 D-cache 中的 dirty=1 的数据写回到物理内存里
  • DMA 从外界搬数据到物理内存的地址上,地址在 D-cache 缓存,需要将 D-cache 中地址的内容置于无效
  • Page fault 页迁移时,该页存在 D-cache 中,需要将 D-cache 写回到物理内存中,再写回到硬盘里
  • 处理器进行自修改指令,使 i-cache 所有内容无效,新的指令作为数据写入到 D-cache 中,再写入到物理内存中,最后送入到 I-cache 中。

需要对 cache 进行操作,clean 是将 cache 内容也到物理内存中

  • 使得 I-cache 所有/某个 cache line 置为无效
  • 使得 D-cache 所有/某个 cache line 进行 clean
  • 使得 D-cache 所有/某个 cache line 进行 clean,并且置为无效

寻址 cache line 的方式

  • Set/way 信息定位
  • 地址
    • Index 找到 Cache 中的某个 set
    • Tag 从不同 way 选出匹配的 cache line
      • Cache 物理地址作为 Tag,还需要将虚拟地址转化为物理地址

ARM 风格的 cache 管理

通过 MRC 和 MCR 指令,修改寄存器

MRC{<cond>} <coproc>, <Opl>, <Rt>, <CRn>, <CRm>{, <0p2>}
MCR{<cond>} <coproc>, <Op1>, <Rt>, <CRn>, <CRm>{, <0p2>}

image.pngl200

MIPS 风格的 cache 管理

image.pngl200

EA = GPR[base] + offset

image.pngl200

将 TLB 和 Cache 放在流水线

PIPT

串行 TLB 和 Cache 访问
对于 I-cache 来说,新增流水线,增加惩罚
对于 D-cache 来说,增加流水线,造成 load 的延迟变大(影响其他指令唤醒)

通常用于: L2 Cahce 中

image.pngl200

VIPT

同时访问 TLB 和 Cache

假设每个 Cache line 中包含 2^b 字节的数据,一共有 2^L 个 cache set,寻址长度为 L+b (字节寻址)
页面大小为 2^k 字节

第一、二种情况:Cache 容量 <= 页面大小 L+b >= k

如图所示
image.pngl200

image.pngl200

VA[L+b-1:0]来寻找对应 cache line 的数据和 tag
VA 高位找 TLB 对应的 PA
将 PA 和 cache 中的 tag 对比,判断命中
避免重名效果:VA[L+b-1:0] 直接映射的内容一致,那么必在一个 set 之中
(本质上是根据 PA 来分 cache 映射)
index 部分相同的不同物理地址才可能占据不同的 way

#问题 会不会出现页重名的现象?不会

Cache 的大小被页面大小给限制了,由此如果需要增大 cache,则增大 way 的数量,但需要比较所有的 tag,那么在比较时会占用大量时序
image.pngl200

第三种情况:Cache 容量 > 页面大小 L+b > k

image.pngl200

重名问题:页大小:4KB,cache 大小:8KB
image.pngl200

解决方案

  • 设置多个 bank
  • 利用 L2 cache 解决重名问题
    • VA2 在访问 cache 时缺失
    • 转换 PA 去访问 L2 cache
    • L2 cache 的 a1(不需要包含 offset) 不等于 va2,表明 L1 cache 已经有 VA1 了
    • 此时将 L1 cache 中的 VA1 进行 clean 并且置位无效

image.pngl200

VIVT

如果 cache 命中,不需要访问 TLB

解决重名方式也是L2 cache ,区别是需要存储完整的 VA1
image.pngl200

总结

类型优点缺点应用场景
PIPT没有重名问题查找速度慢用于 L2
VIPT适中适中大部分处理器使用
VIVT访问速度快,不需要 TLB 转换物理地址重名问题出现频繁

总结

引入虚拟存储器的优点

  • 可以让程序有独立的地址空间,每个程序都有 32 位 4GB 的地址空间,不需要限定范围

  • 引入虚拟空间和物理空间的映射,有效利用碎片化的物理空间

  • 存在多个进程时,当物理空间大小不够时,虚拟存储器可以让进程都正常运行,保存在硬盘的空间称为 swap 区,可以等效实际应用的物理内存大小为 swap + 物理内存

  • 利用虚拟存储器,可以管理每个页的权限

  • Va 在访问 TLB

    • 命中
      • 获得 PA
    • Miss
      • mmu 访问时报 page fault
        • 再将调入程序异常地址,保存好 VA
        • 操作系统根据保存的 VA 找到硬盘里对应位置,将对应的页进行替换
        • 指令重新发射,重新访问
      • Mmu 没有 page fault
        • Mmu 查询页表,获得 PTE 的状态

访问存储器的时间以 ms 记

image.pngl200


原文地址:https://blog.csdn.net/qq_41703711/article/details/144330363

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!