名字重名,2行1列解析异常
摘要处理器访问存储器时,要访问的所有地址都是虚拟地址,经过TLB和MMU的映射后就是物理地址。 TBL仅用于加快从虚拟地址到物理地址的转换过程。 获得物理地址后,如果每次直接从物理存储器中读取数据,明显会变慢。 实际上,处理器配置了多级高速缓存以加快对数据的访问。
物理高速缓存处理器查询MMU和TLB以获得物理地址,然后使用物理地址查询高速缓存。 这个缓存称为物理缓存。
缺点:使用物理高速缓存的缺点是,在处理器查询MMU和TLB之前,无法访问高速缓存,从而增加了管线延迟时间。
物理缓存的工作流程如下图所示。
虚拟缓存
如果处理器使用虚拟地址寻址高速缓存,则将其称为虚拟高速缓存。 处理器在指定地址时,首先将虚拟地址发送到缓存,如果发现缓存所需的数据,就不需要访问TLB或物理存储器。
缺点:引入问题。 1 .重名(aliasing )问题,2 .同名(homonyms )问题
虚拟缓存的流程图:
总结:
1 .无论是物理缓存还是虚拟缓存,实际上都是缓存。 这里使用虚拟/物理来区分查询缓存的类别。
2 .在查询TLB之前,查看缓存是否已命中。
在重名(Aliasing)问题操作系统上,多个不同的虚拟地址可能会映射同一个物理地址。 由于采用了高速缓存体系结构,这些不同的虚拟地址占用高速缓存中不同的高速缓存行,但它们对应于同一物理地址。
示例: VA1和VA2都映射到PA,cache上有两条cache line缓存VA1和VA2。 当程序向VA1写入数据时,VA1对应的缓存行和PA的内容会发生更改,但VA2中存储的是旧数据。 这样,一个物理地址中有两个数据存储在缓存中,因此会产生歧义。
同名问题是相同的虚拟地址对应于不同的物理地址。 操作系统中的不同进程有许多相同的虚拟地址,MMU转换后会得到不同的物理地址,从而导致同名问题。
同名问题最常见的地方是过程切换。 当一个进程切换到另一个进程时,如果新进程使用虚拟地址访问缓存,则新进程将访问旧进程留下的缓存。 这个缓存数据对新流程来说是错误的,也是徒劳的。 解决方案是禁用在进程切换时保留在旧进程中的缓存。 这将确保在运行新进程时有干净的虚拟缓存。
缓存分类
虚拟地址索引域和虚拟地址标记域中的虚拟缓存(vivt ) :等效于虚拟缓存。
物理解释标签(pipt ) :使用物理地址的索引字段和物理地址的标记字段等效于物理缓存。
虚拟链路扩展标记(vipt ) :使用虚拟地址索引和物理地址标记域。
VIPT的动作流程
处理器输出的虚拟地址同时执行两件事。
向TLB/MMU发送虚拟地址,进行地址翻译。
2 .在缓存中进行索引和查询缓存。
在结束了上述两个事情之后,从1获得PFN,获得物理地址的标签域(PT ),从2获得缓存的标签域(tag ),比较这两个标签域,如果相等,则意味着命中了缓存
VIPT的重复问题
如果采用VIPT方式,也有可能引起缓存重复名称的问题。 VIPT使用虚拟地址的索引域来搜索cache组。 在这种情况下,多个cache组可能映射到同一物理地址。 以linuxkernel为例,由于将4KB大小作为一个页面进行管理,所以对于一个页面来说,虚拟地址和物理地址的低位12位(bit )是相同的。 因此,不同的虚拟地址映射到同一物理地址,这些虚拟地址页的后12位相同。 如果索引域位于bit[11:0]范围内,则不会出现缓存重复名称。 例如,如果cacheline为32Byte,则5bit用于数据域的偏移offset,如果有128个cache组,则索引域使用7bit。 在这种情况下,不会出现重复名称。
VIPT的重复实例
以Linuxkernel为例,假设page为4KB,索引域为bit[12:0],缓存路径为8KB,则bit12索引缓存路径为
主题
在与32KB路组相关的cache中,cacheline为32Byte,请描绘此cache的cacheline、way、set的图像。
a )在Cortex-A7和Cortex-A9处理器中,可以看到cache与32KB大小的四路组相关联。 让我们分析一下这个cache的结构图。
cache的总大小为32KB,为4路,因此每路大小为8kb (way _ size=32/4=8) kb )
由于cache line的大小为32字节,因此一个过程中包含的cache line的数量为num_cache_line=8KB/32B=256