新聞中心

s3c2410 CACHES, WRITE BUFFER

作者: 時(shí)間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
在上一篇文檔中我向大家介紹MMU的工作原理和對(duì)s3c2410 MMU部分操作進(jìn)行了講解。我們知道MMU存在的原因是為了支持虛擬存儲(chǔ)技術(shù),但不知道你發(fā)現(xiàn)了沒有,虛擬存儲(chǔ)技術(shù)的使用會(huì)降低整個(gè)系統(tǒng)的效率,因?yàn)榕c傳統(tǒng)的存儲(chǔ)技術(shù)相比,虛擬存儲(chǔ)技術(shù)對(duì)內(nèi)存的訪問操作多了一步,就是對(duì)地址進(jìn)行查表(查找映射關(guān)系),必須先從虛擬地址中分解出頁(yè)號(hào)和頁(yè)內(nèi)偏移,根據(jù)頁(yè)號(hào)對(duì)描述符進(jìn)行索引(這就是一個(gè)查表過程)得到物理空間的首地址,這樣做的代價(jià)是巨大的(其實(shí)這也正是時(shí)間效率與空間效率之間矛盾的一個(gè)體現(xiàn)),對(duì)某些嵌入式系統(tǒng)來說這簡(jiǎn)直就是惡夢(mèng)。那么在引入了虛擬存儲(chǔ)技術(shù)之后有沒有方法在時(shí)間效率與空間效率這個(gè)矛盾之間取得一個(gè)平衡點(diǎn)呢?答案是有,我們可以通過一種技術(shù)從最大限度上降低這兩者的矛盾,這種技術(shù)是Caches(緩存)。也是我們本文要介紹的。

以下內(nèi)容轉(zhuǎn)載自中計(jì)報(bào)
Cache的工作原理
 Cache的工作原理是基于程序訪問的局部性。
