现在的位置: 首页 > 综合 > 正文

【我所認知的BIOS】–>Cache(2)

2013年10月13日 ⁄ 综合 ⁄ 共 5144字 ⁄ 字号 评论关闭

 

【我所認知的BIOS-->Cache(2)

LightSeed  

2009-12-7

紧接上一篇,go on。。。

5Level 2 cache

5.1 L2的优点

(从此节往下,我都是拿486 CPU来做例子说明。)关于L1的介绍,我想就不用多说了,它就是在CPU的内部,比较小的一个cache。在486的的CPU上引入了Level 2 cache的概念。那么我们就来看看L2的优点:

①提高了整个系统的性能。Internal cacheL1 cache)可以存经常用的codedata,然而L2 cache保存由于L1太小而不能保存的一些code或者data。不过这里需要说明一下的是,L1中的数据都是从L2这里来的,如果L2的大小和L1样的话,那么L2的优势就体现不出来了。如果是L2从明显比L1大了很多的话,那么优势就是很明显。(一般上十倍就差不多了。)L2能够提高系统的整体性能主要还是因为L1能够很快速地从L2取得信息。(当然这些的条件都是L1 read miss的时候。)

L2能够调整数据传输的速度。当burst transfer的时候,L2就体现出它的优势了,它能够尽量调整数据传输到最快。

③减少了总线上的活动。L1 cache里面的内容都是从L2 cache过去的,那么当我们的L2容量是L1容量的16倍(假设的)。那么L2 cache中的内容除了有L1内容的镜像之外,还有15个以前存入L1的镜像。那么这种情况下,当CPU需要从main memory获取数据的时候,就会先check L1,如果L1没有命中(hit)的话,再check L2。大多数情况下在L2中是能够hit的。这样L1L2加起来的命中率就基本上可以达到90%甚至以上了。而且这些数据都是不会在总线上产生活动了,速度也快。如果两者都没有命中的话,那么就会到main memory去操作,当然这种操作也是最慢的。

5.2 486上的两种L2 cache

486上的L2 cache可以有两种处理数据的方式,一种是Look-Through cache,还有一种就是Look-Aside cache

5.2.1 Look-Through cache

该方式将Cache隔在CPU与主存之间,CPU对主存的所有数据请求都首先送到Cache,由Cache自行在自身查找。如果命中,则切断CPU对主存的请求,并将数据送出;不命中,则将数据请求传给主存。该方法的优点是降低了CPU对主存的请求次数,缺点是(当cache没有命中的时候,)延迟了CPU对主存的访问时间。图1Look-Through cache486中的结构图

 

1 L2Look-Through cache的结构图

5.2.2 Look-Aside cache

在这种方式中,CPU发出数据请求时,并不是单通道地穿过Cache,而是向Cache和主存同时发出请求。由于Cache速度更快,如果命中,则Cache在将数据回送给CPU的同时,还来得及中断CPU对主存的请求;不命中,则Cache不做任何动作,由CPU直接访问主存。它的优点是没有时间延迟,缺点是每次CPU对主存的访问都存在,这样,就占用了一部分总线时间。(不过在读和写的时候会稍稍不太一样,写的话如果L2命中,不仅L2中的line要被更新,main的对应处的数据也会被更新。)图2Look-Aside cache486中的结构图

 

2 Look-Aside cache486中的结构图

6L2 Look-Through cache下的一系列操作

6.1 处理I/O read

processor在执行IN这条指令的时候,L2 Look-Through cache controller会检测到I/O read的一个bus 信号(486bus cycle的定义见图15),并且让系统总线重新来执行。I/O设备就会执行访问的动作,并且把数据放到总线上,并且L2 cache把这个数据交给processorI/O设备申明这个数据是有效的,L2 cache也使得RDY#有效来通知processorProcessor当探测到了RDY#有效了后,就会在下一个周期锁存住数据,并结束这个总线周期。在一个过程中,不管是L2还是L1都不会保存从I/O设备上来的数据。(笔者:我想这也是为什么I/O操作的时候比较慢的原因了。)

6.2 处理I/O write

processor在执行OUT指令的时候,会有一个I/O的系统周期。L2 cache检测到了I/O write的总线周期后,会把write的信号放到总线上重新执行。当目的设备收到了数据后,L2processor就会终止总线的这个周期了。这个过程,总的来说比较简单明了。

6.3 处理memory read

先假设一下,如果486 processorcheck L1的时候没命中,那么它会产生了一个memory read的总线周期,L2 cache controller就会check自己的目录。如果需要的数据是在L2中的,那么L2就会快速地把数据传给CPU(笔者:书上没说是传给L1,不过我觉得应该起码更新了L1。),像这样的情况就叫做L2 cache命中。如果这个数据没有在L2 cache中的话,那么L2 cache controller就会产生一个memory read的总线周期,从而来把数据从DRAM memory中读取回来。显然这样做是很慢的过程,总线上就会插入一些等待的周期在图6中就可以清楚地看到。当数据读回来以后,L2 cache就会copy一份数据到自己的cache中,并更新目录。与此同时,它还负责把数据传给processor,使得RDY#有效。当processor检测到了RDY#有效后,在接下的周期中它就会把databus上读取回来,并且也在L1中更新一下。

6.4 处理memory write

其实I/O的操作和memory的数据读取都还算比较好处理的,当遇到memory write的时候就比较麻烦点了。在写的时候就必要考虑数据的一致性问题。在486上,主要是之前提到的WTWB的操作机制来处理memory write的数据一致性。

