主存与 Cache 的地址映射 CPU 对存储器的访问,通常是一次读写一个字单元。当 CPU 访Cache 不命中时,需将存储在主存中的字单元连同其后若干个字一同调入Cache 中,之所以这样做,是为了使其后的访存能在 Cache 中命中。因此,主存和 Cache 之间一次交换的数据单位应该是一个数据块。数据块的大小是固定的,由若干个字组成,且主存和 Cache 的数据块大小是相同的。 从 Cache-主存层次实现的目标看,一方面既要使 CPU 的访存速度接近于访 Cache 的速度,另一方面为用户程序提供的运行空间应保持为主存容量大小的存储空间。在采用 Cache-主存层次的系统中,Cache 对用户程序而言是透明的,也就是说,用户程序可以不需要知道 Cache 的存在。因此,CPU 每次访存时,依然和未使用 Cache 的情况一样,给出的是一个主存地址。但在 Cache-主存层次中,CPU 首先访问的是 Cache,并不是主存。为此,需要一种机制将 CPU 的访主存地址转换成访 Cache 地址。而主存地址与 Cache 地址之间的转换是与主存块与 Cache 块之间的映射关系紧密联系的,也就是说,当 CPU 访 Cache 未命中时,需要将欲访问的字所在主存中的块调入 Cache 中,按什么样的策略调入,直接影响到主存地址与 Cache 地址的对应关系,这也就是本小节要解决的主存与 Cache 的地址映射问题。 主要有三种地址映射方式,分别为全相联映射、直接相联映射和组相联映射。 1 . 全相联映射 全相联映射是指主存中任一块都可以映射到Cache 中任一块的方式,也就是说,当主存中的一块需调入 Cache 时,可根据当时 Cache 的块占用或分配情况,选择一个块给主存块存储,所选的 Cache 块可以是 Cache 中的任意一块。例如,设 Cache 共有2C块,主存共有2M块,当主存的某一块 j需调进 Cache 中时,它可以存入 Cache 的块 0、块 1、… 、块 i、… 或块 2C -1 的任意一块上。如图 4-28 所示。 图4-28 全相联映射方式 在全相联映射方式下,CPU 的访主存地址为如下形式: 其中,M 为主存的块号,W 为块内的字号。而 CPU 访Cache 的地址形式为: 其中,C 为Cache 的块号,W 为块内的字号。 主存地址到 Cache 地址的转换是通过查找一个由相联存储器实现的块表来完成的,其形成过程如图4-29 示。 图4-29 全相联映射的地址转换 当一个主存块调入Cache 中时,会同时在一个存储主存块号和Cache块号映射表的相联存储器...