對(duì)大量典型程序運(yùn)行情況的分析結(jié)果表明,在一個(gè)較短的時(shí)間間隔內(nèi),由程序產(chǎn)生的地址往往集中在存儲(chǔ)器邏輯地址空間的很小范圍內(nèi)。指令地址的分布本來就是連續(xù)的,再加上循環(huán)程序段和子程序段要重復(fù)執(zhí)行多次。因此,對(duì)這些地址的訪問就自然地具有時(shí)間上集中分布的傾向。
數(shù)據(jù)分布的這種集中傾向不如指令明顯,但對(duì)數(shù)組的存儲(chǔ)和訪問以及工作單元的選擇都可以使存儲(chǔ)器地址相對(duì)集中。這種對(duì)局部范圍的存儲(chǔ)器地址頻繁訪問,而對(duì)此范圍以外的地址則訪問甚少的現(xiàn)象,就稱為程序訪問的局部性。
根據(jù)程序的局部性原理,可以在主存和CPU通用寄存器之間設(shè)置一個(gè)高速的容量相對(duì)較小的存儲(chǔ)器,把正在執(zhí)行的指令地址附近的一部分指令或數(shù)據(jù)從主存調(diào)入這個(gè)存儲(chǔ)器,供CPU在一段時(shí)間內(nèi)使用。這對(duì)提高程序的運(yùn)行速度有很大的作用。這個(gè)介于主存和CPU之間的高速小容量存儲(chǔ)器稱作高速緩沖存儲(chǔ)器(Cache)。
系統(tǒng)正是依據(jù)此原理,不斷地將與當(dāng)前指令集相關(guān)聯(lián)的一個(gè)不太大的后繼指令集從內(nèi)存讀到Cache,然后再與CPU高速傳送,從而達(dá)到速度匹配。
CPU對(duì)存儲(chǔ)器進(jìn)行數(shù)據(jù)請(qǐng)求時(shí),通常先訪問Cache。由于局部性原理不能保證所請(qǐng)求的數(shù)據(jù)百分之百地在Cache中,這里便存在一個(gè)命中率。即CPU在任一時(shí)刻從Cache中可靠獲取數(shù)據(jù)的幾率。
命中率越高,正確獲取數(shù)據(jù)的可靠性就越大。一般來說,Cache的存儲(chǔ)容量比主存的容量小得多,但不能太小,太小會(huì)使命中率太低;也沒有必要過大,過大不僅會(huì)增加成本,而且當(dāng)容量超過一定值后,命中率隨容量的增加將不會(huì)有明顯地增長(zhǎng)。
只要Cache的空間與主存空間在一定范圍內(nèi)保持適當(dāng)比例的映射關(guān)系,Cache的命中率還是相當(dāng)高的。
一般規(guī)定Cache與內(nèi)存的空間比為4:1000,即128kB Cache可映射32MB內(nèi)存;256kB Cache可映射64MB內(nèi)存。在這種情況下,命中率都在90%以上。至于沒有命中的數(shù)據(jù),CPU只好直接從內(nèi)存獲取。獲取的同時(shí),也把它拷進(jìn)Cache,以備下次訪問。
Cache的基本結(jié)構(gòu)
Cache通常由相聯(lián)存儲(chǔ)器實(shí)現(xiàn)。相聯(lián)存儲(chǔ)器的每一個(gè)存儲(chǔ)塊都具有額外的存儲(chǔ)信息,稱為標(biāo)簽(Tag)。當(dāng)訪問相聯(lián)存儲(chǔ)器時(shí),將地址和每一個(gè)標(biāo)簽同時(shí)進(jìn)行比較,從而對(duì)標(biāo)簽相同的存儲(chǔ)塊進(jìn)行訪問。Cache的3種基本結(jié)構(gòu)如下:
全相聯(lián)Cache
在全相聯(lián)Cache中,存儲(chǔ)的塊與塊之間,以及存儲(chǔ)順序或保存的存儲(chǔ)器地址之間沒有直接的關(guān)系。程序可以訪問很多的子程序、堆棧和段,而它們是位于主存儲(chǔ)器的不同部位上。
因此,Cache保存著很多互不相關(guān)的數(shù)據(jù)塊,Cache必須對(duì)每個(gè)塊和塊自身的地址加以存儲(chǔ)。當(dāng)請(qǐng)求數(shù)據(jù)時(shí),Cache控制器要把請(qǐng)求地址同所有地址加以比較,進(jìn)行確認(rèn)。
這種Cache結(jié)構(gòu)的主要優(yōu)點(diǎn)是,它能夠在給定的時(shí)間內(nèi)去存儲(chǔ)主存器中的不同的塊,命中率高;缺點(diǎn)是每一次請(qǐng)求數(shù)據(jù)同Cache中的地址進(jìn)行比較需要相當(dāng)?shù)臅r(shí)間,速度較慢。
直接映像Cache
直接映像Cache不同于全相聯(lián)Cache,地址僅需比較一次。
在直接映像Cache中,由于每個(gè)主存儲(chǔ)器的塊在Cache中僅存在一個(gè)位置,因而把地址的比較次數(shù)減少為一次。其做法是,為Cache中的每個(gè)塊位置分配一個(gè)索引字段,用Tag字段區(qū)分存放在Cache位置上的不同的塊。
單路直接映像把主存儲(chǔ)器分成若干頁(yè),主存儲(chǔ)器的每一頁(yè)與Cache存儲(chǔ)器的大小相同,匹配的主存儲(chǔ)器的偏移量可以直接映像為Cache偏移量。Cache的Tag存儲(chǔ)器(偏移量)保存著主存儲(chǔ)器的頁(yè)地址(頁(yè)號(hào))。
以上可以看出,直接映像Cache優(yōu)于全相聯(lián)Cache,能進(jìn)行快速查找,其缺點(diǎn)是當(dāng)主存儲(chǔ)器的組之間做頻繁調(diào)用時(shí),Cache控制器必須做多次轉(zhuǎn)換。
組相聯(lián)Cache
組相聯(lián)Cache是介于全相聯(lián)Cache和直接映像Cache之間的一種結(jié)構(gòu)。這種類型的Cache使用了幾組直接映像的塊,對(duì)于某一個(gè)給定的索引號(hào),可以允許有幾個(gè)塊位置,因而可以增加命中率和系統(tǒng)效率。
Cache與DRAM存取的一致性
在CPU與主存之間增加了Cache之后,便存在數(shù)據(jù)在CPU和Cache及主存之間如何存取的問題。讀寫各有2種方式。
貫穿讀出式(Look Through)
該方式將Cache隔在CPU與主存之間,CPU對(duì)主存的所有數(shù)據(jù)請(qǐng)求都首先送到Cache,由Cache自行在自身查找。如果命中,則切斷CPU對(duì)主存的請(qǐng)求,并將數(shù)據(jù)送出;不命中,則將數(shù)據(jù)請(qǐng)求傳給主存。
該方法的優(yōu)點(diǎn)是降低了CPU對(duì)主存的請(qǐng)求次數(shù),缺點(diǎn)是延遲了CPU對(duì)主存的訪問時(shí)間。
旁路讀出式(Look Aside)
在這種方式中,CPU發(fā)出數(shù)據(jù)請(qǐng)求時(shí),并不是單通道地穿過Cache,而是向Cache和主存同時(shí)發(fā)出請(qǐng)求。由于Cache速度更快,如果命中,則Cache在將數(shù)據(jù)回送給CPU的同時(shí),還來得及中斷CPU對(duì)主存的請(qǐng)求;不命中,則Cache不做任何動(dòng)作,由CPU直接訪問主存。
它的優(yōu)點(diǎn)是沒有時(shí)間延遲,缺點(diǎn)是每次CPU對(duì)主存的訪問都存在,這樣,就占用了一部分總線時(shí)間。
寫穿式(Write Through)
任一從CPU發(fā)出的寫信號(hào)送到Cache的同時(shí),也寫入主存,以保證主存的數(shù)據(jù)能同步地更新。
它的優(yōu)點(diǎn)是操作簡(jiǎn)單,但由于主存的慢速,降低了系統(tǒng)的寫速度并占用了總線的時(shí)間。
回寫式(Copy Back)
為了克服貫穿式中每次數(shù)據(jù)寫入時(shí)都要訪問主存,從而導(dǎo)致系統(tǒng)寫速度降低并占用總線時(shí)間的弊病,盡量減少對(duì)主存的訪問次數(shù),又有了回寫式。
它是這樣工作的:數(shù)據(jù)一般只寫到Cache,這樣有可能出現(xiàn)Cache中的數(shù)據(jù)得到更新而主存中的數(shù)據(jù)不變(數(shù)據(jù)陳舊)的情況。但此時(shí)可在Cache 中設(shè)一標(biāo)志地址及數(shù)據(jù)陳舊的信息,只有當(dāng)Cache中的數(shù)據(jù)被再次更改時(shí),才將原更新的數(shù)據(jù)寫入主存相應(yīng)的單元中,然后再接受再次更新的數(shù)據(jù)。這樣保證了Cache和主存中的數(shù)據(jù)不致產(chǎn)生沖突。

