- 嵌入式系統(tǒng)Linux內(nèi)核開(kāi)發(fā)實(shí)戰(zhàn)指南(ARM平臺(tái))
- 王洪輝編著
- 2909字
- 2018-12-27 18:21:38
第5章 ARM處理器的Cache和Write Buffer
Cache是位于CPU與主存儲(chǔ)器即DRAM(Dynamic RAM,動(dòng)態(tài)存儲(chǔ)器)之間的少量超高速靜態(tài)存儲(chǔ)器SRAM(Static RAM),它是為了解決CPU與主存之間速度匹配問(wèn)題而設(shè)置的,不能由用戶(hù)直接尋址訪問(wèn)。隨著科技的發(fā)展和生產(chǎn)工藝水平的提高,高性能處理器中Cache的容量將越來(lái)越大,而且級(jí)數(shù)將越來(lái)越多,從而大大提高系統(tǒng)的性能。
5.1 Cache和Write Buffer一般性介紹
本節(jié)我們摘錄一些網(wǎng)上介紹Cache和Write Buffer的文章,以期讀者能對(duì)Cache和Write Buffer有一個(gè)比較深刻的認(rèn)識(shí)。按照先一般性后個(gè)性的順序,我們后面章節(jié)再介紹ARM處理器中的Cache和Write Buffer時(shí)就會(huì)比較容易理解。
5.1.1 Cache工作原理
具有Cache的計(jì)算機(jī),當(dāng)CPU需要進(jìn)行存儲(chǔ)器存取時(shí),首先檢查所需數(shù)據(jù)是否在Cache中。如果存在,則可以直接存取其中的數(shù)據(jù)而不必插入任何等待狀態(tài),這是最佳情況,稱(chēng)為高速命中;當(dāng)CPU所需信息不在Cache中時(shí),則需切換存取主儲(chǔ)器,由于速度較慢,需要插入等待,這種情況稱(chēng)高速未命中;在CPU存取主存儲(chǔ)器的時(shí)候,按照最優(yōu)化原則將存儲(chǔ)信息同時(shí)寫(xiě)入到Cache中以保證下次可能的高速緩存命中。因此,同一數(shù)據(jù)可能同時(shí)存儲(chǔ)在主存儲(chǔ)器和Cache中。同樣,按照優(yōu)化算法,可以淘汰Cache中一些不常使用的數(shù)據(jù)。
傳統(tǒng)的Socket架構(gòu)通常采用兩級(jí)緩沖結(jié)構(gòu),即在CPU中集成了一級(jí)緩存(L1 Cache),在主板上裝二級(jí)緩存(L2 Cache),而SlotⅠ架構(gòu)下的L2 Cache則與CPU做在同一塊電路板上,以?xún)?nèi)核速度或者內(nèi)核速度的一半運(yùn)行,速度比Socket下的以系統(tǒng)外頻運(yùn)行的L2 Cache更快,能夠更大限度發(fā)揮高主頻的優(yōu)勢(shì),當(dāng)然對(duì)Cache工藝要求也更高。CPU首先在L1 Cache中查找數(shù)據(jù),如找不到,則在L2 Cache中尋找。若數(shù)據(jù)在L2 Cache中,控制器在傳輸數(shù)據(jù)的同時(shí),修改L1 Cache;若數(shù)據(jù)既不在L1 Cache中,又不在L2 Cache中,Cache控制器則從主存中獲取數(shù)據(jù),將數(shù)據(jù)提供給CPU的同時(shí)修改兩級(jí)Cache。K6-Ⅲ則比較特殊,64KB L1 Cache,256KB Full Core Speed L2 Cache,原先主板上的緩存實(shí)際上就成了L3 Cache。根據(jù)有關(guān)測(cè)試表明:當(dāng)512K~2MB的三級(jí)緩存發(fā)揮作用時(shí),系統(tǒng)性能還可以有2%~10%的提高;Tri-level成為PC系統(tǒng)出現(xiàn)以來(lái)提出的解決高速CPU與低速內(nèi)存之間瓶頸最為細(xì)致復(fù)雜的方案;而且,今后Cache的發(fā)展方向也是大容量、超高速。
在主存-Cache存儲(chǔ)體系中,所有的指令和數(shù)據(jù)都存在主存中,Cache只是存放主存中的一部分程序塊和數(shù)據(jù)塊的副本,只是一種以塊為單位的存儲(chǔ)方式。Cache和主存被分為塊,每塊由多個(gè)字節(jié)組成。由上述的程序局部性原理可知,Cache中的程序塊和數(shù)據(jù)塊會(huì)使CPU要訪問(wèn)的內(nèi)容在大多數(shù)情況下已經(jīng)在Cache中,CPU的讀寫(xiě)操作主要在CPU和Cache之間進(jìn)行。CPU訪問(wèn)存儲(chǔ)器時(shí),送出訪問(wèn)單元的地址,由地址總線傳送到Cache控制器中的主存地址寄存器MA,主存-Cache地址轉(zhuǎn)換機(jī)構(gòu)從MA獲取地址并判斷該單元內(nèi)容是否已在Cache中存有副本,如果副本已存在于Cache中,即命中。當(dāng)命中時(shí),立即把訪問(wèn)地址變換成它在Cache中的地址,然后訪問(wèn)Cache。
如果CPU要訪問(wèn)的內(nèi)容不在Cache中,即不命中,則CPU轉(zhuǎn)去直接訪問(wèn)主存,并將包含此存儲(chǔ)單元的整個(gè)數(shù)據(jù)塊(包括該塊數(shù)據(jù)的地址信息)傳到Cache中,使得以后的若干次對(duì)內(nèi)存的訪問(wèn)可轉(zhuǎn)化為對(duì)Cache的訪問(wèn)。若Cache存儲(chǔ)器已滿,則需在替換控制部件的控制下,根據(jù)某種替換算法/策略,用此塊信息替換掉Cache中原來(lái)的某塊信息。
所以,要想提高系統(tǒng)效率,必須提高Cache命中率,而Cache命中率的提高則取決于Cache的映像方式和Cache刷新算法等一系列因素,同時(shí)Cache中內(nèi)容應(yīng)與主存中的部分保持一致,也就是說(shuō),如果主存中的內(nèi)容在調(diào)入Cache之后發(fā)生了變化,那么它在Cache中的映像也應(yīng)該隨之發(fā)生相應(yīng)改變,反之,當(dāng)CPU修改了Cache中的內(nèi)容后,主存中的相應(yīng)內(nèi)容也應(yīng)作修改。
5.1.2 地址映像方式
所謂地址映像方式是指如何確定Cache中的內(nèi)容是主存中的哪一部分的副本,即必須應(yīng)用某種函數(shù)把主存地址映像到Cache中定位。當(dāng)信息按某種方式裝入Cache中后,執(zhí)行程序時(shí),應(yīng)將主存地址變換為Cache地址,這個(gè)變換過(guò)程叫作地址變換。地址映像方式通常采用直接映像、全相聯(lián)映像、組相聯(lián)映像三種:
直接映像
每個(gè)主存地址映像到Cache中的一個(gè)指定地址的方式,稱(chēng)為直接映像方式。在直接映像方式下,主存中存儲(chǔ)單元的數(shù)據(jù)只可調(diào)入Cache中的一個(gè)位置,如果主存中另一個(gè)存儲(chǔ)單元的數(shù)據(jù)也要調(diào)入該位置則將發(fā)生沖突。地址映像的方法一般是將主存空間按Cache的尺寸分區(qū),每區(qū)內(nèi)相同的塊號(hào)映像到Cache中相同的塊位置。一般地,Cache被分為2N塊,主存被分為大小為2MB的塊,主存與Cache中塊的對(duì)應(yīng)關(guān)系可用如下映像函數(shù)表示:j = i mod 2N。式中,j是Cache中的塊號(hào);i是主存中的塊號(hào)。
直接映像是一種最簡(jiǎn)單的地址映像方式,它的地址變換速度快,而且不涉及其他兩種映像方式中的替換策略問(wèn)題。但是這種方式的塊沖突概率較高,當(dāng)程序往返訪問(wèn)兩個(gè)相互沖突的塊中的數(shù)據(jù)時(shí),Cache的命中率將急劇下降,因?yàn)檫@時(shí)即使Cache中有其他空閑塊,也因?yàn)楣潭ǖ牡刂酚诚耜P(guān)系而無(wú)法應(yīng)用。
全相聯(lián)映像
主存中的每一個(gè)字塊可映像到Cache任何一個(gè)字塊位置上,這種方式稱(chēng)為全相聯(lián)映像。這種方式只有當(dāng)Cache中的塊全部裝滿后才會(huì)出現(xiàn)塊沖突,所以塊沖突的概率低,可達(dá)到很高的Cache命中率,但它實(shí)現(xiàn)很復(fù)雜。當(dāng)訪問(wèn)一個(gè)塊中的數(shù)據(jù)時(shí),塊地址要與Cache塊表中的所有地址標(biāo)記進(jìn)行比較已確定是否命中。在數(shù)據(jù)塊調(diào)入時(shí)存在著一個(gè)比較復(fù)雜的替換問(wèn)題,即決定將數(shù)據(jù)塊調(diào)入Cache中什么位置,將Cache中哪一塊數(shù)據(jù)調(diào)出主存。為了達(dá)到較高的速度,全部比較和替換都要用硬件實(shí)現(xiàn)。
組相聯(lián)映像
組相聯(lián)映像方式是直接映像和全相聯(lián)映像的一種折中方案。這種方法將存儲(chǔ)空間分為若干組,各組之間是直接映像,而組內(nèi)各塊之間則是全相聯(lián)映像。它是上述兩種映像方式的一般形式,如果組的大小為1,即Cache空間分為2N組,就變?yōu)橹苯佑诚瘢蝗绻M的大小為Cache整個(gè)的尺寸,就變?yōu)槿嗦?lián)映像。組相聯(lián)方式在判斷塊命中及替換算法上都要比全相聯(lián)方式簡(jiǎn)單,塊沖突的概率比直接映像低,其命中率也介于直接映像和全相聯(lián)映像方式之間。
5.1.3 Cache寫(xiě)入方式原理簡(jiǎn)介
提高高速緩存命中率的最好方法是盡量使Cache存放CPU最近一直在使用的指令與數(shù)據(jù),當(dāng)Cache裝滿后,可將相對(duì)長(zhǎng)期不用的數(shù)據(jù)刪除,提高Cache的使用效率。為保持Cache中數(shù)據(jù)與主存儲(chǔ)器中數(shù)據(jù)的一致性,避免CPU在讀寫(xiě)過(guò)程中將Cache中的新數(shù)據(jù)遺失,造成錯(cuò)誤地讀數(shù)據(jù),確保Cache中更新過(guò)程的數(shù)據(jù)不會(huì)因覆蓋而消失,必須將Cache中的數(shù)據(jù)更新及時(shí)準(zhǔn)確地反映到主存儲(chǔ)器中,這是一個(gè)Cache寫(xiě)入過(guò)程,Cache寫(xiě)入的方式通常采用直寫(xiě)式、緩沖直寫(xiě)式與回寫(xiě)式三種,下面比較介紹這三種Cache寫(xiě)入方式。
■ 直寫(xiě)式(Write Through)系統(tǒng)
CPU對(duì)Cache寫(xiě)入時(shí),將數(shù)據(jù)同時(shí)寫(xiě)入到主存儲(chǔ)器中,這樣可保證Cache中的內(nèi)容與主存儲(chǔ)器的內(nèi)容完全一致。這種方式比較直觀,而且簡(jiǎn)單、可靠,但由于每次對(duì)Cache更新時(shí)都要對(duì)主存儲(chǔ)器進(jìn)行寫(xiě)操作,而這必須通過(guò)系統(tǒng)總線來(lái)完成,因此總線工作頻繁,系統(tǒng)運(yùn)行速度就會(huì)受到影響。
■ 緩沖直寫(xiě)式(Post Wirte)系統(tǒng)
為解決直寫(xiě)式系統(tǒng)對(duì)總線速度的影響問(wèn)題,在主存儲(chǔ)器的數(shù)據(jù)寫(xiě)入時(shí)增加緩沖器區(qū)。當(dāng)要寫(xiě)入主存儲(chǔ)器的數(shù)據(jù)被緩沖器鎖存后,CPU便可執(zhí)行下一個(gè)周期的操作,不必等待數(shù)據(jù)寫(xiě)入主存儲(chǔ)器。這相對(duì)于給主存儲(chǔ)器增加了一個(gè)單向單次高速緩存。比如,在寫(xiě)入周期之后可以緊接著一個(gè)數(shù)據(jù)已存在于Cache中的讀取周期,這樣就可避免直寫(xiě)式系統(tǒng)造成的操作延時(shí),但這個(gè)緩沖器只能存儲(chǔ)一次寫(xiě)入的數(shù)據(jù),當(dāng)連續(xù)兩次寫(xiě)操作發(fā)生時(shí),CPU仍需等待。
■ 回寫(xiě)式(Write Back)系統(tǒng)
前面兩種寫(xiě)入方式系統(tǒng),都是在寫(xiě)Cache的同時(shí)對(duì)主存儲(chǔ)器進(jìn)行寫(xiě)操作。實(shí)際上這不僅是對(duì)總線帶寬的占用,浪費(fèi)了寶貴的執(zhí)行時(shí)間,而且在有些情況下是不必要的,可以通過(guò)增加額外的標(biāo)準(zhǔn)來(lái)判斷是否有必要更新數(shù)據(jù)。回寫(xiě)式系統(tǒng)就是通過(guò)在Cache中的每一數(shù)據(jù)塊的標(biāo)志字段中加入一更新位,解決主存儲(chǔ)器不必要的寫(xiě)操作。比如,若Cache中的數(shù)據(jù)曾被CPU更新過(guò)但還未更新主存儲(chǔ)器,則該更新位被置1。每次CPU將一塊新內(nèi)容寫(xiě)入Cache時(shí),首先檢查Cache中該數(shù)據(jù)塊的更新位,若更新位為0,則將數(shù)據(jù)直接寫(xiě)入Cache;反之,若更新位為1,則先將Cache中的該項(xiàng)內(nèi)容寫(xiě)入到主存儲(chǔ)器中相應(yīng)的位置,再將新數(shù)據(jù)寫(xiě)回Cache中。
與直寫(xiě)式系統(tǒng)相比,回寫(xiě)式系統(tǒng)可省下一些不必要的立即回寫(xiě)操作,而在許多情況下這是很頻繁出現(xiàn)的。即使一個(gè)Cache被更新,若未被新的數(shù)據(jù)所取代,則沒(méi)有必要立刻進(jìn)行主存儲(chǔ)器的寫(xiě)操作。也就是說(shuō),實(shí)際寫(xiě)入主存儲(chǔ)器的次數(shù),可能少于CPU實(shí)際所執(zhí)行寫(xiě)入周期的次數(shù),但回寫(xiě)式系統(tǒng)的結(jié)構(gòu)較復(fù)雜,Cache也必須用額外的容量來(lái)存儲(chǔ)標(biāo)志。由于回寫(xiě)系統(tǒng)的高效率,現(xiàn)代的Cache大多采取這種方式進(jìn)行操作。
5.1.4 關(guān)于Write-through和Write-back
■ 對(duì)于磁盤(pán)操作來(lái)說(shuō)
write-through的意思是寫(xiě)操作根本不使用緩存,數(shù)據(jù)總是直接寫(xiě)入磁盤(pán),關(guān)閉寫(xiě)緩存,可釋放緩存用于讀操作(緩存被讀寫(xiě)操作共用)。
write-back的意思是數(shù)據(jù)不直接被寫(xiě)入磁盤(pán),而是先寫(xiě)入緩存,再由控制器將緩存內(nèi)未寫(xiě)入磁盤(pán)的數(shù)據(jù)寫(xiě)入磁盤(pán),從應(yīng)用程序的角度看,比等待完成磁盤(pán)寫(xiě)入操作要快得多,因此可以提高寫(xiě)性能。
但是write-back(write cache)方式通常在磁盤(pán)負(fù)荷較輕時(shí)速度更快。負(fù)荷重時(shí),每當(dāng)數(shù)據(jù)被寫(xiě)入緩存后,就要馬上再寫(xiě)入磁盤(pán)以釋放緩存來(lái)保存將要寫(xiě)入的新數(shù)據(jù),這時(shí)如果數(shù)據(jù)直接寫(xiě)入磁盤(pán),控制器會(huì)以更快的速度運(yùn)行。因此,負(fù)荷重時(shí),將數(shù)據(jù)先寫(xiě)入緩存反而會(huì)降低吞吐量。
■ 對(duì)于CPU內(nèi)部的cache緩沖模式來(lái)說(shuō)
Write-Through和Write-Back,前者是按順序來(lái)一個(gè)寫(xiě)一個(gè),而后者則是先將資料按一定數(shù)量保存在緩沖區(qū)中,然后將相同位置的數(shù)據(jù)一次性寫(xiě)出。舉例說(shuō)明:有一部電梯,如果按先入先出的原則,即write through模式,第一個(gè)人去3樓,第二個(gè)去2樓,第三個(gè)也去3樓,那么這電梯就得先到3樓,然后到2樓,再去3樓。但如果在write back模式下,電梯先到2樓把第二個(gè)人送出去,然后再到3樓把第一個(gè)人和第三個(gè)人送出去,效率顯然高多了。早期的cache只有write through模式,但現(xiàn)在的cache都使用write back模式了。
■ 其他的解釋
Write-Through:在write的時(shí)候,同步更新cache和memory中的數(shù)據(jù)。
Write-Back:在write的時(shí)候更新cache,但是memory中的數(shù)據(jù)不一定同步更新,只有當(dāng)cache到一定程度才會(huì)把cache中的數(shù)據(jù)刷到memory中,或者通過(guò)cache指令刷新,不會(huì)同步自動(dòng)刷新。
cache line的意思是假設(shè)你那條指令只要從memory中讀4個(gè)字節(jié),但是一般來(lái)說(shuō)你接下來(lái)的指令很有可能要讀這4個(gè)字節(jié)后面的數(shù)據(jù),所以一般硬件會(huì)多讀一些數(shù)據(jù)進(jìn)入cache,比如64字節(jié),那么這64字節(jié)就是一個(gè)cache line。而如果你這個(gè)cache line里的數(shù)據(jù)長(zhǎng)時(shí)間不被CPU訪問(wèn),那么這個(gè)cache line可能會(huì)被選中換出,這時(shí)候就必須把cache里被改過(guò)的信息寫(xiě)回memory了。
5.1.5 Cache替換策略
Cache和存儲(chǔ)器一樣具有兩種基本操作,即讀操作和寫(xiě)操作。當(dāng)CPU發(fā)出讀操作命令時(shí),根據(jù)它產(chǎn)生的主存地址分為兩種情形:一種是需要的數(shù)據(jù)已在Cache中,那么只需要直接訪問(wèn)Cache,從對(duì)應(yīng)單元中讀取信息到數(shù)據(jù)總線即可;另一種是需要的數(shù)據(jù)尚未裝入Cache,CPU需要從主存中讀取信息的同時(shí),Cache替換部件把該地址所在的那塊存儲(chǔ)內(nèi)容從主存復(fù)制到Cache中。若Cache中相應(yīng)位置已被字塊占滿,就必須去掉舊的字塊。常見(jiàn)的替換策略有以下兩種:
先進(jìn)先出策略(FIFO)
FIFO(First In First Out)策略總是把最先調(diào)入的Cache字塊替換出去,它不需要隨時(shí)記錄各個(gè)字塊的使用情況,較容易實(shí)現(xiàn)。缺點(diǎn)是經(jīng)常使用的塊,如一個(gè)包含循環(huán)程序的塊也可能由于它是最早的塊而被替換掉。
最近最少使用策略(LRU)
LRU(Least Recently Used)策略是把當(dāng)前近期Cache中使用次數(shù)最少的信息塊替換出去,這種替換算法需要隨時(shí)記錄Cache中字塊的使用情況。LRU的平均命中率比FIFO高,在組相聯(lián)映像方式中,當(dāng)分組容量加大時(shí),LRU的命中率也會(huì)提高。
5.1.6 使用Cache的必要性
所謂Cache即高速緩沖存儲(chǔ)器,它位于CPU與主存即DRAM之間,是通常由SRAM構(gòu)成的規(guī)模較小但存取速度很快的存儲(chǔ)器。目前計(jì)算機(jī)主要使用的內(nèi)存為DRAM,它具有價(jià)格低、容量大等特點(diǎn),但由于使用電容存儲(chǔ)信息,存取速度難以提高,而CPU每執(zhí)行一條指令都要訪問(wèn)一次或多次主存,DRAM的讀寫(xiě)速度遠(yuǎn)低于CPU速度,因此為了實(shí)現(xiàn)速度上的匹配,只能在CPU指令周期中插入wait狀態(tài),高速CPU處于等待狀態(tài)將大大降低系統(tǒng)的執(zhí)行效率。由于SRAM采用了與CPU相同的制作工藝,因此與DRAM相比,它的存取速度快,但體積大、功耗大、價(jià)格高,不可能也不必要將所有的內(nèi)存都采用SRAM。因此為了解決速度與成本的矛盾就產(chǎn)生了一種分級(jí)處理的方法,即在主存和CPU之間加裝一個(gè)容量相對(duì)較小的SRAM作為高速緩沖存儲(chǔ)器。當(dāng)采用Cache后,在Cache中保存著主存中部分內(nèi)容的副本(稱(chēng)為存儲(chǔ)器映像),CPU在讀寫(xiě)數(shù)據(jù)時(shí),首先訪問(wèn)Cache(由于Cache的速度與CPU相當(dāng),所以CPU可以在零等待狀態(tài)下完成指令的執(zhí)行),只有當(dāng)Cache中無(wú)CPU所需的數(shù)據(jù)時(shí)(這稱(chēng)之“未命中”,否則稱(chēng)為“命中”),CPU才去訪問(wèn)主存。而目前大容量Cache能使CPU訪問(wèn)Cache命中率高達(dá)90%~98%,從而大大提高了CPU訪問(wèn)數(shù)據(jù)的速度,提高了系統(tǒng)的性能。
5.1.7 使用Cache的可行性
對(duì)大量的典型程序的運(yùn)行情況分析結(jié)果表明,在一個(gè)較短的時(shí)間內(nèi),由程序產(chǎn)生的地址往往集中在存儲(chǔ)器邏輯地址空間的很小范圍內(nèi)。在多數(shù)情況下,指令是順序執(zhí)行的,因此指令地址的分布就是連續(xù)的,再加上循環(huán)程序段和子程序段要重復(fù)執(zhí)行多次,因此對(duì)這些地址的訪問(wèn)就自然具有時(shí)間上集中分布的趨向。數(shù)據(jù)的這種集中傾向不如指令明顯,但對(duì)數(shù)組的訪問(wèn)以及工作單元的選擇都可以使存儲(chǔ)器地址相對(duì)集中。這種對(duì)局部范圍的存儲(chǔ)器地址的頻繁訪問(wèn),而對(duì)此范圍以外的地址則訪問(wèn)甚少的現(xiàn)象稱(chēng)為程序訪問(wèn)的局部性。根據(jù)程序的局部性原理,在主存和CPU之間設(shè)置Cache,把正在執(zhí)行的指令地址附近的一部分指令或數(shù)據(jù)從主存裝入Cache中,供CPU在一段時(shí)間內(nèi)使用,是完全可行的。
5.2 ARM處理器中的Cache和Write Buffer
5.2.1 基本概念

