<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM存儲(chǔ)器之:高速緩沖存儲(chǔ)器Cache

          ARM存儲(chǔ)器之:高速緩沖存儲(chǔ)器Cache

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

          本文引用地址:http://www.ex-cimer.com/article/257011.htm

          15.3.3Cache工作原理

          Cache的基本存儲(chǔ)單元為Cache行(Cacheline)。存儲(chǔ)系統(tǒng)把Cache和主存儲(chǔ)器都劃分為相同大小的行。Cache與主存儲(chǔ)器交換數(shù)據(jù)是以行為基本單位進(jìn)行的。每一個(gè)Cache行都對(duì)應(yīng)于主存中的一個(gè)存儲(chǔ)塊(memoryblock)。

          Cache行的大小通常是2L字節(jié)。通常情況下是16字節(jié)(4個(gè)字)和32字節(jié)(8個(gè)字)。如果Cache行的大小為2L字節(jié),那么對(duì)主存的訪問通常是2L字節(jié)對(duì)齊的。所以對(duì)于一個(gè)虛擬地址來(lái)說(shuō),它的bit[31∶L]位,是Cache行的一個(gè)標(biāo)識(shí)。當(dāng)CPU發(fā)出的虛擬地址的bit[31∶L]和Cache中的某行bit[31∶L]相同,那么Cache中包含CPU要訪問的數(shù)據(jù),即成為一次Cache命中。

          為了加快Cache訪問的速度,又將多個(gè)Cache行劃分成一個(gè)Cache組(CacheSet)。Cache組中包含的Cache行的個(gè)數(shù)通常也為2的N次方的倍數(shù)。為了方便起見,取N=S。這樣,一個(gè)Cache組中就包含2S個(gè)Cache行。這時(shí),虛擬地址中的bit[L+S-1∶L]為Cache組的標(biāo)識(shí)。虛擬地址中余下的位bit[31∶L+S]成為一個(gè)Cache標(biāo)(Cache-tag)。它標(biāo)識(shí)了Cache行中的內(nèi)容和主存間的對(duì)應(yīng)關(guān)系。

          圖15.10顯示了Cache的訪問過(guò)程。

          圖15.10Cache訪問過(guò)程

          15.3.4Cache與主存的關(guān)系

          在Cache中采用地址映射將主存中的內(nèi)容映射到Cache地址空間。具體的說(shuō),就是把存放在主存中的程序按照某種規(guī)則裝入到Cache中,并建立主存地址到Cache地址之間的對(duì)應(yīng)關(guān)系。而地址變換是指當(dāng)程序已經(jīng)裝入到Cache后,在實(shí)際運(yùn)行過(guò)程中,把主存地址變換成Cache地址。

          地址的映射和變換是密切相關(guān)的。采用什么樣的地址映射方法,就必然有與之對(duì)應(yīng)的地址變換。

          常用的地址映射和變換方式包括直接映射和變換方式、組相聯(lián)映射和變換方式以及全相聯(lián)和變換方式。

          (1)直接(direct-mapped)映射方式

          直接映射是一種最簡(jiǎn)單,也是最直接的映射方式。主存中的每個(gè)地址都對(duì)應(yīng)Cache存儲(chǔ)器中惟一的一行。由于主存的容量遠(yuǎn)遠(yuǎn)大于Cache存儲(chǔ)器,所以在主存中很多地址被映射到同一個(gè)Cache行。

          圖15.11顯示了主存與Cache的直接映射關(guān)系。

          圖15.11主存和Cache的直接映射

          直接映射Cache是一種簡(jiǎn)單的解決方法,但這種設(shè)計(jì)使得每個(gè)主存塊在Cache中只有一個(gè)特定的行可以存放。如果程序同時(shí)用到對(duì)應(yīng)于Cache同一行的兩個(gè)主存塊,那么就會(huì)發(fā)生沖突,沖突的結(jié)果是導(dǎo)致Cache行的頻繁變換。這種由直接映射導(dǎo)致的Cache存儲(chǔ)器中的軟件沖突稱為顛簸(thrashing)問題。

          (2)組相聯(lián)映射方式

          為了減少顛簸問題,有些Cache使用了組相聯(lián)的映射策略。在組相聯(lián)的地址映射和變換中,把主存和Cache按同樣大小劃分成組(set),每個(gè)組都由相同的行數(shù)組成。

          由于主存的容量比Cache容量大得多,因此,主存的組數(shù)要比Cache的組數(shù)多。從主存的組到Cache的組之間采用直接映射方式。主存中的一組與Cache中的一組之間建立了之間映射方式后,在兩個(gè)對(duì)應(yīng)的組內(nèi)部采用全相聯(lián)映射方式。

          中采用的是組相聯(lián)的地址映射和變換方式。如果Cache的行大小為2L,則同一行中各地址的bit[31∶L]是相同的。如果Cache中組的大?。拷M中包含的行數(shù))為2S,則虛地址位bit[L+S∶L]用于選擇Cache中的某個(gè)組。

          圖15.12顯示了一個(gè)Cache與主存儲(chǔ)器的組相聯(lián)映射

          圖15.12Cache與主存儲(chǔ)器組相聯(lián)映射

          擁有相同組索引的Cache行稱為組相聯(lián)的(setassociative)。主存中的程序或代碼段可以在不影響程序執(zhí)行的情況下被分配到Cache中的某一組中。也就是說(shuō),將數(shù)據(jù)或代碼存入Cache行中的操作不會(huì)影響程序的執(zhí)行。

          (3)全相聯(lián)映射方式

          隨著Cache控制器的相聯(lián)度的提高,沖突的可能性減少了。理想的目標(biāo)是,盡量提高組相聯(lián)程度,使主存地址能夠映射到任意Cache行。這樣的Cache被稱為全相聯(lián)Cache。然而,隨著相聯(lián)度的提高,與之相匹配的硬件的復(fù)雜度也在提高。硬件設(shè)計(jì)者提高Cache相聯(lián)度的一種方法就是使用內(nèi)容尋址寄存器CAM(ContentAddressableMemory)。

          CAM使用一組比較器,以比較輸入的標(biāo)簽地址和存儲(chǔ)在每一個(gè)有效Cache行中的標(biāo)簽位。CAM采取了與RAM相反的工作方式;RAM在得到一個(gè)地址后再給出數(shù)據(jù);而CAM則是在檢測(cè)到給定的數(shù)據(jù)值在存儲(chǔ)器中后,再給出該數(shù)據(jù)的地址。使用CAM允許同時(shí)比較更多的地址中的標(biāo)簽位,從而增加了可以包含在一個(gè)組中的Cache行數(shù)。

          920T和940T存儲(chǔ)器核中,ARM使用了CAM來(lái)定位地址中的標(biāo)簽域。ARM920T和ARM940T中的Cache是64組組相聯(lián)的。圖15.13所示為ARM940T的Cache結(jié)構(gòu)圖。Cache控制器把地址標(biāo)簽域作為CAM的輸入,它的輸出選擇了包含有效Cache行的組。

          圖15.13ARM940T64路組相聯(lián)Cache

          訪問地址的標(biāo)簽部分被作為4個(gè)CAM的輸入,輸入標(biāo)簽的同時(shí)與存儲(chǔ)在64組中的所有Cache標(biāo)簽比較。如果有一個(gè)匹配,那么數(shù)據(jù)就由Cache寄存器提供;如果沒有匹配,存儲(chǔ)器就會(huì)產(chǎn)生一個(gè)失效(misss)信號(hào)。

          控制器使用組索引位(setindex)在4個(gè)CAM中選擇一個(gè)。被選中的CAM會(huì)在Cache存儲(chǔ)器中選擇一個(gè)Cache行,該地址的數(shù)據(jù)索引部分(dataindex)在該Cache行中選擇出所需的字、半字或者字節(jié)。

          15.3.5Cache的寫策略

          當(dāng)CPU更新了Cache內(nèi)容時(shí),要將結(jié)果寫回到主存中,通常有兩種方法:

          ·直寫法(write-through);

          ·回寫法(write-back)。

          直寫法是指,當(dāng)CPU在執(zhí)行寫操作時(shí),必須把數(shù)據(jù)同時(shí)寫入Cache和主存,以確保Cache和主存數(shù)據(jù)一致。在這種寫策略下,處理器在每次寫Cache時(shí)也要寫相應(yīng)的主存單元。由于要訪問主存,直寫法的速度比回寫法要慢一些。

          回寫法是指,當(dāng)處理器和寫Cache命中時(shí),只向Cache存儲(chǔ)器寫數(shù)據(jù),而不立即寫入主存。這樣,主存儲(chǔ)器與相應(yīng)的Cache行數(shù)據(jù)有可能不一致。Cache中的數(shù)據(jù)是新的,而主存中的數(shù)據(jù)可能是較早的、沒有被更新過(guò)的。

          配置成回寫法的Cache要使用Cache行的狀態(tài)信息塊中的一個(gè)或多個(gè)臟位(dirtybit)。當(dāng)回寫Cache控制器向Cache存儲(chǔ)器中的某一行寫入數(shù)據(jù)時(shí),它會(huì)將臟位設(shè)置為1。如果控制器內(nèi)核此后訪問該Cache行,那么通過(guò)臟位的狀態(tài)就可以知道該Cache行中含有主存儲(chǔ)器中沒有的數(shù)據(jù)。如果Cache控制器要將一個(gè)臟位被設(shè)置的Cache行替換出Cache存儲(chǔ)器,那么該Cache行數(shù)據(jù)會(huì)自動(dòng)被寫入主存單元中??刂破魍ㄟ^(guò)這種方法來(lái)防止只存在于Cache中而主存中沒有的重要信息的丟失。

          表15.12比較了直寫法和回寫法的優(yōu)缺點(diǎn)。

          表15.12 直寫法與回寫法

          寫策略

          直寫法

          回寫法

          可靠性

          與主存的通信量

          控制的復(fù)雜性

          簡(jiǎn)單

          復(fù)雜

          硬件實(shí)現(xiàn)代價(jià)

          下面分析產(chǎn)生這些性能差異的原因。

          ·可靠性。直寫法要優(yōu)于回寫法。這是因?yàn)橹睂懛ㄊ冀K保證Cache是主存的正確副本。當(dāng)Cache發(fā)生錯(cuò)誤時(shí),可以從主存中糾正。

          ·與主存的通信量。一般情況下,回寫法少于直寫法。這是因?yàn)?,一方面,Cache的命中率很高,對(duì)于回寫法來(lái)說(shuō),CPU絕大多數(shù)操作只需要寫Cache,不必寫主存。另一方面,當(dāng)Cache失效時(shí),要將Cache中的行替換到主存,而直寫法每次只寫一個(gè)字到主存??偟膩?lái)說(shuō),由于直寫法在每次寫Cache時(shí),同時(shí)寫主存,從而增加了寫操作的開銷。而回寫法是把與主存的數(shù)據(jù)交換集中到一次主存操作,可能要一次性的進(jìn)行多個(gè)字的操作。

          ·控制的復(fù)雜性。直寫法必回寫法簡(jiǎn)單。直寫法在Cache的行狀態(tài)表中不需要修改位。同時(shí),直寫法的糾錯(cuò)技術(shù)相對(duì)簡(jiǎn)單。

          ·硬件代價(jià)。回寫法比直寫法好。因?yàn)橹睂懛ㄖ?,每次寫操作都要寫主存,因此為了?jié)省寫主存所花費(fèi)的時(shí)間,通常要采用一個(gè)高速小容量的緩存存儲(chǔ)器,把要寫的數(shù)據(jù)和地址寫到這個(gè)緩存中。在每次讀主存時(shí),也要首先判斷所讀的數(shù)據(jù)是否在這個(gè)緩存中。而回寫法不需要上述操作,相對(duì)硬件代價(jià)要小。

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




          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();