ARM存儲器之:高速緩沖存儲器Cache
程序員通過指令對寄存器中的Cache組內行號進行操作。讀取格式A的寄存器c9,將返回最后一次寫入寄存器c9的值。將數據index寫入寄存器c9,就是對要鎖定的Cache行進行設置。當用MCR指令向寄存器寫入數據時,執(zhí)行以下操作。
①當下一次發(fā)生Cache未命中時,將預取的存儲器行存入Cache中與該行相對應的組中編號為index的Cache行中。
②這時被鎖定的Cache塊包括序號為0~index-1的鎖定塊。當發(fā)生Cache替換時,從編號為index到A-1的塊中選擇被替換的塊。
格式B的編碼如圖15.15所示。
程序員通過指令對寄存器中的Cache組內行號進行操作。讀取格式B的寄存器c9,將返回最后一次寫入寄存器c9的值。將數據index寫入寄存器c9,就是對要鎖定的Cache行進行設置。當用MCR指令向寄存器寫入數據時,執(zhí)行以下操作。
圖15.15格式B編碼
①當L=0時,如果方式Cache未命中,將預取的存儲行存入Cache中與該行對應的組中序號為index的Cache行中。
②當L=1時,如果本次寫操作之前L=0,并且index值小于本次寫入的index,本次寫操作執(zhí)行的結果不可預知;否則,這時被鎖定的Cache塊包括序號為0~index-1的塊。當發(fā)生Cache替換時,從序號為index~A-1的塊中選擇被替換的塊。
下面以鎖定塊N來說明要鎖定一個Cache塊的步驟。
①首先確保在下面的整個Cache鎖定過程不會被中斷打斷。如果程序要求中斷不能關閉,那么必須確保被打開的中斷相關代碼和數據位于非緩存(uncachable)的存儲區(qū)域。
關中斷的典型做法如下所示。
MRSr2,CPSR;讀出當前程序狀態(tài)字CPSR
ORRr2,r2,#0x000000C0;關中斷
MSRCPSR_cxsf,r2;設置當前程序狀態(tài)字
②如果鎖定是指令Cache或者統一Cache,必須保證鎖定過程所執(zhí)行的代碼位于非緩存的存儲域。
③如果鎖定的是數據Cache或者統一的Cache,必須保證鎖定過程所執(zhí)行的數據位于非緩存的存儲域。
④保證要鎖定的代碼和數據位于緩存的存儲區(qū)域中。
⑤如果要鎖定的代碼和數據不在Cache中,使用Cache清除或清理指令,將其置換到Cache中。
⑥N次循環(huán)執(zhí)行下面的操作。
·index=I寫入寄存器c9,當使用B格式的鎖定寄存器時,令L=0。
·如果鎖定的是數據Cache或數據和指令統一Cache,使用LDR指令將數據從內存讀出,這個讀操作將使要鎖定的內容存在于Cache行中。
·如果鎖定的是指令Cache,那么要借助c7寄存器,相關指令詳細內容,參見c7寄存器一節(jié)。
⑦將index=N寫入寄存器c9,當使用B格式的鎖定寄存器時,令L=0。
如果要解除對N鎖定塊的鎖定,執(zhí)行以下操作。
·將index=0寫入寄存器c9。
·當使用格式B的鎖定寄存器時,令L=0。
15.3.8內存一致性
當一個系統中同時使用了Cache、寫緩存時,同一地址的數據可能同時出現在包括系統內存在內的多個不同的物理位置中。如果Cache引入了哈佛架構,使用數據和指令分類的Cache,那情況將更復雜。
由于上述存儲系統的多樣性特點,當從內存中讀取數據時,不能保證讀取的是數據的最新值(即有可能出現下述情況:寫操作將數據寫入到Cache中,但更新數據還沒有被回寫到內存)。
ARM存儲系統中,數據不一致問題一方面可以通過存儲系統自動保證解決,另一方面編寫程序時要遵循一定的規(guī)則,防止數據不一致性發(fā)生。
下面就幾個常出現數據不一致的地方進行討論。
·地址映射發(fā)生變化時
·指令和數據分離的Cache
·系統執(zhí)行DMA(DirectMemoryAccess)操作
(1)地址映射發(fā)生的變換
當系統中使用MMU時,Cache行對應的地址可能是:
①內存中的實際地址;
②經過地址轉換后的虛擬地址。
如果查詢Cache時相聯地址比較使用的是虛擬地址,則當系統地址到物理地址的映射發(fā)生變換時,可能造成Cache中數據與主存中的不一致。
同時,當系統中使用了寫緩存,處理器對寫緩存中的數據處理也是按虛擬地址進行的,所以同樣會發(fā)生數據不統一的問題。比如,當前處理器使用虛擬地址向某個內存單元寫數據,該寫操作已經將虛擬地址和數據寫入到寫緩存區(qū)中,此時,虛擬地址到物理地址的映射關系發(fā)生變換,使先前要寫入數據的虛擬地址發(fā)生了變化,當寫緩存將上面被延時的寫操作寫到主存時,使用的是變換后的地址,從而寫操作執(zhí)行失敗。
為了避免發(fā)生這種數據不統一的情況,在系統虛擬地址到物理地址的映射關系發(fā)生變換前,根據系統的具體情況,執(zhí)行下面的操作序列中的一種或幾種。
·如果數據Cache為寫回型Cache,清空該數據Cache。
·使數據Cache中相應的行無效。
·使指令Cache中相應的行無效。
·將寫緩存區(qū)中被延時的操作全部執(zhí)行。
·有些情況可能還要求相關的存儲區(qū)域被置換成非緩存的。
存儲器相關文章:存儲器原理
評論