5.2.2 Cache工作原理
在cache存儲(chǔ)系統(tǒng)中,把cache和主存儲(chǔ)器都劃分成相同大小的塊。主存地址由塊號(hào)B和塊內(nèi)地址W兩部分組成,cache地址由塊號(hào)b和塊內(nèi)地址w組成。當(dāng)CPU訪問(wèn)cache時(shí),CPU送來(lái)主存地址,放到主存地址寄存器中,通過(guò)地址變換部件把主存地址中的塊號(hào)B變換成cache的塊號(hào)b,并放到cache地址寄存器中,同時(shí)將主存地址中的塊內(nèi)地址W直接作為cache的塊內(nèi)地址w裝入cache地址寄存器中,如果變換成功(又叫cache命中),就用得到的cache地址去訪問(wèn)cache,從cache中取出數(shù)據(jù)送到CPU中;如果變換不成功(cache不命中),則產(chǎn)生cache失效信息,并且用主存地址訪問(wèn)主存儲(chǔ)器,從主存儲(chǔ)器中讀出一個(gè)字送往CPU,同時(shí)把包含該字在內(nèi)的一整塊數(shù)據(jù)都從主存儲(chǔ)器讀出來(lái)裝入cache,這時(shí),如果cache已經(jīng)滿了,則要采用某種cache替換策略把不常用的塊先調(diào)出到主存儲(chǔ)中相應(yīng)的塊中,以便騰出空間來(lái)存放新調(diào)入的塊。由于程序具有局部性特點(diǎn),每次塊失效時(shí)都把一塊(由多個(gè)字組成)調(diào)入到cache中,能夠提高cache的命中率。
5.2.3 Cache地址映射和變換方法
地址的映射和變換是密切相關(guān)的,采用什么樣的地址映射方法就必然有與這種映射方法相對(duì)應(yīng)的地址變換方法。無(wú)論采用什么樣的地址映射方式和地址變換方式,都要把主存和cache劃分成同樣大小的存儲(chǔ)單位,每個(gè)存儲(chǔ)單位成為“塊”,在進(jìn)行地址映射和變換時(shí),都是以塊為單位進(jìn)行的。常用的映射方式和變換方式有以下3種:
■ 全相聯(lián)映射方式
主存中任意一塊可以映射到cache中的任意一塊上。
■ 直接映射方式
主存中一塊只能映射到cache中的一個(gè)特定塊上,假定主存的塊號(hào)為B,cache的塊號(hào)為b,cache的總塊數(shù)為Cb,則它們之間的映射關(guān)系可以用下面的公式表示:
b = B mode Cb
■ 組相連映射方式
在這種相聯(lián)的地址映射和變換方式中,把主存和cache按同樣大小劃分成組(set),每個(gè)組都由相同塊數(shù)組成。從主存的組到cache的組之間采用直接映射方式,在主存中的組與cache中的組之間建立好映射關(guān)系之后,在兩個(gè)對(duì)應(yīng)的組內(nèi)部采用全相聯(lián)的映射方式。
在ARM處理器中,主存與cache采用組相聯(lián)地址映射和變換方式,如果cache的塊大小為2L,則同一塊中各地址的bit[31:L]是相同的。如果cache中組的大小(每組中包含的塊數(shù))為2S,則虛擬地址的bit[L+S-1:L]用于選擇cache中的某個(gè)組,而虛擬地址中其他位[31:L+S]包含了一些標(biāo)志。
將cache每組中的塊數(shù)稱(chēng)為組容量(set-associativity),當(dāng)組容量等于cache中的總塊數(shù)時(shí),對(duì)應(yīng)的映射方式為全相聯(lián)映射方式;當(dāng)組容量等于1時(shí),對(duì)應(yīng)的映射方式為直接映射方式;當(dāng)組容量為其他值時(shí),稱(chēng)為組相聯(lián)映射方式。
在組相聯(lián)映射方式中,cache的大小CACHE_SIZE(字節(jié)數(shù))可以通過(guò)下面的公式來(lái)計(jì)算:
CACHE_SIZE = LINELEN*ASSOCIATIVITY*NSETS
其中,LINELEN為cache塊(line)大小;ASSOCIATIVITY為組容量;NSETS為cache的組數(shù)。
5.2.4 Cache分類(lèi)
根據(jù)不同的分類(lèi)標(biāo)準(zhǔn)可以按以下3種方法對(duì)Cache進(jìn)行分類(lèi)。
1)數(shù)據(jù)cache和指令cache
● 指令cache:指令預(yù)取時(shí)使用的cache。
● 數(shù)據(jù)cache:數(shù)據(jù)讀寫(xiě)時(shí)使用的cache。
如果一個(gè)存儲(chǔ)系統(tǒng)中指令cache和數(shù)據(jù)cache是同一個(gè)cache,稱(chēng)系統(tǒng)使用了統(tǒng)一的cache。反之,如果是分開(kāi)的,那么稱(chēng)系統(tǒng)使用了獨(dú)立的cache;如果系統(tǒng)中只包含指令cache或者數(shù)據(jù)cache,那么在配制系統(tǒng)時(shí)可以作為獨(dú)立的cache使用了。
使用獨(dú)立的數(shù)據(jù)cache和指令cache,可以在同一個(gè)時(shí)鐘周期中讀取指令和數(shù)據(jù),而不需要雙端口的cache,但這時(shí)候要注意保證指令和數(shù)據(jù)的一致性。
2)寫(xiě)通(write-through)cache和寫(xiě)回(write-back)cache
● 寫(xiě)回cache
CPU在執(zhí)行寫(xiě)操作時(shí),被寫(xiě)的數(shù)據(jù)只寫(xiě)入cache,不寫(xiě)入主存,僅當(dāng)需要替換時(shí),才把已經(jīng)修改的cache塊寫(xiě)回到主存中,在采用這種更新算法的cache快表中,一般有一個(gè)修改位,當(dāng)一塊中的任何一個(gè)單元被修改時(shí),這一塊的修改位被設(shè)置為1,否則這一塊的修改位仍保持為0;在需要替換這一塊時(shí),如果對(duì)應(yīng)的修改位為1,則必須先把這一塊寫(xiě)到主存中去之后,才能調(diào)入新的塊,否則,只要用新調(diào)入的塊覆蓋該塊即可。
● 寫(xiě)通cache
CPU在執(zhí)行寫(xiě)操作時(shí),必須把數(shù)據(jù)同時(shí)寫(xiě)入cache和主存,這樣,在cache的快表中就不需要“修改位”,當(dāng)某一塊需要替換時(shí),也不必把這一塊寫(xiě)回到主存中,新調(diào)入的塊可以立即把這一塊覆蓋掉。
寫(xiě)回cache和寫(xiě)通cache的優(yōu)缺點(diǎn)比較如表5-1所示。