…..
你可以通過http://www.chinaunix.net/jh/45/180390.html閱讀完全文

s3c2410 內(nèi)置了指令緩存(ICaches),數(shù)據(jù)緩存(DCaches),寫緩存(write buffer) , 物理地址標(biāo)志讀寫區(qū) (Physical Address TAG RAM),CPU將通過它們來提高內(nèi)存訪問效率。
我們先討論指令緩存(ICaches)。
ICaches使用的是虛擬地址,它的大小是16KB,它被分成512行(entry),每行8個(gè)字(8 words,32Bits)。

當(dāng)系統(tǒng)上電或重起(Reset)的時(shí)候,ICaches功能是被關(guān)閉的,我們必須往lcr bit置1去開啟它,lcr bit在CP15協(xié)處理器中控制寄存器1的第12位(關(guān)閉ICaches功能則是往該位置0)。ICaches功能一般是在MMU開啟之后被使用的(為了降低MMU查表帶來的開銷),但有一點(diǎn)需要注意,并不是說MMU被開啟了ICaches才會(huì)被開啟,正如本段剛開始講的,ICaches的開啟與關(guān)閉是由lcr bit所決定的,無論MMU是否被開啟,只要lcr bit被置1了,ICaches就會(huì)發(fā)揮它的作用。
大家是否還記得discriptor(描述符)中有一個(gè)C bit我們稱之為Ctt,它是指明該描述符描述的內(nèi)存區(qū)域內(nèi)的內(nèi)容(可以是指令也可以是數(shù)據(jù))是否可以被Cache,若Ctt=1,則允許Cache,否則不允許被Cache。于是CPU讀取指令出現(xiàn)了下面這些情況:
1.如果CPU從Caches中讀取到所要的一條指令(cache hit)且這條指令所在的內(nèi)存區(qū)域是Cacheble的(該區(qū)域
所屬描述符中Ctt=1),則CPU執(zhí)行這條指令并從Caches中返回(不需要從內(nèi)存中讀取)。
2.若CPU從Caches中讀取不到所要的指令(cache miss)而這條指令所在的內(nèi)存區(qū)域是Cacheble的(同第1點(diǎn)),則CPU將從內(nèi)存中
讀取這條指令,同時(shí),一個(gè)稱為“8-word linefill”的動(dòng)作將發(fā)生,這個(gè)動(dòng)作是把該指令所處區(qū)域的8個(gè)word寫進(jìn)
ICaches的某個(gè)entry中,這個(gè)entry必須是沒有被鎖定的(對(duì)鎖定這個(gè)操作感興趣的朋友可以找相關(guān)的資料進(jìn)行了解)
3.若CPU從Caches中讀取不到所要的指令(cache miss)而這條指令所在的內(nèi)存區(qū)域是UnCacheble的(該區(qū)域所屬描
述符中Ctt=0),則CPU將從內(nèi)存讀取這條指令并執(zhí)行后返回(不發(fā)生linefill)

