2、直接映象及其变换
  直接映象方式是一种最简单的方法。主存中的一块只能映象到Cache的一个确定块中。假设主存的块号为B,Cache的块号为b,则它们之间的映象关系可以表示为:
  b=B mod Cb
  其中,Cb是Cache的块数。
  直接映象方法的映象关系如图5.26所示。把主存按Cache的大小分成区,在一般情况下,主存的容量是Cache容量的整倍数。主存每一个分区内的块数与Cache的总块数正好相等。直接映象方式只能把主存各个区中相对块号相同的那些块映象到Cache中同一块号的那个确定块中。例如,主存的块0只能映象到Cache的块0中,主存的块1只能映象到Cache的块1中。同样,主存区1中的块Cb(在区1中的相对块号是0)也只能映象到Cache的块0中。另外,Mb是主存的块数,Me是主存的区数。

图 5.26 直接相联映象方式
图 5.27 直接相联地址变换
  根据前面给出的地址映象规则,整个Cache地址与主存地址的低位部分是完全相同的。在图5.27中,主存地址中的块号B与Cache地址中的块号b是完全相同的。同样,主存地址中的字内地址W与Cache地址中的块内地址w也是完全相同的。主存地址比Cache地址长出来的部分称为区号E。
  在程序执行过程中,当要访问Cache时,为了实现主存块号到Cache块号的变换,需要有一个存放主存区号的小容量存储器。这个存储器的容量与Cache的块数相等,字长为主存地址中区号E的长度,另外再加一个有效位。
  直接映象方式的地址变换过程如图5.27所示。首先用主存地址中的块号B去访问区号存储器(按地址访问)。把读出来的区号与主存地址中的区号E进行比较,根据比较结果和与区号在同一存储字中的有效位情况作相应的处理。
  如果区号比较结果相等,有效位为"1",则Cache命中,表示要访问的那一块已经装到Cache中了,这时的Cache地址是正确的。用这个Cache地址去访问Cache,把读出来的数据送往CPU。其它情况均为Cache没有命中,或称为Cache失效,表示要访问的那个块还没有装到Cache中,这时,要去访问主存储器,把读出来的一个字送往CPU。同时,把包括被访问字在内的一块都从主存储器中读出来。
  如果区号比较结果相等,有效位为"0",表示Cache中的这一块已经被作废,这时,要把从主存中读出来的新块装到Cache中,并且把有效位置"1"即可。如果区号比较结果不相等,有效位为"0",表示Cache的这一块是空的。这时,只要把从主存中读出来的新块装到Cache中,并把有效为置"1"即可。另外,还要把主存区号写到区号存储器的相应单元中。
如果区号比较结果不相等,有效位为"1",表示原来在Cache中存放的那一块是有用的,这时,必须先把Cache中的这一块写回到主存储器中原来存放它的存储单元中,腾出地方来,才能把从主存中读出的新块装到Cache中。另外,也要把主存区号写到区号存储器的相应单元中。
  为了提高Cache的访问速度,可以把图5.27中的区号存储器与Cache合并成一个存储器,如图5.28所示。这样,用主存地址中的块号B访问Cache,把区号和这一块的所有数据同时都读出来。由于Cache中一块的字数很少(1至16个),通过一个多路选择器,在块内地址的控制下,把所需要的那个字选出来送往CPU。如果Cache没有命中,处理方法与图5.27中的相似。
  图5.28所示的Cache,它的访问速度要比图5.27的快得多,多路选择器的实现也比较容易。在前面介绍的并行和交叉访问存储器中,从多个存储体中读出的数据也采用多路选择器输出。两个多路选择器是完全相同的。
  直接映象方法的优点是硬件实现很简单,不需要采用相联访问的存储器,访问速度也比较快。实际上,采用直接相联方式的Cache不需要进行地址变换,因为主存地址的低位部分就是Cache的地址。
  直接映象方式的主要缺点是块的冲突率比较高。当主存中的两个或两个以上块都映象到Cache的同一块中,而这些块又都是当前的常用块时,Cache的命中率会很低。这时,即使Cache中还有很多空闲的块,也帮不上忙。
  在IBM370/158等计算机中采用直接映象方式。
图 5.28 快速的直接相联地址变换