表5-1寫(xiě)回cache與寫(xiě)通cache比較
3)讀時(shí)分配(read-allocate)cache和寫(xiě)時(shí)分配(write-allocate)cache
● 讀時(shí)分配cache
當(dāng)進(jìn)行數(shù)據(jù)寫(xiě)操作時(shí),如果cache沒(méi)命中,只是簡(jiǎn)單地將數(shù)據(jù)寫(xiě)入主存中,主要在數(shù)據(jù)讀取時(shí),才進(jìn)行cache內(nèi)容預(yù)取。
● 寫(xiě)時(shí)分配cache
當(dāng)進(jìn)行數(shù)據(jù)寫(xiě)操作時(shí),如果cache未命中,cache系統(tǒng)將會(huì)進(jìn)行cache內(nèi)容預(yù)取,從主存中將相應(yīng)的塊讀取到cache中相應(yīng)的位置,并執(zhí)行寫(xiě)操作,把數(shù)據(jù)寫(xiě)入到cache中。對(duì)于寫(xiě)通類(lèi)型的cache,數(shù)據(jù)將會(huì)同時(shí)寫(xiě)入到主存中,對(duì)于寫(xiě)回類(lèi)型的cache,數(shù)據(jù)將在合適的時(shí)候?qū)懟氐街鞔嬷小?/p>
由于寫(xiě)操作分配cache增加了cache內(nèi)容預(yù)取的次數(shù),增加了寫(xiě)操作的開(kāi)銷(xiāo),但同時(shí)可能提高cache的命中率,因此這種技術(shù)對(duì)于系統(tǒng)整體性能的影響與程序中讀操作和寫(xiě)操作的數(shù)量有關(guān)。
5.2.5 Cache替換算法
隨機(jī)替換算法
通過(guò)一個(gè)偽隨機(jī)數(shù)發(fā)生器產(chǎn)生一個(gè)偽隨機(jī)數(shù),用新塊編號(hào)為該偽隨機(jī)數(shù)的cache塊替換掉。這種算法很簡(jiǎn)單且容易實(shí)現(xiàn),但沒(méi)有考慮程序的局部性特點(diǎn),也沒(méi)有利用歷史上塊地址流的分布情況,因而效果較差,同時(shí)這種算法不易預(yù)測(cè)最壞情況下cache的性能。
輪轉(zhuǎn)替換算法
維護(hù)一個(gè)邏輯的計(jì)數(shù)器,利用該計(jì)數(shù)器依次選擇將要被替換出去的cache塊。這種算法容易預(yù)測(cè)在最壞情況下cache的性能。但在程序發(fā)生很小的變化時(shí),可能造成cache平均性能的急劇變化,這是它的一個(gè)明顯缺點(diǎn)。
5.2.6 Cache內(nèi)容鎖定
“鎖定”在cache中的塊在常規(guī)的cache替換操作中不會(huì)被替換,但當(dāng)通過(guò)C7控制cache中特定的塊時(shí),比如使某特定的塊無(wú)效時(shí),這些被“鎖定”在cache中的塊也將受到相應(yīng)的影響。
用LINELEN表示cache的塊大小,用ASSOCIATIVITY表示每個(gè)cache組中的塊數(shù),用NSETS表示cache中的組數(shù)。cache的“鎖定”是以鎖定塊(lockdown block)為單位進(jìn)行的。每個(gè)鎖定塊中包括cache中每個(gè)組中各一個(gè)塊,這樣cache中最多可有ASSOCIATIVITY個(gè)鎖定塊,編號(hào)為0~ASSOCIATIVITY-1。其中編號(hào)為0的鎖定塊中包含cache組0中的0號(hào)塊、組1中的0號(hào)塊,一直到ASSOCIATIVITY-1中的0號(hào)塊。
“N鎖定塊被鎖定”是指編號(hào)為0~N-1的鎖定塊被鎖定在cache中,編號(hào)為N~ASSOCIATIVITY-1的鎖定塊可用于正常的cache替換操作。
實(shí)現(xiàn)N鎖定塊被鎖定的操作步驟說(shuō)明如下:
1)確保在整個(gè)鎖定過(guò)程中不會(huì)發(fā)生異常中斷,否則必須保證與該異常中斷相關(guān)的代碼和數(shù)據(jù)位于非緩沖(uncachable)的存儲(chǔ)區(qū)域。
2)如果鎖定的是指令cache或者統(tǒng)一的cache,必須保證鎖定過(guò)程所執(zhí)行的代碼位于非緩沖的存儲(chǔ)區(qū)域。
3)如果鎖定的是數(shù)據(jù)cache或者統(tǒng)一的cache,必須保證鎖定過(guò)程所涉及的數(shù)據(jù)位于非緩沖的存儲(chǔ)區(qū)域。
4)確保將要被鎖定的代碼和數(shù)據(jù)位于緩沖(cachable)的存儲(chǔ)區(qū)域。
5)確保將要被鎖定的代碼和數(shù)據(jù)尚未在cache中,可以通過(guò)使無(wú)效相應(yīng)cache中的塊達(dá)到這一目的。
6)對(duì)于I=0到N-1,重復(fù)執(zhí)行下面的操作:
a)Index=I寫(xiě)入CP15的C9寄存器,當(dāng)使用B格式的鎖定寄存器時(shí),令L=1;
b)在鎖定塊I中的各cache塊內(nèi)容從主存中預(yù)取到cache中,對(duì)于數(shù)據(jù)cache和統(tǒng)一cache可以使用LDR指令讀取一個(gè)位于該塊中的數(shù)據(jù),將塊預(yù)取到cache中;對(duì)于指令cache,通過(guò)操作CP15的C7寄存器,將相應(yīng)的塊預(yù)取到指令cache中。
7)將index=N寫(xiě)入CP15的C9寄存器,當(dāng)使用B格式的鎖定寄存器時(shí),令L=0。
解除N鎖定塊被鎖定只須執(zhí)行以下操作:
將index=0寫(xiě)入CP15的C9寄存器,當(dāng)使用B格式的鎖定寄存器時(shí),令L=0。
5.2.7 MMU映射描述符中B位和C位的含義
見(jiàn)表5-2。
表5-2 存儲(chǔ)空間緩沖特性的控制位