通過以上的說明,我們可以了解到CPU是怎么通過ICaches執(zhí)行指令的。你可能會(huì)有這個(gè)疑問,ICaches總共只有512個(gè)條目(entry),當(dāng)512個(gè)條目都被填充完之后,CPU要把新讀取近來的指令放到哪個(gè)條目上呢?答案是CPU會(huì)把新讀取近來的8個(gè)word從512個(gè)條目中選擇一個(gè)對(duì)其進(jìn)行寫入,那CPU是怎么選出一個(gè)條目來的呢?這就關(guān)系到ICaches的替換法則(replacemnet algorithm)了。ICaches的replacemnet algorithm有兩種,一種是Random模式另一種Round-Robin模式,我們可以通過CP15協(xié)處理器中寄存器1的RR bit對(duì)其進(jìn)行指定(0 = Random replacement 1 = Round robin replacement),如果有需要你還可以進(jìn)行指令鎖定(INSTRUCTION CACHE LOCKDOWN)。
關(guān)于替換法則和指令鎖定我就不做詳細(xì)的講解,感興趣的朋友可以找相關(guān)的資料進(jìn)行了解。

接下來我們談數(shù)據(jù)緩存(DCaches)和寫緩存(write buffer)
DCaches使用的是虛擬地址,它的大小是16KB,它被分成512行(entry),每行8個(gè)字(8 words,32Bits)。每行有兩個(gè)修改標(biāo)志位(dirty bits),第一個(gè)標(biāo)志位標(biāo)識(shí)前4個(gè)字,第二個(gè)標(biāo)志位標(biāo)識(shí)后4個(gè)字,同時(shí)每行中還有一個(gè)TAG 地址(標(biāo)簽地址)和一個(gè)valid bit。
與ICaches一樣,系統(tǒng)上電或重起(Reset)的時(shí)候,DCaches功能是被關(guān)閉的,我們必須往Ccr bit置1去開啟它,Ccr bit在CP15協(xié)處理器中控制寄存器1的第2位(關(guān)閉DCaches功能則是往該位置0)。與ICaches不同,DCaches功能是必須在MMU開啟之后才能被使用的。
我們現(xiàn)在討論的都是DCaches,你可能會(huì)問那Write Buffer呢?他和DCaches區(qū)別是什么呢? 其實(shí)DCaches和Write Buffer兩者間的操作有著非常緊密的聯(lián)系,很抱歉,到目前為止我無法說出他們之間有什么根本上的區(qū)別(-_-!!!),但我能告訴你什么時(shí)候使用的是DCaches,什么時(shí)候使用的是Write Buffer.系統(tǒng)可以通過Ccr bit對(duì)Dcaches的功能進(jìn)行開啟與關(guān)閉的設(shè)定,但是在s3c2410中卻沒有確定的某個(gè)bit可以來開啟或關(guān)閉Write Buffer…你可能有點(diǎn)懵…我們還是來看一張表吧,這張表說明了DCaches,Write Buffer和CCr,Ctt (descriptor中的C bit),Btt(descriptor中的B bit)之間的關(guān)系,其中“Ctt and Ccr”一項(xiàng)里面的值是Ctt與Ccr進(jìn)行邏輯與之后的值(Ctt&&Ccr).

