ARM的cache和寫緩衝器(write buffer)

一、cache簡介
        通常CPU與外部主存之間的訪問速度差距很大,因爲外部主存的低速率讀寫而降低了CPU的執行效率,所以引入了高速緩衝存儲器cache,cache存儲器是一種容量小,速度快的存儲器。其實cache說到底就是一塊速度非常快的內存。
        而cache經常與寫緩衝器(write buffer)一起使用,使用writer buffer的目的是,將處理器和cache從較慢的對主存的寫操作中脫離出來。

下圖是一個計算機系統結構中的存儲器分層結構,更好的顯示了cache和寫緩衝器在存儲層次結構中所處的位置。
        從圖中可以看出,凡是從cache中向主存中寫入數據時都需要經過寫緩衝器。

下圖顯示了有cache的系統和沒有cache的系統之間的差別:



cache和存儲管理單元:
        cache可以在放在處理器內核與MMU之間,也可以放在MMU與物理存儲器之間。
        在處理器和MMU之間的cache稱爲邏輯cache,邏輯cache在虛擬地址空間存儲數據,處理器可以直接通過cache訪問數據,而無需通過MMU。邏輯cache又稱爲虛擬cache。
        在MMU與物理存儲器之間的cache稱爲物理cache,當處理器訪問存儲器時,MMU必須先把虛擬地址轉換成物理地址,cache存儲器纔可以向處理器內核提供數據。
下圖是兩中cache:
     


二、cache結構

      1、cache結構

     圖12.4是一個4KB大小的cache存儲器,這個cache存儲器分爲256行,每行由三部分組成:目錄存儲段,狀態信息段數據項段

目錄存儲段:用來記錄每個cache行所對應的主存中的地址,即告訴cache這個行裏存放的數據時從主存的什麼地方拷貝進來的。這個目錄項裏的數據被稱爲“cache標籤”
狀態信息段:用來記錄狀態信息的狀態位,兩個常見的狀態信息位有效位(valid   bit)髒位(dirty  bit)。有效位用來標記當前的cache行是活動的,即當前的cache行已經存放了從主存中取得的數據,並且可以被處理器所使用。髒位用來標記該cache行中所含的內容是與主存中的內容是否一致,即該cache行中的數據已經被改變,但還沒有被寫回到主存中,主存中的數據還是舊的數據。
數據項段:從主存中拷貝來的數據放在數據項段

這個cache存儲器擁有4KB的大小,被分成256行,而每行所佔的大小爲4個字(16字節)大小,所以爲4KB。注意cache標籤狀態信息位所佔的空間並不計算在內。
以上就是一個cache存儲器的結構,詳細看下圖12.4:

        2、cache控制器的基本操作

cache控制器是用來控制cache的,它將主存中的數據或代碼自動拷貝到cache存儲器中,搬移工作自動完成。
        當CPU訪問主存時,在請求被髮送到存儲控制器之前,主存地址會被cache控制器攔截,然後cache控制器將要訪問的地址分爲三個部分:標籤域,組索引域數據索引域
         注:cache存儲器中的一行是對應很多個主存地址的。如圖12.5中一行對應了1MB的主存地址空間

組索引:用來確定某一個cache行。因爲一共有256個行,而組索引寬度是8位,所以正好查找一個cache行。
標籤:    其實就是用來確定當前要訪問的主存地址是否已經被緩存到了所找到的cache行中。如果該標籤與cache行中存放的cache標籤的值相等,且該cache行是活動的,則cache命中,否則失效。
數據索引:確定要訪問該cache行中的哪一個數據。

      當組索引確定好某個cache行後,cache控制器便會檢查該行的有效位,如果當前cache行是有效的,即處於活動狀態,並且標籤域的值與cache標籤相等,則說明要訪問的主存地址中的數據已經被緩存到了該cache行中,cache命中。
        否則cache失效,這時,cache控制器從要訪問的主存地址中拷貝整個cache行的數據大小到cache存儲器中。這種拷貝操作稱爲cache行填充
         在cache命中的情況下,控制器直接從cache存儲器中得到數據。使用數據索引在當前cache行中選擇實際的要獲得的數據或指令。


詳細請看下圖12.5:
    

         

    cache的映射方式有三種:直接映射,組相聯映射全相聯映射
  •   直接映射
        上圖12.5便是一個直接映射的顯示,在直接映射cache中,由於主存的容量要遠遠大於cache的容量,所以爲了讓大容量的主存能夠全部映射到小容量的cache中,往往是主存中的多個地址對應cache中的一行。在上圖12.5的例子中行,組索引的值爲0x82,於是便找到了cache存儲器中對應的一個cache行。
         注意,因爲這一個cache行對應了多個主存地址,在本例中一個cache行對應了1M的主存地址範圍,而在任一時刻,該cache行只能對應着1M地址範圍中的一個主存地址,所以要用標籤再確定該cache行中具體的一個主存地址。用cache行中的cache標籤與標籤域中的標籤比較,如果相等,則cache命中,然後便對該cache行進行讀寫操作。如果不相等,則cache失效,那麼這個cache行的整個數據會被刪除,並替換爲CPU要訪問的主存地址的內容同時也將數據送到處理器中,這個過程稱爲替換。
    
  • 組相聯映射
       直接映射雖然簡單方便,但是如果程序同時用到了對應於同一個cache行中的兩個主存地址,那麼就會發生衝突,結果就是導致這個cache行不停的進行替換操作。所以就有了組相聯映射。
       組相聯映射將這cache存儲器中的256個行分爲了4路,每路有64個cache行。這時根據組索引找到的 cache行不再是一個,而是同時找到 4個 cache行,所以才被稱爲組索引每路中包含一個cache行。如下圖12.7所示,便是一個組相聯映射的cache。
        因爲現在每路中有 64 個 cache 行,所以組索引的寬度變成了6位,而標籤域的標籤寬度變成了12位
        直接映射中組索引一次只能對應一個cache 行,而現在組相聯映射中組索引一次能對應4個cache行,所以現在主存中的一個地址可以存放到4個cache行中的任意一行。 而在直接映射中,主存中的一個地址只能存放到對應的一個cache行中。所以一個cache行被替換的概率減少爲原來的四分之一。