5.2.8 Cache和Writer Buffer編程接口
ARM處理器中的Cache和Write Buffer操作是通過(guò)寫(xiě)CP15的C7寄存器來(lái)實(shí)現(xiàn)的。訪問(wèn)CP15的C7寄存器的指令格式如下所示:
mcr p15, 0, <rd>, <c7>, crm, <opcode_2>
ARM處理器中的Cache和Write Buffer操作指令如表5-3所示。
表5-3 ARM處理器Cache和Write Buffer操作指令

5.3 ARM處理器的快速上下文切換技術(shù)
5.3.1 FCSE概述
FCSE(Fast Context Switch Extension,快速上下文切換)位于CPU和MMU之間,如果兩個(gè)進(jìn)程使用了同樣的虛擬地址空間,則對(duì)CPU而言,兩個(gè)進(jìn)程使用了同樣的虛擬地址空間。快速上下文切換機(jī)構(gòu)對(duì)各進(jìn)程的虛擬地址進(jìn)行變換,這樣系統(tǒng)中除了CPU之外的部分看到的是經(jīng)過(guò)快速上下文切換機(jī)構(gòu)變換的虛擬地址。快速上下文切換機(jī)構(gòu)將各進(jìn)程的虛擬空間變換成不同的虛擬空間,這樣在進(jìn)行進(jìn)程間切換時(shí)就不需要進(jìn)行虛擬地址到物理地址的重映射。
快速上下文切換(FCSE)通過(guò)修改系統(tǒng)中不同進(jìn)程的虛擬地址,避免在進(jìn)行進(jìn)程間切換時(shí)造成的虛擬地址到物理地址的重映射,這樣就減少了重建MMU、使cache和TLB無(wú)效、重建cache和TLB內(nèi)容等操作的巨大開(kāi)銷(xiāo),從而提高系統(tǒng)的性能。
5.3.2 FCSE原理
在ARM系統(tǒng)中,4GB的虛擬空間被分成128個(gè)進(jìn)程空間塊,每個(gè)進(jìn)程空間塊大小為32MB。每個(gè)進(jìn)程空間塊中可以包含一個(gè)進(jìn)程,該進(jìn)程可以使用虛擬地址空間0x00000000~0x01ffffff,這個(gè)地址范圍也就是CPU看到的進(jìn)程的虛擬空間。系統(tǒng)128個(gè)進(jìn)程空間塊的編號(hào)為0~127,編號(hào)為 I的進(jìn)程空間塊中的進(jìn)程實(shí)際使用的虛擬地址空間為 I*0x02000000到 I*0x02000000+0x01ffffff,這個(gè)地址空間是系統(tǒng)中除了CPU之外的其他部分看到的該進(jìn)程所占用的虛擬地址空間。
快速上下文切換機(jī)構(gòu)將CPU發(fā)出的每個(gè)虛擬地址按照上述的規(guī)則進(jìn)行變換,然后發(fā)送到系統(tǒng)中的其他部分,變換過(guò)程如圖5-1所示。