從上面的表格中我們可以清楚的知道系統(tǒng)什么時(shí)候使用的是DCaches,什么時(shí)候使用的是Write Buffer,我們也可以看到DCaches的寫回方式是怎么決定的(write-back or write-througth)。
在這里我要對(duì)Ctt and Ccr=0進(jìn)行說明,能夠使Ctt and Ccr=0的共有三種情況,分別是
Ctt =0, Ccr=0
Ctt =1, Ccr=0
Ctt =0, Ccr=1
我們分別對(duì)其進(jìn)行說明。
情況1(Ctt =0, Ccr=0):這種情況下CPU的DCaches功能是關(guān)閉的(Ccr=0),所以CPU存取數(shù)據(jù)的時(shí)候不會(huì)從DCaches里進(jìn)行數(shù)據(jù)地查詢,CPU直接去內(nèi)存存取數(shù)據(jù)。
情況2(Ctt =1, Ccr=0):與情況1相同。
情況3(Ctt =0, Ccr=1):這種情況下DCaches功能是開啟的,CPU讀取數(shù)據(jù)的時(shí)候會(huì)先從DCaches里進(jìn)行數(shù)據(jù)地查詢,若DCaches中沒有合適的數(shù)據(jù),則CPU會(huì)去內(nèi)存進(jìn)行讀取,但此時(shí)由于Ctt =0(Ctt 是descriptor中的C bit,該bit決定該descriptor所描述的內(nèi)存區(qū)域是否可以被Cache),所以CPU不會(huì)把讀取到的數(shù)據(jù)Cache到DCaches(不發(fā)生linefill).

到此為止我們用兩句話總結(jié)一下DCaches與Write Buffer的開啟和使用:
1.DCaches與Write Buffer的開啟由Ccr決定。
2.DCaches與Write Buffer的使用規(guī)則由Ctt和Btt決定。

DCaches與ICaches有一個(gè)最大的不同,ICaches存放的是指令,DCaches存放的是數(shù)據(jù)。程序在運(yùn)行期間指令的內(nèi)容是不會(huì)改變的,所以ICaches中指令所對(duì)應(yīng)的內(nèi)存空間中的內(nèi)容不需要更新。但是數(shù)據(jù)是隨著程序的運(yùn)行而改變的,所以DCaches中數(shù)據(jù)必須被及時(shí)的更新到內(nèi)存(這也是為什么ICaches沒有寫回操作而DCaches提供了寫回操作的原因)。提到寫回操作,就不得不提到PA TAG 地址(物理標(biāo)簽地址)這個(gè)固件,它也是整個(gè)Caches模塊的重要組成部分。
簡(jiǎn)單說PA TAG 地址(物理標(biāo)簽地址)的功能是指明了寫回操作必須把DCaches中待寫回內(nèi)容寫到物理內(nèi)存的哪個(gè)位置。不知道你還記不記得,DCaches中每個(gè)entry中都有一個(gè)PA TAG 地址(物理標(biāo)簽地址),當(dāng)一個(gè)linefill發(fā)生時(shí),被Cache的內(nèi)容被寫進(jìn)了DCaches,同時(shí)被Cache的物理地址則被寫入了PA TAG 地址(物理標(biāo)簽地址)。除了TAG 地址(標(biāo)簽地址),還有兩個(gè)稱為dirty bit(修改標(biāo)志位)的位出現(xiàn)在DCaches的每一個(gè)entry中,它們指明了當(dāng)前entry中的數(shù)據(jù)是否已經(jīng)發(fā)生了改變(發(fā)生改變簡(jiǎn)稱為變“臟”,所以叫dirty bit,老外取名稱可真有意思 -_-!!!)。如果某個(gè)entry中的dirty bit置位了,說明該entry已經(jīng)變臟,于是一個(gè)寫回操作將被執(zhí)行,寫回操作的目的地址則是由PA TAG 地址(物理標(biāo)簽地址)索引到的物理地址。

關(guān)于Caches,Write Buffer更詳細(xì)的內(nèi)容請(qǐng)大家閱讀s3c2410的操作手冊(cè):]


關(guān)鍵詞: s3c2410CACHESWRITEBUFFE

評(píng)論


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

關(guān)閉