|
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,以備下次訪問。
Cache的基本結構
Cache通常由相聯儲存空間實現。相聯儲存空間的每一個儲存塊都具有額外的儲存資訊,稱為標籤(Tag)。當訪問相聯儲存空間時,將地址和每一個標籤同時進行比較,從而對標籤相同的儲存塊進行訪問。Cache的3種基本結構如下:
DCACHE
ARM cache架構由cache儲存空間和寫緩衝器(write-buffer)組成,其中寫緩衝器是CACHE按照FIFO原則向主存寫的緩衝處理器。
一般來說CACHEABILITY和BUFFERABILITY都是可以配置的,所以,一Block Storage地區可以配置成下面4種方式:NCNB CNB NCB CB。 在實際應用當中,可以根據需要對主存進行配置。對I/O MAP來說,一般都需要採用NCNB方式,以保證對I/O的正確操作。而其他的儲存地區一般都可以配置成CB方式,以擷取最好的效能。
引入CACHE和WRITE BUFFER是為了提高儲存訪問的 速度,提供系統效能。如果CACHE開啟的話,CPU讀寫主存的時候,都是通
過CACHE進行的。進行讀操作的時候,如果在CACHE裡面找到了所需的內容 (CACHE HIT),直接從CACHE裡讀取;如果要讀的內容不在CACHE上的時候 (CACHE MISS),先把所需的內容裝載到CACHE裡,在從CACHE上讀取。進行 寫操作的時候,資料先寫到CACHE上。具體又可以分為WRITE THROUGH和 WRITE BACK兩種方式。如果是WRITE THROUGH方式的話,每次寫操作都通
過CACHE+WRITE BUFFER把資料直接寫到主存當中去;如果是WRITE BACK 方式的話,資料最初只是寫到CACHE上,必要的時候(CACHE REPLACEMENT) 在將CACHE上的資料通過WRITE BUFFER實際回寫到主存當中去。
DCaches使用的是虛擬位址,它的大小是16KB,它被分成512行(entry),每行8個字(8 words,32Bits)。每行有兩個修改標誌位(dirty bits),第一個標誌位標識前4個字,第二個標誌位標識後4個字,同時每行中還有一個TAG 地址(標籤地址)和一個valid bit。
與ICaches一樣,系統上電或重起(Reset)的時候,DCaches功能是被關閉的,我們必須往Ccr bit置1去開啟它,Ccr bit在CP15副處理器中控制寄存器1的第2位(關閉DCaches功能則是往該位置0)。與ICaches不同,DCaches功能是必須在MMU開 啟之後才能被使用的。
我們現在討論的都是DCaches,你可能會問那Write Buffer呢?他和DCaches區別是什麼呢? 其實DCaches和Write Buffer兩者間的操作有著非常緊密的聯絡,很抱歉,到目前為止我無法說出他們之間有什麼根本上的區別(-_-!!!),但我能告訴你什麼時候使用的是 DCaches,什麼時候使用的是Write Buffer.系統可以通過Ccr bit對Dcaches的功能進行開啟與關閉的設定,但是在s3c2410中卻沒有確定的某個bit可以來開啟或關閉Write Buffer… 你可能有點懵…我們還是來看一張表吧,這張表說明了DCaches,Write Buffer和CCr,Ctt (descriptor中的C bit),Btt(descriptor中的B bit)之間的關係,其中“Ctt and Ccr”一項裡面的值是 Ctt與Ccr進行邏輯與之後的值(Ctt&&Ccr).
從上面的表格中我們可以清楚的知道系統什麼時候使用的是DCaches,什麼時候使用的是Write Buffer,我們也可以看到DCaches的寫回方式是怎麼決定的(write-back or write-througth)。
在這裡我要對Ctt and Ccr=0進行說明,能夠使Ctt and Ccr=0的共有三種情況,分別是
Ctt =0, Ccr=0
Ctt =1, Ccr=0
Ctt =0, Ccr=1
我們分別對其進行說明。
情況1(Ctt =0, Ccr=0):這種情況下CPU的DCaches功能是關閉的(Ccr=0),所以CPU存取資料的時候不會從DCaches裡進行資料地查詢,CPU直接去記憶體存取資料。
情況2(Ctt =1, Ccr=0):與情況1相同。
情況3(Ctt =0, Ccr=1):這種情況下DCaches功能是開啟的,CPU讀取資料的時候會先從DCaches裡進行資料地查詢,若DCaches中沒有合適的資料, 則CPU會去記憶體進行讀取,但此時由於Ctt =0(Ctt 是descriptor中的C bit,該bit決定該descriptor所描述的記憶體地區是否可以被Cache),所以CPU不會把讀取到的資料Cache到DCaches(不發生 linefill).
到此為止我們用兩句話總結一下DCaches與Write Buffer的開啟和使用:
1.DCaches與Write Buffer的開啟由Ccr決定。
2.DCaches與Write Buffer的使用規則由Ctt和Btt決定。
ICACHE
當系統上電或重起(Reset)的時候,ICaches功能是被關閉的,我們必須往lcr bit置1去開啟它,lcr bit在CP15副處理器中控制寄存器1的第12位(關閉ICaches功能則是往該位置0)。ICaches功能一般是在MMU開啟之後被使用的(為了 降低MMU查錶帶來的開銷),但有一點需要注意,並不是說MMU被開啟了ICaches才會被開啟,正如本段剛開始講的,ICaches的開啟與關閉是由 lcr bit所決定的,無論MMU是否被開啟,只要lcr bit被置1了,ICaches就會發揮它的作用。
大家是否還記得discriptor(描述符)中有一個C bit我們稱之為Ctt,它是指明該描述符描述的記憶體地區內的內容(可以是指令也可以是資料)是否可以被Cache,若Ctt=1,則允許Cache,否 則不允許被Cache。於是CPU讀取指令出現了下面這些情況:
如果CPU從Caches中讀取到所要的一條指令(cache hit)且這條指令所在的記憶體地區是Cacheble的(該地區所屬描述符中Ctt=1),則CPU執行這條指令並從Caches中返回(不需要從記憶體中讀取)。
若CPU從Caches中讀取不到所要的指令(cache miss)而這條指令所在的記憶體地區是Cacheble的(同第1點),則CPU將從記憶體中讀取這條指令,同時,一個稱為“8-word linefill”的動作將發生,這個動作是把該指令所處地區的8個word寫進ICaches的某個entry中,這個entry必須是沒有被鎖定的 (對鎖定這個操作感興趣的朋友可以找相關的資料進行瞭解)
若CPU從Caches中讀取不到所要的指令(cache miss)而這條指令所在的記憶體地區是UnCacheble的(該地區所屬描述符中Ctt=0),則CPU將從記憶體讀取這條指令並執行後返回(不發生linefill)
通過以上的說明,我們可以瞭解到CPU是怎麼通過ICaches執行指令的。你可能會有這個疑問,ICaches總共只有512個條目(entry),當 512個條目都被填充完之後,CPU要把新讀取近來的指令放到哪個條目上呢?答案是CPU會把新讀取近來的8個word從512個條目中選擇一個對其進行 寫入,那CPU是怎麼選出一個條目來的呢?這就關係到ICaches的替換法則(replacemnet algorithm)了。 ICaches的replacemnet algorithm有兩種,一種是Random模式另一種Round-Robin模式,我們可以通過CP15副處理器中寄存器1的RR bit對其進行指定(0 = Random replacement 1 = Round robin replacement),如果有需要你還可以進行指令鎖定(INSTRUCTION CACHE LOCKDOWN)。
虛擬cache
Cache 位於MMU前面靠近CPU稱為邏輯CACHE又叫虛擬Cache。CPU可以直接存取CACHE的資料,而ARM 11(ARMV6)的結構是CACHE 在MMU後面CPU訪問CACHE要通過MMU地址轉換
在DM6446的core用的是哈佛結構,即把CACHE分為8K的D-CACHE(資料CACHE)和16K的I-cache(指令CACHE)
一個完整的CACHE分為CACHE控制器和CACHE儲存空間
例子
Davinci DM6446 D-cache行應為512行 ,cache儲存空間主要分為三個部分:目錄存放段(driectory-story),狀態資訊段(status information)和資料項目段(data section)每一行cache都包括這三部分。Cache用目錄存放段來儲存主存的地址,資料項目段存放的是主存的資料,在cache中用狀態資訊段來 選項組資訊,其中v表示有效位,d表示髒位,有效位記錄當前cache行是活動的,cache行的資料和主存中的資料是一致的,處理器可以讀取。髒位則 表示cache行的資料和主存中的資料不一致。
在讀寫請求到達儲存空間前會被CACHE捕獲,cache儲存空間將該請求分成三部分標籤,組索引和資料索引域,cache通過組索引域確定可能包含地 址和資料cache的行,cache儲存空間檢查匹配的CACHE 行的狀態標籤,如果是V表示(cache hit)命中,否則cache失效(cache miss)在cache失效時從主存吧cache行考到CACHE儲存空間
主存中的部分內容存放在cache中的最簡單方式是直接映射,在一個直接映射中,主存的地址唯一對應cache行,因為主存容量很大所以主存的很多地址映射到同一個cache行
見:
在DM6446 中記憶體為128M (bootargs 設為128M)8K的D-CACHE則128×1024/8 = 16384映射一個cache行。由於cache的速度大大大於低速的主存速度,因此需要寫緩衝器。
Cache與DRAM存取的一致性
在CPU與主存之間增加了Cache之後,便存在資料在CPU和Cache及主存之間如何存取的問題。讀寫各有2種方式。
貫穿讀出式(Look Through)
該方式將Cache隔在CPU與主存之間,CPU對主存的所有資料請求都首先送到Cache,由Cache自行在自身尋找。如果命中,則切斷CPU對主存的請求,並將資料送出;不命中,則將資料請求傳給主存。
該方法的優點是降低了CPU對主存的請求次數,缺點是延遲了CPU對主存的訪問時間。
旁路讀出式(Look Aside)
在這種方式中,CPU發出資料請求時,並不是單通道地穿過Cache,而是向Cache和主存同時發出請求。由於Cache速度更快,如果命中,則 Cache在將資料回送給CPU的同時,還來得及中斷CPU對主存的請求;不命中,則Cache不做任何動作,由CPU直接存取主存。
它的優點是沒有時間延遲,缺點是每次CPU對主存的訪問都存在,這樣,就佔用了一部分匯流排時間。
寫穿式(Write Through)
任一從CPU發出的寫訊號送到Cache的同時,也寫入主存,以保證主存的資料能同步地更新。
它的優點是操作簡單,但由於主存的慢速,降低了系統的寫速度並佔用了匯流排的時間。
回寫式(Copy Back)
為了克服貫穿式中每次資料寫入時都要訪問主存,從而導致系統寫速度降低並佔用匯流排時間的弊病,盡量減少對主存的訪問次數,又有了回寫式。
它是這樣工作的:資料一般唯寫到Cache,這樣有可能出現Cache中的資料得到更新而主存中的資料不變(資料陳舊)的情況。但此時可在Cache 中設一標誌地址及資料陳舊的資訊,只有當Cache中的資料被再次更改時,才將原更新的資料寫入主存相應的單元中,然後再接受再次更新的資料。這樣保證了 Cache和主存中的資料不致產生衝突。
ARM cache 策略
Cache的寫策略分為直寫策略和回寫策略。同時向cache行和相應的主存位置寫資料,同時更新這兩個地方的資料的方法稱為直寫策略 (writethrough),把資料寫入cache行,不寫入主存的或者只有當cache被替換時或清理cache行時才寫入主存的策略稱為回寫策略 (writeback)。採用回寫策略時,當處理器cache命中,只向cache儲存空間寫資料,不寫入主存,主存裡的資料就和cache裡不一 致,cache裡的資料是最新的,主存裡的資料是早前的。這就用cache儲存空間資訊狀態標誌位了,當向cache儲存空間裡某行寫資料時,置相應行的資訊 標誌髒位為1,那麼主控制器下次訪問cache儲存空間就知道cache裡有主存沒有的資料了,把資料寫回到主存中去。
當一個cache訪問失效時,cache控制器必須從當前有效行中取出一個cache行儲存從主存中取到的資訊,被選中替換的cache行稱為丟棄者,如 果這個cache行中髒位為1則應把該cache行中的資料回寫到主存中,而替換策略決定了那個cache行會被替換,在arm926ejs中ARM支援 兩種策略:輪轉策略和偽隨機策略。輪轉策略就是取當前cache行的下一行,偽隨機策略是控制器隨機產生一個值。
當cache失效時,ARM採取兩種方式分配cache行,一種是讀操作(read-allocate)還有一種是讀-寫分配策略(read- write-allocate),當cache未命中時對於讀操作策略,在對cache儲存空間讀操作時才會分配cache行
全相聯Cache
在全相聯Cache中,儲存的塊與塊之間,以及儲存順序或儲存的儲存空間地址之間沒有直接的關係。程式可以訪問很多的子程式、堆棧和段,而它們是位於主儲存空間的不同部位上。
因此,Cache儲存著很多互不相關的資料區塊,Cache必須對每個塊和塊自身的地址加以儲存。當請求資料時,Cache控制器要把請求地址同所有地址加以比較,進行確認。
這種Cache結構的主要優點是,它能夠在給定的時間內去儲存主存器中的不同的塊,命中率高;缺點是每一次請求資料同Cache中的地址進行比較需要相當的時間,速度較慢。
直接映像Cache
直接映像Cache不同於全相聯Cache,地址僅需比較一次。
在直接映像Cache中,由於每個主儲存空間的塊在Cache中僅存在一個位置,因而把地址的比較次數減少為一次。其做法是,為Cache中的每個塊位置分配一個索引欄位,用Tag欄位區分存放在Cache位置上的不同的塊。
單路直接映像把主儲存空間分成若干頁,主儲存空間的每一頁與Cache儲存空間的大小相同,匹配的主儲存空間的位移量可以直接映像為Cache位移量。Cache的Tag儲存空間(位移量)儲存著主儲存空間的頁地址(頁號)。
以上可以看出,直接映像Cache優於全相聯Cache,能進行快速尋找,其缺點是當主儲存空間的組之間做頻繁調用時,Cache控制器必須做多次轉換。 組相聯Cache
組相聯Cache是介於全相聯Cache和直接映像Cache之間的一種結構。這種類型的Cache使用了幾組直接映像的塊,對於某一個給定的索引號,可以允許有幾個塊位置,因而可以增加命中率和系統效率。 |