【CPU】Cache和VIPT

tag取自虚拟地址导致歧义,index取自虚拟地址导致别名


在计算机体系结构中,缓存设计有多种方式来优化地址转换和访问效率。VIPT(Virtual Index Physical Tag)是其中一种缓存组织形式,它通过特定的设计来平衡虚拟地址和物理地址的使用,从而提高性能并减少地址转换带来的延迟。下面详细解释VIPT的概念及其访问流程,并解答为什么可以基于虚拟地址索引来查找缓存行。

VIPT(Virtual Index Physical Tag)概念

VIPT缓存是一种缓存组织形式,在这种结构中:

  • 索引(Index):使用虚拟地址的一部分作为索引来定位缓存中的特定行。
  • 标签(Tag):存储的是对应的物理地址的一部分,用于验证是否真正命中。
    在这里插入图片描述
    VIPT的tag取决于物理页大小的剩余位数,而不是去掉index和offset的剩余位数。物理tag是惟一的,所以不存在歧义。

只要tag/index和物理地址中对应段保持一致,就有唯一性

为什么使用虚拟地址作为索引?
  1. 减少地址转换延迟

    • 在传统的缓存访问中,如果完全依赖物理地址进行索引,则每次访问缓存之前都需要先经过MMU(内存管理单元)将虚拟地址转换为物理地址。这个过程涉及到查询页表或TLB(Translation Lookaside Buffer),可能会带来额外的延迟。
    • 而VIPT允许直接使用虚拟地址的一部分来快速找到可能包含所需数据的缓存行,这样可以在地址转换完成之前就开始缓存查找过程,减少了等待时间。
  2. 保持一致性

    • 尽管索引使用虚拟地址,但最终确认缓存命中的依据仍然是物理地址的标签(Tag)。这意味着即使不同的进程可能映射到相同的虚拟地址,但由于它们的物理地址不同,不会发生混淆。

访问流程

以下是VIPT缓存访问的具体步骤:

  1. 获取虚拟地址:当CPU需要访问内存时,首先产生一个虚拟地址。

  2. 提取索引部分:从虚拟地址中提取出一部分位作为索引(Index),用于定位缓存中的某一行。

  3. 同时进行地址转换:与此同时,MMU开始处理虚拟地址到物理地址的转换(这一步通常涉及查询ITLB/UTLB)。

  4. 读取缓存行:根据提取的索引部分,直接访问缓存中的对应行,并读取该行的所有标签(Tag)以及数据。

  5. 比较标签:一旦MMU完成了地址转换,获得完整的物理地址后,将其与之前从缓存行中读出的标签进行比较。

    • 如果标签匹配,则表示缓存命中,可以直接使用缓存中的数据。
    • 如果不匹配,则表示缓存未命中,需要从主存中加载数据。
  6. 处理结果:根据是否命中采取相应的后续操作,如更新缓存、继续执行等。

关键点解释

  • 为何能用虚拟地址索引?

    • 这是因为在大多数情况下,虚拟地址和物理地址之间的映射关系在一定范围内是一致的(即对于小范围内的地址,虚拟地址的低位可以直接用来作为物理地址的低位,因为这些位通常不会改变)。因此,可以安全地使用虚拟地址的一部分来快速定位缓存行。
  • 如何确保正确性?

    • 尽管索引使用虚拟地址,但最终确认是否命中的依据是物理地址的标签。这样即使两个不同的虚拟地址映射到同一个物理地址,也不会导致错误的缓存命中。

通过这种方式,VIPT缓存能够在不显著增加复杂度的前提下,有效地减少地址转换带来的延迟,提升整体系统性能。希望这个详细的解释能够帮助您理解VIPT缓存的工作原理及其优势。
在这里插入图片描述
由于玄铁C910中指令缓存为VIPT(Virtual Index Physical Tag)结构,故返回的物理地址将与以虚拟地址为索引从指令缓存中读出的各路标志(tag)在IF级比较来判断是否发生缓存命中。仅当MMU返回指令PC物理地址后,IF级的数据才是有效的,若指令PC未及时完成虚实地址转换,将会阻塞IF级流水线。


