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

 

【我所認知的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#兩個pin就是用來起這個作用的。詳細操作見後續文章。


8L2 Look-Aside cache下的一系列操作

正如圖2所示,look-aside cache486架構中的抽象圖,L2只是在一旁look,一直都snoop總線上的readwrite動作,並且及時地與自己的目錄check

在這種情況下,當L2 read miss的時候,L2不會有任何的動作。(這就和之前的look through就不太一樣了哦。)當L2讀命中(read hit)的時候,那麼L2 cache就迅速地把數據傳遞給processor,並終止read的操作了。

L2 write miss的時候,L2也不會有任何的動作。Processor就直接在bus上使能write cycle的信號了,從而把數據直接更新到DRAM中去。然而如果L2 cache write hit發生的話,processor同樣會無干擾地把數據更新到main memory中去,同時L2 cacheline也被更新。簡而言之,此時(write hit的時候)的L2就相當於是write-through的特性。

發佈了61 篇原創文章 · 獲贊 11 · 訪問量 77萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章