1. 程式人生 > >ARM cortex-A9 的L2 Cache lockdown

ARM cortex-A9 的L2 Cache lockdown

    在ARM cortex-A9雙核平臺上開發,有一段中斷服務程式碼要求執行時間儘量短,而且時間可預測。

   首先想到的是gcc編譯器的優化選項,使用推薦的O2選項,執行時間還是不太理想。

   為了進一步優化時間,對原始碼結構進行調整,同時把耗時的操作放到另外一個CPU處理,時間縮短了很多。

   最後想到了L2 Cache的lockdown特性,就把這個也使用上了。

   ARM cortex-A9雙核平臺有2級cache,32k 的L1 Icache 和Dcache,以及512K的L2 Cache,L1 Cache不能被lockdown,只能對L2 cache進行處理了。

    先介紹下cache的工作原理:

傳送門:

 cache和write buffer

http://blog.csdn.net/yubingjunj/article/details/5063195

Cache是一種容量小、速度快的儲存器陣列,它位於主存和處理器核心之間,儲存著最近一段時間處理器涉及到的主存塊內容,主要是為了緩解慢速儲存器和處理器之間的速度不匹配造成的訪問瓶頸問題。write buffer經常和Cache配合使用。用來緩解處理器和Cache等高速裝置和慢速儲存器之間的寫速度匹配問題。除了處理器和write buffer之外,與cache相關的還有MMU、匯流排架構等。如如果匯流排是馮.諾依曼結構,因為資料和指令走同一個通道,則只有一個Cache,如果匯流排是哈佛結構,因為資料和指令走不同的通道,則採用2個cache。

      既然是為了緩解讀寫速度匹配問題,需要解決的或者需要提供的解決方案就包括:訪問演算法、寫演算法。        1.訪問演算法       訪問演算法涉及到處理器、Cache、慢速儲存器等三個部件,具體就是在處理器和Cache中如何訪問、Cache和慢速儲存器之間如何訪問。      處理器和Cache間的訪問演算法:如果Cache中沒有處理器請求的內容,則發生Cache失效,Cache控制器從主存中copy相應的內容到Cache儲存器,稱為Cache行填充。這個時候如果Cache是滿的,則就需要進行替換,採用的不同的替換策略,就是Cache的替換演算法,arm下的Cache的替換演算法有輪轉法和偽隨機替換法。       2.寫演算法      當有計算結果需要儲存時,就因為涉及到處理器、Cache、慢速儲存器等三個部件,為了更好地提高寫的速度,就另加了一個write buffer部件,處於與Cache並行的位置,儘可能的將慢速的序列傳輸資料化為並行傳輸資料,加快了寫的節奏、拉長了寫的時間。是空間和時間的平衡。     總結演算法的本質,主要是化序列為並行。評價讀寫演算法的優劣的標準是命中率。 CACHE --
   CACHE可以分為DATA CACHE和INSTRUCTION CACHE(在有些處理器上,是統一的,資料和指令共用一小塊CACHE). 和普通儲存比較,CACHE的儲存速度快很多.提供CACHE的目的是為了提高速度.如果CPU要取的指令和資料在CACHE裡面,就不用到MEM裡去取,速度會很有優勢.當然,需要提供一定的機制來維護CACHE和
MEMORY
的一致性.以保證資料和指令的正確性.CPU需要讀某個地址的資料或者是指令的是,CPU會先看看CACHE裡面有沒有,如果有,直接從CACHE讀.如果沒有,那指定的資料指令從RAM裡讀取,同時,儲存在CACHE裡.如果下次還需要的時候,就有可能可以直接從CACHE裡取.如果CACHE滿了,會把一些最近沒有訪問的資料從CACHE裡面清除出去,如果有必要,還需要回寫到RAM裡面去.

BUFFER -
   一般都只看到WRITE BUFFER吧,在ARM的處理器裡,好像沒有看到過READ BUFFER :-) . WRITE BUFFER的作用其實和CACHE一樣,目的都是為了提高速度.試想,如果CPU需要把一些資料寫到外設去,如果外設的速度比CPU的速度慢很多的話,那CPU會在這個寫操作上消耗很多的時間,影響速度.如果能提供一箇中間的BUFFER做緩衝,資料先放到BUFFER,CPU就可以去做別的事情了.然後就可以在從BUFFER寫到目的地址去.

總而言之,CACHE和BUFFER的目的是一樣的,為了提高效能.不過具體的應用場合不一樣.
cache一般是為了加快交換速度,減少讀寫外部慢速儲存器設計的,buffer主要是為了協調速度,如快速裝置同慢速通訊。在一些情況下,他們指的是一個東西


cache解釋:當CPU需要讀寫記憶體地址的資料時,首先看cache中是否有改地址的內容,有的話就不去記憶體訪問了,沒有的話就訪問記憶體,訪問後如果記憶體的MMU描述符的Cbit使能,那麼該地址對應記憶體的資料會被放入cache,這個動作稱為linefill,如果Cbit禁能,那麼CPU直接讀取記憶體資料,但是不會發生linefill,CPU下次訪問該地址記憶體時,仍舊需要直接訪問記憶體。

writebuffer解釋:當CPU需要寫資料到記憶體時,對於WT和WB記憶體,如果記憶體的MMU描述符的Bbit使能,那麼資料先放入writebuffer,適當的時候寫入記憶體,CPU只負責把資料放入writebuffer,不會等待寫入記憶體完畢;Bbit禁能時,CPU一直等待寫入記憶體完畢。

傳送門:CACHE 寫透式與回寫式
http://blog.chinaunix.net/uid-12461657-id-3198510.html

如果所有的cache和記憶體互動由一個CPU負責,那麼cache對我們來說是透明的。

如果有多個CPU或則記憶體在CPU不知情的條件下發生改變,則需要cache flush和cache invalidate來更新記憶體和使無效cache,否則導致cache和記憶體不一致。