在这里插入图片描述

  • 使用PIPT结构,当访问缓存的索引超过页内偏移的大小(即地址的低12位)时,则需要先访问TLB/MMU得到物理地址后再索引缓存

无论是哪种cache组织方式,当页面大小为4KB时,虚拟地址和物理地址的低12bit都是一致的。

所以当index和tag位数相加小于等于12bit时,可以直接使用虚拟地址,不需要访问TLB/MMU来获取物理地址,从而改善访问延迟

  • 而如果想要访问缓存的索引不超过页内偏移的大小,则缓存的大小最大只能为4KB×组相联数,这样将大大限制了缓存的容量。

缓存大小计算公式:路数(一组中有几行cache line) * 组数 * cache line大小 = 路数 * index * offset = 路数 * 4KB


参考链接:https://zhuanlan.zhihu.com/p/577138649#:~:text=1.1%20%E6%AD%A7%E4%B9%89(ambiguity)%E6%AD%A7%E4%B9%89%E6%98%AF%E6%8C%87%E4%B8%80%E4%B8%AAVA%E5%AF%B9%E5%BA%94%E4%B8%8D%E5%90%8C%E7%9A%84PA%E3%80%82%E4%BE%8B%E5%A6%82%E4%B8%A4%E4%B8%AA%E4%B8%8D%E5%90%8C%E7%9A%84%E8%BF%9B%E7%A8%8B%EF%BC%8C%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E7%9A%84%E5%9C%B0%E5%9D%80%E4%BA%92%E7%9B%B8
https://zhuanlan.zhihu.com/p/503078043
https://mp.weixin.qq.com/s/uGTg5EPxqhI0MPZHv3FgvQ【强推这篇文章,写得很详细】

### 关于VIPT的相关资料 在Linux学习资料中,涵盖了多种类型的资源,包括视频、电子书以及PPT等[^1]。然而,在这些资料的具体分类中并未明确提及关于VIPT(Virtually Indexed Physically Tagged)缓存结构的PPT文档。如果需要深入研究VIPT技术,可以从处理器架构的角度出发。 对于VIPT的应用场景技术细节,通常会在CPU缓存设计部分涉及。例如某款处理器采用VIPT的方式组织其L1数据缓存,具体参数如下:L1 Dcache容量为64KB,采用4-way组相联形式,并通过ECC进行校验[^3]。这类技术背景可能存在于高级计算机体系结构课程或者特定芯片的技术白皮书中。 以下是获取VIPT相关PPT资料的一些建议方法: #### 方法一:搜索引擎关键词检索 可以通过主流学术搜索引擎输入精确匹配的关键字组合来查找目标文件。“VIPT cache organization ppt” 或者 “virtually indexed physically tagged presentation slideshare”,这样能够定位到公开分享的学习材料。 #### 方法二:查阅官方文档或开源项目说明 某些硬件厂商会发布详细的开发者指南,其中包含了有关内存子系统的实现原理图解。比如ARM Cortex系列手册里就有提到不同版本间TLB与Cache配置差异之处[^4]。另外像Linux kernel源码目录下也可能附带一些解释性备注帮助理解底层机制变化[^2]。 #### 示例代码片段展示如何解析ELF格式程序加载地址映射关系以便更好地掌握虚拟索引物理标记概念: ```c #include <stdio.h> #include <elf.h> void analyze_elf(const char *filename){ FILE* f = fopen(filename, "rb"); Elf64_Ehdr ehdr; fread(&ehdr,sizeof(ehdr),1,f); printf("Entry point address: %lx\n", ehdr.e_entry); fclose(f); } int main(){ const char filename[]="testprogram"; analyze_elf(filename); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值