對大量典型程序運行情況的分析結果表明,在一個較短的時間間隔內,由程序產生的地址往往集中在存儲器邏輯地址空間的很小范圍內。指令地址的分布本來就是連 續的,再加上循環程序段和子程序段要重復執行多次。
Cache的基本結構 DCACHE ARM cache架構由cache存儲器和寫緩沖器(write-buffer)組成,其中寫緩沖器是CACHE按照FIFO原則向主存寫的緩沖處理器。 一般來說CACHEABILITY和BUFFERABILITY都是可以配置的,所以,一塊存儲區域可以配置成下面4種方式:NCNB CNB NCB CB。 在實際應用當中,可以根據需要對主存進行配置。對I/O MAP來說,一般都需要采用NCNB方式,以保證對I/O的正確操作。而其他的存儲區域一般都可以配置成CB方式,以獲取最好的性能。 引入CACHE和WRITE BUFFER是為了提高存儲訪問的 速度,提供系統性能。如果CACHE打開的話,CPU讀寫主存的時候,都是通 DCaches使用的是虛擬地址,它的大小是16KB,它被分成512行(entry),每行8個字(8 words,32Bits)。每行有兩個修改標志位(dirty bits),第一個標志位標識前4個字,第二個標志位標識后4個字,同時每行中還有一個TAG 地址(標簽地址)和一個valid bit。 從上面的表格中我們可以清楚的知道系統什么時候使用的是DCaches,什么時候使用的是Write Buffer,我們也可以看到DCaches的寫回方式是怎么決定的(write-back or write-througth)。 情況1(Ctt =0, Ccr=0):這種情況下CPU的DCaches功能是關閉的(Ccr=0),所以CPU存取數據的時候不會從DCaches里進行數據地查詢,CPU直接去內存存取數據。 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是怎么通過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對主存的請求,並將數據送出;不命中,則將數據請求傳給主存。 寫穿式(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,地址僅需比較一次。 |