一個組相聯映射的實例:

  • 全相聯映射
  隨着cache的相聯度提高,衝突的可能性小了。理想的目標是,儘量提高組相聯程度,使主存中的一個地址能夠映射到cache存儲器中的任意的cache行,這樣的映射關係被稱爲全相聯映射。

        簡單來說直接映射可以看成是一個只有1路的組相聯映射,每路有256個cache行。
     上面的組相聯映射有4路,每路有64個cache行。
  而全相聯映射有很多路,每路中只有一個cache行。
下圖是一個64路的組相聯映射:


三、寫緩衝器

  寫緩衝器是一個非常小的告高速存儲緩衝器,用來臨時存放處理器將要寫入到主存中的數據,在沒有寫緩衝器的系統中,處理器直接寫數據到主存中。在帶有寫緩衝器的系統中,cache直接將數據先寫到寫緩衝器中,然後寫緩衝器再以低速寫入主存中。這就將高速的CPU和cache從對主存的低速讀寫中脫離了出來。
     寫緩衝器同時還改善了cache的性能,這體現在cache行被替換時。當cache控制器要替換出一個髒的cache行時,它只將該cache行中的數據放入寫緩衝器中,而不寫入主存。這樣就可以快速填充新的cache行數據,處理器就可以繼續從cache存儲器中讀/寫數據。
     寫緩衝器中的數據在沒有被寫入主存之前,是不能被讀取的。同樣,被替換的cache行在寫緩衝器中時也不能進行讀操作。這也是爲什麼寫緩衝器的深度通常比較小的原因之一,一般只有幾個cache行的深度。


四、cache策略
       有3種可以決定cache操作的策略:寫策略,替換策略和分配策略,寫策略決定了處理器執行寫操作時數據存放的位置。替換策略在cache失效的情況下,決定選擇替換出哪一路的cache行。分配策略決定cache控制器在何時將要分配cache行。
           
  • 寫策略
    直寫法:
    如果cache使用直寫策略,那麼CPU在cache命中時,將同時修改cache和主存中的內容,以確保cache和主存中數據一致性。在這種策略下,CPU在每次寫cache時也要寫相應主存單元。由於要訪問主存,直寫法的速度比回寫法要慢一些。
    
    回寫法:
    如果cache使用回寫策略,那麼CPU在cache命中時,只向cache存儲器中寫數據,而不立即寫入主存。這樣,主存地址與相應的cache行數據有可能不一致。cache中的數據時最新的,而主存中的數據可能是較早的,還沒有被更新過。    
    配置成回寫法的cahche要使用到cache行的狀態信息段中的一個或多個髒位(dirty bit)。當向cache存儲器中某一行寫入數據時,他會將髒位設置爲1。如果此後訪問該cache行,那麼通過髒位就可以知道cache中含有主存中沒有的數據。如果一個髒位被置位的cache行要被替換,那麼該cache行中的數據會被自動的先寫入到相應的主存單元中,以防止主存中的信息丟失。

  • 替換策略
         替換策略用於選擇要替換cache行中的數據,應該替換哪個cache行。總的來說,組索引在各個way(路)中選擇可用的一組cache行,而替換策略決定在該組中哪一路中的cache行會被新的數據替換。
    
        輪轉法:
        簡單地將當前分配的cache行的下一行作爲被替換的行。
    
        僞隨機替換法:
        從特定的位置上隨機地選出一行替換出去。

        大多數ARM核兩種策略都支持,相比之下,輪轉法有更好的可預測性。然而,輪轉法在存儲器訪問發生很小的變化時,有可能照成cache性能有較大的變化。

  • 分配策略
        在cache失效發生時,ARM的cache可以採取兩種策略來分配cache行:讀操作分配策略,讀寫操作分配策略。

        讀操作分配策略:
           在進行存儲器寫操作時,如果cache未命中,只是簡單的將數據寫入到主存中,而不寫到cache中,如果cache命中,纔會將數據寫到cache中。但是在進行存儲器讀操作時,如果沒有命中,則會替換cache行中的內容。

        讀寫操作分配策略:
            當進行存儲器寫操作時,如果cache未命中,cache控制器會將要訪問的主存地址中的數據讀到cache行中,並執行寫操作,將數據寫入到cache中。


五、清理和清除cache
ARM使用清理清除表示對cache的兩種基本操作。

        清理就是把髒的(即被改寫過的)cache行強制寫到主存,並把cache行中的髒位清零。清理cache可以重建cache和主存之間的一致性,它只是用在回寫策略的D-cache上。
         清除就是指清除cache中存儲的全部數據,其實就是將cache使無效,將cache行中的有效位清零,讓所有訪問這個cache行的操作都不命中。
        
        對cache進項清理和清除的操作是通過協處理器CP15中的寄存器C7實現的,具體操作指令看CP15協處理器寄存器詳解。









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