<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM存儲器之:高速緩沖存儲器Cache

ARM存儲器之:高速緩沖存儲器Cache

作者: 時(shí)間:2013-09-30 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/257011.htm

程序員通過(guò)指令對寄存器中的Cache組內行號進(jìn)行操作。讀取格式A的寄存器c9,將返回最后一次寫(xiě)入寄存器c9的值。將數據index寫(xiě)入寄存器c9,就是對要鎖定的Cache行進(jìn)行設置。當用MCR指令向寄存器寫(xiě)入數據時(shí),執行以下操作。

①當下一次發(fā)生Cache未命中時(shí),將預取的存儲器行存入Cache中與該行相對應的組中編號為index的Cache行中。

②這時(shí)被鎖定的Cache塊包括序號為0~index-1的鎖定塊。當發(fā)生Cache替換時(shí),從編號為index到A-1的塊中選擇被替換的塊。

格式B的編碼如圖15.15所示。

程序員通過(guò)指令對寄存器中的Cache組內行號進(jìn)行操作。讀取格式B的寄存器c9,將返回最后一次寫(xiě)入寄存器c9的值。將數據index寫(xiě)入寄存器c9,就是對要鎖定的Cache行進(jìn)行設置。當用MCR指令向寄存器寫(xiě)入數據時(shí),執行以下操作。

圖15.15格式B編碼

①當L=0時(shí),如果方式Cache未命中,將預取的存儲行存入Cache中與該行對應的組中序號為index的Cache行中。

②當L=1時(shí),如果本次寫(xiě)操作之前L=0,并且index值小于本次寫(xiě)入的index,本次寫(xiě)操作執行的結果不可預知;否則,這時(shí)被鎖定的Cache塊包括序號為0~index-1的塊。當發(fā)生Cache替換時(shí),從序號為index~A-1的塊中選擇被替換的塊。

下面以鎖定塊N來(lái)說(shuō)明要鎖定一個(gè)Cache塊的步驟。

①首先確保在下面的整個(gè)Cache鎖定過(guò)程不會(huì )被中斷打斷。如果程序要求中斷不能關(guān)閉,那么必須確保被打開(kāi)的中斷相關(guān)代碼和數據位于非緩存(uncachable)的存儲區域。

關(guān)中斷的典型做法如下所示。

MRSr2,CPSR;讀出當前程序狀態(tài)字CPSR

ORRr2,r2,#0x000000C0;關(guān)中斷

MSRCPSR_cxsf,r2;設置當前程序狀態(tài)字

②如果鎖定是指令Cache或者統一Cache,必須保證鎖定過(guò)程所執行的代碼位于非緩存的存儲域。

③如果鎖定的是數據Cache或者統一的Cache,必須保證鎖定過(guò)程所執行的數據位于非緩存的存儲域。

④保證要鎖定的代碼和數據位于緩存的存儲區域中。

⑤如果要鎖定的代碼和數據不在Cache中,使用Cache清除或清理指令,將其置換到Cache中。

⑥N次循環(huán)執行下面的操作。

·index=I寫(xiě)入寄存器c9,當使用B格式的鎖定寄存器時(shí),令L=0。

·如果鎖定的是數據Cache或數據和指令統一Cache,使用LDR指令將數據從內存讀出,這個(gè)讀操作將使要鎖定的內容存在于Cache行中。

·如果鎖定的是指令Cache,那么要借助c7寄存器,相關(guān)指令詳細內容,參見(jiàn)c7寄存器一節。

⑦將index=N寫(xiě)入寄存器c9,當使用B格式的鎖定寄存器時(shí),令L=0。

如果要解除對N鎖定塊的鎖定,執行以下操作。

·將index=0寫(xiě)入寄存器c9。

·當使用格式B的鎖定寄存器時(shí),令L=0。

15.3.8內存一致性

當一個(gè)系統中同時(shí)使用了Cache、寫(xiě)緩存時(shí),同一地址的數據可能同時(shí)出現在包括系統內存在內的多個(gè)不同的物理位置中。如果Cache引入了哈佛架構,使用數據和指令分類(lèi)的Cache,那情況將更復雜。

由于上述存儲系統的多樣性特點(diǎn),當從內存中讀取數據時(shí),不能保證讀取的是數據的最新值(即有可能出現下述情況:寫(xiě)操作將數據寫(xiě)入到Cache中,但更新數據還沒(méi)有被回寫(xiě)到內存)。

存儲系統中,數據不一致問(wèn)題一方面可以通過(guò)存儲系統自動(dòng)保證解決,另一方面編寫(xiě)程序時(shí)要遵循一定的規則,防止數據不一致性發(fā)生。

下面就幾個(gè)常出現數據不一致的地方進(jìn)行討論。

·地址映射發(fā)生變化時(shí)

·指令和數據分離的Cache

·系統執行DMA(DirectMemoryAccess)操作

(1)地址映射發(fā)生的變換

當系統中使用MMU時(shí),Cache行對應的地址可能是:

①內存中的實(shí)際地址;

②經(jīng)過(guò)地址轉換后的虛擬地址。

如果查詢(xún)Cache時(shí)相聯(lián)地址比較使用的是虛擬地址,則當系統地址到物理地址的映射發(fā)生變換時(shí),可能造成Cache中數據與主存中的不一致。

同時(shí),當系統中使用了寫(xiě)緩存,處理器對寫(xiě)緩存中的數據處理也是按虛擬地址進(jìn)行的,所以同樣會(huì )發(fā)生數據不統一的問(wèn)題。比如,當前處理器使用虛擬地址向某個(gè)內存單元寫(xiě)數據,該寫(xiě)操作已經(jīng)將虛擬地址和數據寫(xiě)入到寫(xiě)緩存區中,此時(shí),虛擬地址到物理地址的映射關(guān)系發(fā)生變換,使先前要寫(xiě)入數據的虛擬地址發(fā)生了變化,當寫(xiě)緩存將上面被延時(shí)的寫(xiě)操作寫(xiě)到主存時(shí),使用的是變換后的地址,從而寫(xiě)操作執行失敗。

為了避免發(fā)生這種數據不統一的情況,在系統虛擬地址到物理地址的映射關(guān)系發(fā)生變換前,根據系統的具體情況,執行下面的操作序列中的一種或幾種。

·如果數據Cache為寫(xiě)回型Cache,清空該數據Cache。

·使數據Cache中相應的行無(wú)效。

·使指令Cache中相應的行無(wú)效。

·將寫(xiě)緩存區中被延時(shí)的操作全部執行。

·有些情況可能還要求相關(guān)的存儲區域被置換成非緩存的。

存儲器相關(guān)文章:存儲器原理




關(guān)鍵詞: ARM 高速緩沖存儲器 cache

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>