代码锁存   :   将重要使用频率高的代码锁存到RAM甚至Cache中,提高CPU的访问速度,加快程序运行。

RAM相比众所周知,这里主要先总结介绍和学习一下Cache的原理和设计结构。

---------------------------------------------------------------------------------------------------------

Cache:

*首先介绍一下cache发发展背景和趋势:

     虽然CPU主频的提升会带动系统性能的改善,但系统性能的提高不仅仅取决于CPU,还与系统架构、指令结构、信息在各个部件之间的传送速度及存储部件的存取速度等因素有关,特别是与CPU/内存之间的存取速度有关。 
  若CPU工作速度较高,但内存存取速度相对较低,则造成CPU等待,降低处理速度,浪费CPU的能力。 
  如何减少CPU与内存之间的速度差异?有4种办法: 
               一种是在基本总线周期中插入等待,但这样会浪费CPU的能力。 
      另一种方法是采用存取时间较快的SRAM作存储器,这样虽然解决了CPU与存储器间速度不匹配的问题,但却大幅提升了系统成本。 
      第三种方法是在慢速的DRAM和快速CPU之间插入一速度较快、容量较小的SRAM,起到缓冲作用;使CPU既可以以较快速度存取SRAM中的数据,又不使系统成本上升过高,这就是Cache法。 
      再有一种方法,采用新型存储器。 

  目前,一般采用第三种方法。它是PC系统在不大增加成本的前提下,使性能提升的一个非常有效的技术。 

------------------------------

*Cache的工作原理:

  Cache的工作原理是基于程序访问的局部性。 

  对大量典型程序运行情况的分析结果表明,在一个较短的时间间隔内,由程序产生的地址往往集中在存储器逻辑地址空间的很小范围内。指令地址的分布本来就是连续的,再加上循环程序段和子程序段要重复执行多次。因此,对这些地址的访问就自然地具有时间上集中分布的倾向。 

  数据分布的这种集中倾向不如指令明显,但对数组的存储和访问以及工作单元的选择都可以使存储器地址相对集中。这种对局部范围的存储器地址频繁访问,而对此范围以外的地址则访问甚少的现象,就称为程序访问的局部性。 

  根据程序的局部性原理,可以在主存和CPU通用寄存器之间设置一个高速的容量相对较小的存储器,把正在执行的指令地址附近的一部分指令或数据从主存调入这个存储器,供CPU在一段时间内使用。这对提高程序的运行速度有很大的作用。这个介于主存和CPU之间的高速小容量存储器称作高速缓冲存储器(Cache)。  

  操作系统正是依据此原理,不断地将与当前指令集相关联的一个不太大的后继指令集从内存读到Cache,然后再与CPU高速传送,从而达到速度匹配。CPU对存储器进行数据请求时,通常先访问Cache。由于局部性原理不能保证所请求的数据百分之百地在Cache中,这里便存在一个命中率。即CPU在任一时刻从Cache中可靠获取数据的几率。命中率越高,正确获取数据的可靠性就越大。一般来说,Cache的存储容量比主存的容量小得多,但不能太小,太小会使命中率太低;也没有必要过大,过大不仅会增加成本,而且当容量超过一定值后,命中率随容量的增加将不会有明显地增长。 

  只要Cache的空间与主存空间在一定范围内保持适当比例的映射关系,Cache的命中率还是相当高的。 一般规定Cache与内存的空间比为4:1000,即128kB Cache可映射32MB内存;256kB Cache可映射64MB内存。在这种情况下,命中率都在90%以上。至于没有命中的数据,CPU只好直接从内存获取。获取的同时,也把它拷进Cache,以备下次访问。

----------------------------------------------------------------------------------------------------------------

 当CPU需要数据时,首先到cache内部去寻找,如果找到了,则称为命中了(cache hit),如果没有找到,则称为丢失(cache miss),这时CPU必须到内存去读取数据,并且将其保存在cache中以备后用。

*Cache的基本结构 

代码锁存 RAM 、Cache

————————————————————————————————————————————————————

Cache的组织结构

代码锁存 RAM 、Cache

* 参见回答:https://www.zhihu.com/question/24612442/answer/53107450   (用心阁)*

————————————————————————————————————————————

i-cache和d-cache区别:


    一方面是cache的行为。Icache大多都是顺序取指,碰到分支指令也会跳转,而Dcache访问的模式变化比较大。
 指令只有读和refill没有写,而数据有读也有写。最重要的是冯氏的结构是指令和数据分离。I和D在一起只有相互干扰。
    另一个方面就是,物理设计上考虑: 一个union的cache,同时需要数据和指令的访问,端口上是很难实现的。 
 所以一般在流水线的主干上,都是采用分离的icache和dcache。非主干的L2 cache,从容量的角度考虑采用union的方式。