圖5-1 FCSE原理框圖
圖5-1中地址VA到MVA的變換算法如下:
if (VA[31:25] == 0b0000000) then MVA = VA | (PID <<25) else MVA = VA
如果VA[31:25]不等于0,說(shuō)明地址VA是本進(jìn)程用于訪問(wèn)其他進(jìn)程中的數(shù)據(jù)和指令的虛擬地址,此時(shí)被訪問(wèn)進(jìn)程的PID不能為0。相反如果VA[31:25]等于0,說(shuō)明要訪問(wèn)的地址VA在該進(jìn)程自身地址空間內(nèi),所以要進(jìn)行進(jìn)程上下文切換,將VA轉(zhuǎn)換成MVA,其中上面公式中的PID是該進(jìn)程的PID號(hào)。
5.3.3 FCSE編程接口
ARM處理器用CP15協(xié)處理器的C13寄存器來(lái)實(shí)現(xiàn)FCSE功能,C13寄存器的介紹詳見(jiàn)第4.1.2節(jié)“CP15寄存器介紹”。當(dāng)要進(jìn)行進(jìn)程切換時(shí),首先清空寫(xiě)緩存,再把新進(jìn)程的頁(yè)表地址寫(xiě)入CP15的C2寄存器,然后把新進(jìn)程的PID號(hào)寫(xiě)入CP15的C13寄存器的最高7位即可。如果處理器不支持FCSE功能,那么使cache和TLBs無(wú)效,然后系統(tǒng)要重建cache和TLBs。下面我們比較一下XScale處理器以及ARMv6處理器中進(jìn)程切換中的內(nèi)存切換操作函數(shù)的區(qū)別:
XScale處理器進(jìn)程切換中的內(nèi)存切換操作函數(shù)如下所示:
.align 5 ENTRY(cpu_xscale_switch_mm) clean_d_cache r1, r2;使r1所指地址到r2所指地址之間數(shù)據(jù)cache無(wú)效 mcr p15, 0, ip, c7, c5, 0;使系統(tǒng)全部指令cache無(wú)效 mcr p15, 0, ip, c7, c10, 4;清空寫(xiě)緩存Write Buffer mcr p15, 0, r0, c2, c0, 0;裝入新的頁(yè)表地址 mcr p15, 0, ip, c8, c7, 0;使系統(tǒng)全部數(shù)據(jù)和指令TLBs cache無(wú)效 cpwait_ret lr, ip;返回
ARMv6處理器進(jìn)程切換中的內(nèi)存切換操作函數(shù)如下所示:
ENTRY(cpu_v6_switch_mm) mov r2, #0 ldr r1, [r1, #MM_CONTEXT_ID];獲取新進(jìn)程的PID號(hào),該P(yáng)ID號(hào)其實(shí)就是新進(jìn)程的 struct mm_struct結(jié)構(gòu)中的mm_context_t成員結(jié)構(gòu)context的id mcr p15, 0, r2, c7, c10, 4;清空寫(xiě)緩存Write Buffer mcr p15, 0, r0, c2, c0, 0 ;裝入新的頁(yè)表地址 mcr p15, 0, r1, c13, c0, 1;設(shè)置上下文PID號(hào) mov pc, lr;返回
在ARM處理器中只有ARMv6以上版本的處理器才支持FCSE功能。
- 輕松學(xué)會(huì)單片機(jī)
- ABAQUS 2016有限元分析從入門(mén)到精通
- TinyML:基于TensorFlow Lite在Arduino和超低功耗微控制器上部署機(jī)器學(xué)習(xí)
- 單片機(jī)應(yīng)用基礎(chǔ)教程(第二版)
- 單片機(jī)應(yīng)用技術(shù)
- 嵌入式軟件自動(dòng)化測(cè)試
- 嵌入式虛擬化技術(shù)與應(yīng)用:ACRN開(kāi)源項(xiàng)目實(shí)踐
- PIC單片機(jī)常用模塊與綜合系統(tǒng)設(shè)計(jì)實(shí)例精講
- AVR單片機(jī)實(shí)用程序設(shè)計(jì)
- 51單片機(jī)工程師是怎樣煉成的:基于C語(yǔ)言+Proteus仿真
- STM32W無(wú)線射頻Zigbee單片機(jī)原理與應(yīng)用
- 單片機(jī)應(yīng)用技術(shù)實(shí)訓(xùn)指導(dǎo)
- 計(jì)算機(jī)與嵌入式系統(tǒng)架構(gòu)
- 愛(ài)上單片機(jī)(第4版)
- 基于ARM Cortex-M0+的CW32嵌入式開(kāi)發(fā)實(shí)戰(zhàn)