1. 程式人生 > >自己學驅動15——Cache

自己學驅動15——Cache

1.Cache簡介
    同樣是基於程式訪問的區域性性,在主存和CPU通用暫存器之間設定一個高速的、容量相對較小的儲存器,把正在執行的指令地址附近的一部分指令或資料從主存調入這個儲存器,供CPU在一段時間內使用,這對提高系統的效能很有幫助。這個位於主存和CPU之間的高速小容量儲存器稱作高速緩衝器(Cache)。
    啟用Cache之後,CPU讀取資料時,如果Cache中有這個資料的副本則直接返回,否則從主存中讀入資料,並存入Cache中,下次讀取這個資料時,可以直接使用Cache中的副本。

2.Write Through模式與Write Back模式

    啟用Cache之後,CPU寫資料時有Write Through和Write Back兩種方式。
    (1)Write Through模式
    任一從CPU發出的寫訊號送到Cache的同時,也寫入主存,以保證主存的資料能夠同步的更新。這種方法的特點是操作簡單,但由於主存速度相對較低,所以降低了系統的寫速度並且佔用了較多的匯流排時間。
    (2)Write Back模式
    資料一般只寫到Cache,這樣有可能出現Cache中資料得到更新而主存中的資料不變的情況,當Cache中的資料被換出或者強制進行"清空"操作時,才將更新的資料寫入主存相應的單元中。

3.Cache的兩個操作

    (1)"清空":把Cache或Write buffer中已經更新過的資料寫入主存。
    (2)"使無效":是之不能再使用,並不將更新過的資料寫入主存。

4.2440內建的指令Cache、資料Cache和寫快取(Write buffer)
    (1)指令Cache(ICaches)
     ICaches的使用比較簡單,系統剛上電或復位時,ICaches中的內容是無效的,並且ICaches功能是關閉的。往Icr(CP15協處理器暫存器1中的第12位)寫1可以啟動ICaches,寫0可以停止使用ICaches。
    ICaches一般在MMU開啟之後被使用,此時頁表描述符中的C位(Ctt)用來表示一段記憶體是否可以被Cache。但是即使MMU沒有開啟,ICaches也是可以被使用的,這時CPU讀取指令時所涉及的記憶體都被當做是允許Cache的。ICaches被關閉時,CPU每次讀取指令都要讀取主存,效能非常低,所以應儘早啟動ICaches。
    ICaches被開啟後,CPU每次讀取指令時都會先在ICaches中檢視是否能夠找到所需要的指令,而不管Ctt是0或1。ICaches開啟後,CPU的讀取指令分為如下3種情況:
    A.Cache命中且Ctt為1(Ctt=1表示允許被Cache),從ICaches中讀取指令,返回CPU。
    B.Cache缺失且Ctt為1,CPU從主存中讀取指令。同時會將指令所在區域的8個word寫入某個ICaches條目中,替換演算法使用Pseudo-random或round-robin演算法,具體可以用CP15中的暫存器1的1位來確定使用哪種替換演算法。
    C.Ctt為0時,CPU從主存讀取指令。
    (2)資料Cache(DCaches)
    系統上電或復位時預設DCaches是關閉的,Write buffer中的內容也是無效的。往Ccr位(CP15協處理器暫存器1的12位)寫1可以啟動DCaches,寫0關閉DCaches。Write buffer與DCaches緊密結合,沒有專門的控制位來開啟或停止它。
    DCaches必須在MMU開啟會後才能使用,因為開啟MMU之後才能使用頁表中的描述符來定義一塊記憶體如何使用DCaches和Write buffer。
    DCaches被關閉後,CPU每次讀寫資料都要操作主存,DCaches和Write buffer被完全忽略。DCaches開啟後,CPU每次讀寫資料都會先在DCaches中檢視是否能找到所需要的資料,而不管Ctt是0還是1。

5.Cache和主存的對映

    Cache和主存之間的對映方法大致為三種:全相聯對映、直接相聯對映和組相聯對映。Cache和主存都被劃分為同樣大小的塊,以下假設主存被劃分為300(1~300)塊,Cache被劃分為10(1~10)塊做說明。
    (1)全相聯對映
    主存中1~300中的任一塊的塊可以對映到Cache1~10中的任一塊,這種方法的特點是簡單,但是查詢效率低。
    (2)直接相聯對映
    假設主存中1~30塊只能對映到Cache的1號塊中,依次類推。這樣相比全相聯查詢效率高,根據VA很快可以獲取查詢結果(命中或缺失)。
    (3)組相聯對映
    直接相聯對映在處理抖動時會出現頻繁的置換Cache,即主存中1、2、3號記憶體被交替訪問時,將會出現不停的置換Cache中的1號塊。組相聯結合全相聯和直接相聯的特點,將Cache分為大塊(大塊使用直接相聯),小塊使用全相聯,可以有效的避免抖動訪問帶來的影響。

6.2440的MMU、TLB及Cache控制指令

    2440的協處理器也是一個微處理器,用來幫助主CPU完成一些特殊功能,比如浮點計算等。對於MMU、TLB和Cache的操作就涉及到協處理器。CPU核和協處理器之間傳送資料時使用這兩條指令:MRC和MCR,它們的格式如下:
    <MCR|MRC> {cond} p#,<expression1>,Rd,cn,cm{,<expression2>}
    MCR:從協處理器獲得資料傳遞給CPU核
    MRC:從CPU核獲取資料傳遞給協處理器
    {cond}:執行條件,省略時表示無條件執行
    p#:協處理器序號
    <expression1>:常數1
    Rd:CPU核暫存器
    cn和cm:協處理器中的暫存器
    <expression2>:常數2

7.Cache操作注意點
    與TLB類似,使用Cache時需要保證Cache、Write buffer的內容和主存的內容保持一致,需要遵循以下兩個原則:
    (1)清空DCaches,使得主存資料得到更新。
    (2)清空ICaches,使得CPU讀取指令時重新讀取主存。
    在實際編寫程式時,要注意以下幾點:
    (1)開啟MMU前,使無效ICaches、DCaches和Write buffer。
    (2)關閉MMU前,清空ICaches、DCaches,即將更新過的資料寫入主存。
    (3)如果程式碼右邊,使無效ICaches,這樣CPU取指令時會重新讀取主存。
    (4)使用DMA操作可以被Cache的記憶體時:將記憶體的資料傳送出去時,要清空Cache;將記憶體的資料讀入時,要使無效Cache。
    (5)改變頁表中地址對映關係時也要慎重考慮。
    (6)開啟ICahces或者DCaches時,要考慮ICahces或者DCaches中的內容與主存是否一致。
    (7)對於I/O地址空間,不使用Cache和Write buffer。所謂I/O地址空間,就是對於其中的連續兩次的寫操作不能合併在一起,每次讀/寫都必須是直接訪問裝置,否則程式的執行結果無法預料。