从微处理器架构的角度来说,所谓的Cache包括了两部分:Cache控制器和Cache存储器。  
ICache只是读出指令,控制上比DCache要简单许多。

Cache存储器其一般实现方式主要有三种,分别是全相联,直接映射和组相联。全相联最灵活但是实现比较复杂。直接映射比较容易实现,但是可能产生快速抖动。组相联则是前两者的一个折衷。

DCache控制器在整个DCache中处于非常重要的地位,它控制了整个DCache所要进行的操作,同时会在发生缺失时采取相应的对策。其主要功能如下:

1)反馈给微处理器读取DCache的信息,包括DCache的命中或者缺失等信息。如果发生缺失,可能会要求流水线发生阻塞。
2)如果发生缺失,需要从下一级存储单元寻找相应的地址中的内容,并将内容载入到DCache中。
3)控制读写操作。如果是读操作,则需要为下一级的操作提供相应的数据。如果是写操作,则需要将数据写入到相应的地址中去。
为了完成上述的功能,整个DCache控制器被分为三个部分,分别为用来判断命中还是缺失的判断部分和用来执行发生缺失时一些相应操作的有限状态机部分以及正常读写的控制部分。其中有限状态机部分中还包括了两个存储块,分别是为了实现LRU (least recently used)算法的LRU数据块和为了判断存储的数据有没有被改写过的Dirty数据块

Cache的读与写

读操作

本设计所采用的读操作的方式是将标签域(Tag)中的内容和数据域(Data)中的内容同时读出,然后再将Tag的内容与地址高端进行比较。如果相等,则说明DCache命中,读出的Data的内容正是给出的地址中的内容。如果不相等,则说明发生了DCache读缺失,需要进行缺失处理。在不发生缺失的情况下,一次读操作可以在一个Clock周期内完成。这非常符合流水线的特性。
如果发生读缺失,DCacheFSM会首先查看LRU块,确定两路数据存储中具有同一索引的两个行中哪一行将会被替换出去。然后FSM会查看Dirty块,确定是否需要将行中的内容更新到主存。如果需要,则将之前读出的数据写入到主存,然后将主存中的数据读出,放到数据总线上,供流水线的下一级使用。如果不需要,则直接读取主存中相应地址的数据并放到数据总线上,供下一级使用。这些操作完成之后FSM会通知微处理器停止阻塞流水线,这样在下一个时钟周期微处理器又会正常运行。

 写操作

写操作一般有两种方式分别是写通过(Write-through)方式和写回(Write-back)方式
写通过方式支持改写Cache中的内容,但是不允许Cache和主存内容不一致,因此,对在对Cache进行写操作时,对主存也要进行写操作。这会延长写操作的时间。
写回方式则是对相应的Cache进行写操作,但是并不立即对主存进行写操作,这能有效的减少访问主存的延迟。但是这种方式的实现比较复杂,因为Cache和主存的内容存在不一致性。
写操作分两步进行,首先需要读取标签域(Tag) 和数据域(Data)中的内容,然后Tag的内容与地址高端进行比较。如果相等,则说明DCache命中,需要写入数据的地址存在,可以将数据写入DCache中。同时由于写入的数据只有32位,而读出的数据有128位,需要通过地址总线的低位来进行选择需要写入的字段。如果Tag不相等,则说明发生了DCache写缺失,需要进行缺失处理。
在不发生缺失的情况下,一次写操作需要两个Clock周期来完成,这不符合流水线的要求,若采用了流水线式的写入方式,在微处理器和DCache之间加入了一级写缓存。在读取DCache的标签和数据的内容的同时,将数据写入写缓存。这样就能够使得写入操作以流水线的方式进行,可以满足流水线微处理器的要求。
当发生写缺失时,同样FSM会先查看LRU块,确定哪一行需要从两路数据存储块中删除,然后再查看需要从Dcache中删除的行是否为“脏”。如果是“脏”行,则将之前从DCache中读出的数据写入到主存,并将主存的数据读出,并连同之前存入写缓存中的数据,准备写入到DCache中。如果行“干净”,则直接读出主存中的数据,并和写缓存的数据做好写入DCache的准备。完成之后FSM会通知微处理器停止阻塞流水线,这样在下一个时钟周期微处理器又会正常运行,同时将数据写入。
注:
          1、DMA 通常负责外设与 RAM 的通信,是不经过 CPU 的,当 DMA 修改 RAM 中的数据时,CPU 是不知道的。(单核CPU中存在唯一关键问题)





参考:

http://www.cnblogs.com/waytofall/p/3998854.html  (CPU 与 Cache)

http://www.jianshu.com/p/061a5d66ea20    (Cache结构)

http://blog.csdn.net/zdl1016/article/details/8882092  (概述)

http://blog.chinaunix.net/uid-24517893-id-334964.html (可能的不一致性)

相关文章: