在Cache中,地址映象是指把主存地址空间映象到Cache地址空间,具体地说,就是把存放在主存中的程序按照某种规则装入到Cache中,并建立主存地址与Cache地址之间的对应关系。而地址变换则是指当程序已经装入到Cache之后,在实际运行过程中,把主存地址如何变换成Cache地址。
  地址的映象和变换是紧密相关的,采用什么样的地址映象方法,就必然有与这种映象方法相对应的地址变换方法,因此,必须把它们放在一起介绍。
  无论采用什么样的地址映象方式和地址变换方式,都要把主存和Cache划分成同样大小的存储单位,每个存储单位称为"块"。在进行地址映象和地址变换过程中,都以块为单位进行调度。
  在选取地址映象方法时,要考虑多方面的因素。如地址变换的硬件是否容易实现,地址变换的速度是否快,这种映象方法的主存空间利用率是否高,以及在把主存中的一块装入到Cache中时,发生块冲突的概率如何等。
  根据所采用的地址映象方法和地址变换方法的不同,有多种不同类型的Cache。

  1 全相联映象及其变换
  全相联映象方式是指主存中的任意一块可以映象到Cache中的任意一块中,如图5.24所示。如果Cache的块数为Cb,主存的块数为Mb,则主存与Cache之间的映象关系共有Cb×Mb种。如果采用目录表来存放这种映象关系,则目录表的容量为Cb,字长为Cache地址中的块号长度与主存地址中的块号长度之和再加一个有效位。
图 5.24 全相联映象方式
  采用全相联映象方式的地址变换过程如图5.25所示。主存块号与Cache块号的映象关系存放在用高速存储器实现的目录表中。目录表的每一个存储单元由三部分组成,主存块号、Cache块号及一个有效位。
  在程序执行过程中,当访问Cache时,用主存地址中的块号B与目录表中的主存块号字段进行相联比较。如果发现有相等的,表示要访问的数据已经装到Cache中了,这种情况称为Cache命中。这时,只要把目录表中与主存块号字段在同一个存储单元中的Cache块号读出来,并把它与主存地址中的块内地址w直接拼接起来,就得到Cache地址。用这个Cache地址去访问Cache,把读出来的一个字送往CPU就完成了访问过程。如果在相联比较中没有发现相等的,表示要访问的那个块还没有装入到Cache中,这种情况称为Cache没有命中,或称为Cache失效。这时,要去访问主存储器,把从主存储器中读出来的一个字送往CPU。同时,把包括被访问字在内的一块都从主存储器中读出来装到Cache中,另外,还要修改目录表中的主存块号字段,把当前的主存块号B写到目录表的这个存储单元中。
  有效位是用来标记目录表中的各个存储单元是否有效的。如果有效位为"1",表示目录表中由主存块号B与Cache块号b建立的映象关系是有效的。实际上也表示在Cache的第b块中存放数据是主存第B块中数据的正确副本。如果有效位为"0",表示目录表中的主存块号B与Cache块号b之间的映象关系是无效的,或者说它们之间根本没有什么关系,Cache的第b块中存放数据也不是主存第B块中数据的正确副本。因此,在访问目录表时,也要看有效位的状态。在Cache失效时,也要对有效位的状态进行管理。
图 5.25 全相联地址变换
  采用全相联映象和变换方式最突出的优点是块的冲突率比较小,Cache的利用率也最高。但是,需要一个相联访问速度很快,容量为Cb的相联存储器,其代价很高。而且,相联比较所花费的时间将影响Cache的访问速度。
  在虚拟存储器中,一般都采用全相联映象方式,这是因为当发生主存页面失效时,必须进入异常故障处理,由软件完成地址变换,即把多用户虚地址变换成主存实地址,并从磁盘存储器中调入一个页面装入到主存储器中。由于磁盘存储器的寻址是由机械动作来完成的,相对速度很慢。因此,在一般多用户和多任务系统中,当发生主存页面失效时,通过任务切换,切换到一个程序已经装入到主存储器中的任务中去执行。由于这些原因,在虚拟存储器中,采用全相联映象方式是必然的。