write-through的机制下,memory write首先会提交到L1 cache这面来,L1 cachecheck是否这个memory地址的数据已经被copy到了L1中。如果是没有在L1 cache中的话,那么就会直接产生memory写的总线周期(bus cycle)了。如果是在L1 cache命中的话,那么就更新之,并做好入口和标记。做完这些之后,L1会产生一个memory write的周期,这个动作会被L2 cache controller检测到,那么L2又是以什么方式来处理数据就要分WTWB的自己了。(其实这就是说,L1 L2会被同时更新,至于WBWT的话是由L2来决定的。)

①在write-through的机制下,操作方式同L1 check数据一样。

②在write-back的机制下,L2 cache controller会先check自己的目录来看看是不是这个数据在我cache中。如果是在的,那么把这个新的数据写入到cache中,并且还不产生memory write的总线周期(也就是说不把新的数据写到Dram中去。)。取而代之的是,L2 cache的目录入口会被更新,以前的那个main memory中的数据就成了“垃圾”或者“已被修改”。这个意思就是说cache现在包含了最新的信息,DRAM memory中的数据是过时的。L2 cache controller必须要一直都监视系统总线上的memory 传输,防止过时的数据被取走了,以此来保证数据的一致性。(这里要小说一下的是,这个数据在cache中被挤出去时(比如说,当cache满了的时候,cache不再存储相对应的memory数据),那么要先把以前的数据write backmain memory中去。)

6.5 处理其他的bus mastermemory read

当其他的bus master想要读取相应的memory中的数据的时候,cache子系统为了保证数据的一致性,L2 cache也会有两种不同的机制。

6.5.1 WT机制下

 

简而言之,这种机制下,cachemain memory中的数据同步,并都是最新的。所以无论什么时候到memory中去读取到的数据都是有效的。

6.5.2 WB机制下

在这种模式下L2 cache controller就必须要去侦测总线上其他masterread memory中的数据,因为如果不侦测的话,它们去读取的有可能是过时的数据。为了防止这种情况的发生,L2 WB cache controller必须去侦测(snoop)系统总线上的read操作。那么L2 cache controller就必须要有下面两个功能:

①提供信息给bus master并且通知DRAM controller刚刚那个读的操作无效。

②关闭master,因为memory read的周期马上就要被暂停一下,并且把自己cache中的数据写入到memory中去。当打开master了以后,bus master仍然会继续从memory中去读取数据,然而这个时候的数据已经是有效的了。

6.6 处理其他bus masterwrite

写的操作一般都比读的操作要复杂点。尤其是要保证数据的一致性。想想,如果其他的bus master执行了一个写入到memory的操作后,那么其他的cache里面的数据就是“过时”的数据了,为了避免这种情况的发生,L2 cache controller就到了关键的作用。L2 cache的机制也就决定了数据的一致性方式。

6.6.1 WT机制下

在这个机制下,L2 cache一直会去侦测总线上的write的操作。并且它会有以下的动作。

①标识相应的目标memory地址处的数据位无效(如果这个地址的数据确实是在cache中)。

②自动更新所对应的数据,(就是之前说的snarf机制),整个这个过程就叫做侦测命中。(snoop hit

6.6.2 WB机制下

在这个机制下,L2 cache controller同样会侦测总线上其他bus master对内存的写操作。在这种情况下,让我们先看看潜在的问题:

由于L2 cache(假设不是WT的属性),那么就有这样的可能,在L2 cacheline中存储了将要写的这个内存中的数据,但是,在L2 cache中的标记却是dirty的(相比之下,line中的数据又要比内存中的数据稍微新一点,只是被存在了cache中的line里还没有被写回罢了。)。在这种情况下,现在要写的bus master如果把数据写入了内存中去,(现在实际内存中的数据是最新的,而L2 cache中的数据是过时的。)那么就会有潜在的问题是,这个过时的L2 cache中的数据会被重新写入到内存中,(也就是说过时的数据被写到内存中去了。)。

为了解决上面的这个问题,有两种方法来做:

①当L2 cache controller侦测到了有写的动作的时候(snoop hit),(而且L2 中也有一个dirty line)那就snarf这个数据。因此就会自动的更新这个cache中的line。但是dirty的标志位照样不变,虽然表面上L2 cache确实也表示着它自己cache里的这个line里的数据是过时的,但实际上是最新的数据,那么如果有这种可能写回内存的话,也是不会有问题的。

L2 cache有强制关掉bus master(进行写操作)的优先级和能力,该cache终止bus去执行memory write,同时把自己的cache line里的数据全部写回到memory中去。在cache目录里,该cache line就会成无效状态。然后L2 cache再打开bus masterbus master继续完成它的写操作。这个时候memory里面的数据就是最新的数据了。


7、总线侦测(snoop)的过程

bus master必须要用L2 cache的总线去和其他的设备通信的时候,L2 cache必须释放bus的控制权。当L2 cache交出了总线的控制权了以后,L2 cache就继续侦测总线。当然,侦测的内容就是总线上是否有写数据到DRAM,并且check这个数据是否在自己的cache line

如果memory write被侦测到了,bus masterL2 cache controller会先check是不是要写入数据到DRAM中去。如果这个数据要写到DRAM中去,其他的L2 cache check了自己的目录后,(如果发现了这个将要修改的内存数据在自己的cache)还要通知L1 cache修改相应的目录。AHOLDEADS#

抱歉!评论已关闭.