?
15.5??存儲(chǔ)管理單元MMU
在創(chuàng)建多任務(wù)嵌入式系統(tǒng)時(shí),最好有一個(gè)簡(jiǎn)單的方式來(lái)編寫(xiě)、裝載及運(yùn)行各自獨(dú)立的任務(wù)。目前大多數(shù)的嵌入式系統(tǒng)不再使用自己定制的控制系統(tǒng),而使用操作系統(tǒng)來(lái)簡(jiǎn)化這個(gè)過(guò)程。較高級(jí)的操作系統(tǒng)采用基于硬件的存儲(chǔ)管理單元MMU來(lái)實(shí)現(xiàn)上述操作。
MMU提供的一個(gè)關(guān)鍵服務(wù)是使各個(gè)任務(wù)作為各自獨(dú)立的程序在其自己的私有存儲(chǔ)空間中運(yùn)行。在帶MMU的操作系統(tǒng)控制下,運(yùn)行的任務(wù)無(wú)須知道其他與之無(wú)關(guān)的任務(wù)的存儲(chǔ)需求情況,這就簡(jiǎn)化了各個(gè)任務(wù)的設(shè)計(jì)。
MMU提供了一些資源以允許使用虛擬存儲(chǔ)器(將系統(tǒng)物理存儲(chǔ)器重新編址,可將其看成一個(gè)獨(dú)立于系統(tǒng)物理存儲(chǔ)器的存儲(chǔ)空間)。MMU作為轉(zhuǎn)換器,將程序和數(shù)據(jù)的虛擬地址(編譯時(shí)的連接地址)轉(zhuǎn)換成實(shí)際的物理地址,即在物理主存中的地址。這個(gè)轉(zhuǎn)換過(guò)程允許運(yùn)行的多個(gè)程序使用相同的虛擬地址,而各自存儲(chǔ)在物理存儲(chǔ)器的不同位置。
這樣存儲(chǔ)器就有兩種類(lèi)型的地址:虛擬地址和物理地址。虛擬地址由編譯器和連接器在定位程序時(shí)分配;物理地址用來(lái)訪問(wèn)實(shí)際的主存硬件模塊(物理上程序存在的區(qū)域)。
15.5.1??MMU概述
內(nèi)存管理單位MMU對(duì)處理器內(nèi)存提供了很好的管理。這種管理主要是通過(guò)一個(gè)叫作傳輸表的數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)的。這個(gè)傳輸表存在于內(nèi)存中,它有多個(gè)稱(chēng)為Entry的入口,每個(gè)入口定義了存儲(chǔ)空間的一個(gè)頁(yè),頁(yè)的大小從1KB到1MB,同時(shí)定義了這些頁(yè)的屬性。
ARM系統(tǒng)中,MMU主要完成以下工作:
①?虛擬存儲(chǔ)空間到物理存儲(chǔ)空間的映射,它能夠?qū)崿F(xiàn)從虛擬地址到物理地址的轉(zhuǎn)換;
②?存儲(chǔ)器訪問(wèn)權(quán)限的控制;
③?設(shè)置虛擬存儲(chǔ)空間的緩存特性。
MMU通過(guò)它的協(xié)處理器寄存器來(lái)確定傳輸表在內(nèi)存中的位置,并通過(guò)這些寄存器來(lái)向ARM處理器提供內(nèi)存訪問(wèn)錯(cuò)誤信息。
從虛擬地址到物理地址的變換過(guò)程是查詢(xún)傳輸表的過(guò)程,由于傳輸表放在內(nèi)存中,這個(gè)查詢(xún)過(guò)程通常代價(jià)很大。這個(gè)訪問(wèn)時(shí)間通常是1~2個(gè)內(nèi)存周期。為了減少平均內(nèi)存訪問(wèn)時(shí)間,ARM結(jié)構(gòu)體系中采用一個(gè)容量更小(通常為8~16個(gè)字)、訪問(wèn)速度和CPU中通用寄存器相當(dāng)?shù)拇鎯?chǔ)器件來(lái)存放當(dāng)前訪問(wèn)需要的地址變換條目,它是一個(gè)小容量的Cache。這個(gè)小容量的頁(yè)表Cache稱(chēng)為T(mén)LB(Translation?Lookaside?Buffer)。
注意 |
如果系統(tǒng)中使用數(shù)據(jù)和指令統(tǒng)一存儲(chǔ)系統(tǒng),那么TLB也將是統(tǒng)一的。如果系統(tǒng)是數(shù)據(jù)和指令分開(kāi)的存儲(chǔ)系統(tǒng),那么TLB也將分為數(shù)據(jù)TLB和指令TLB。 |
MMU可以將整個(gè)存儲(chǔ)空間分為最多16個(gè)域(domain)。每個(gè)域?qū)?yīng)一定的內(nèi)存區(qū)域,該內(nèi)存區(qū)域具有相同的訪問(wèn)控制屬性。MMU中寄存器c3用于控制與域有關(guān)的屬性配置。
表15.20列出了與MMU有關(guān)的協(xié)處理器寄存器及其作用。
表15.20 與MMU有關(guān)的協(xié)處理器寄存器
協(xié)處理器寄存器 |
作????用 |
c1中某些位 |
配置MMU中的一些操作 |
c2 |
保存內(nèi)存中頁(yè)表基地址 |
c3 |
設(shè)置域訪問(wèn)權(quán)限 |
c4 |
保留 |
c5 |
內(nèi)存訪問(wèn)失效狀態(tài)標(biāo)準(zhǔn) |
c6 |
內(nèi)存訪問(wèn)失效時(shí)失效地址 |
c8 |
控制與清除TLB內(nèi)容相關(guān)的操作 |
c10 |
控制與鎖定TLB內(nèi)容相關(guān)的操作 |
?
15.5.2??MMU與MPU
在ARM體系結(jié)構(gòu)中,MMU將MPU的功能大大地增加,使系統(tǒng)內(nèi)存管理更加靈活、方便。在MPU中引入了“域”的概念來(lái)管理內(nèi)存,而且域是在專(zhuān)用寄存器中設(shè)置的。而MMU將域設(shè)置從寄存器移到了內(nèi)存單位,這樣使域的設(shè)置更加靈活,但同時(shí)也增加了系統(tǒng)訪問(wèn)時(shí)間。
另外,除了提供內(nèi)存保護(hù)功能外,MMU還增加了虛擬地址到物理地址的映射。在只有MPU的系統(tǒng)中,每個(gè)任務(wù)被編譯和運(yùn)行在彼此不同的、固定的主存地址空間,每個(gè)任務(wù)只能在一個(gè)進(jìn)程空間中運(yùn)行,任何兩個(gè)任務(wù)都不能在主存中有重疊地址。為了運(yùn)行一個(gè)任務(wù),一個(gè)保護(hù)區(qū)域被設(shè)置在固定地址的程序上,以允許任務(wù)訪問(wèn)由該區(qū)域定義的一段存儲(chǔ)空間。保護(hù)區(qū)域的放置使得該任務(wù)得以運(yùn)行,而其他任務(wù)空間被保護(hù)。
而使用MMU中虛擬地址到物理地址的映射功能,即使任務(wù)被編譯、連接、運(yùn)行在主存中有重疊地址的區(qū)域中,它們?nèi)匀豢梢赃\(yùn)行。MMU中對(duì)虛存的支持可使構(gòu)建后的嵌入式系統(tǒng)具有多個(gè)虛擬存儲(chǔ)映射和單個(gè)物理存儲(chǔ)器映射。每個(gè)任務(wù)擁有自己的虛擬存儲(chǔ)器映射,以編譯和連接組成此任務(wù)的代碼和數(shù)據(jù)。內(nèi)核層管理各個(gè)任務(wù)在物理存儲(chǔ)器中的放置,使得它們?cè)谖锢泶鎯?chǔ)器中擁有彼此不同的地址,這個(gè)地址與其設(shè)計(jì)時(shí)的虛擬運(yùn)行地址不一樣。
15.5.3??內(nèi)存訪問(wèn)過(guò)程
當(dāng)處理器產(chǎn)生一個(gè)內(nèi)存訪問(wèn)請(qǐng)求時(shí),將傳輸一個(gè)虛擬地址給MMU,MMU首先遍歷TLB(如果使用分離的存儲(chǔ)系統(tǒng),它將分別遍歷數(shù)據(jù)TLB和指令TLB)。如果TLB中不保護(hù)虛擬地址入口(Entry),那么它將轉(zhuǎn)入保存在內(nèi)存中的傳輸主表,來(lái)獲得所有訪問(wèn)地址的物理地址和訪問(wèn)權(quán)限。一旦訪問(wèn)成功,它將新的虛擬地址入口(Entry)信息保存在TLB中,以備下次查詢(xún)使用。
當(dāng)?shù)玫搅说刂纷儞Q入口(Entry)后,將進(jìn)行以下操作:
①?根據(jù)入口(Entry)中的C(cachable)控制位和B(Bufferable)控制位決定是否緩存該內(nèi)存訪問(wèn)結(jié)果。
②?根據(jù)訪問(wèn)權(quán)限控制位和域訪問(wèn)控制位確定該內(nèi)存訪問(wèn)是否被允許。如果該內(nèi)存訪問(wèn)不被允許,CP15向ARM處理器報(bào)告存儲(chǔ)訪問(wèn)中止。
③?對(duì)應(yīng)不允許緩存的存儲(chǔ)訪問(wèn),直接得到物理地址訪問(wèn)內(nèi)存。對(duì)于允許緩存的存儲(chǔ)訪問(wèn),如果在Cache命中,則忽略物理地址;如果Cache沒(méi)有命中,則使用物理地址訪問(wèn)內(nèi)存,并把該數(shù)據(jù)塊讀到Cache中。
圖15.23為帶Cache的MMU存儲(chǔ)訪問(wèn)示意圖。
圖15.23??帶Cache的MMU存儲(chǔ)訪問(wèn)示意圖
?
15.5.4??MMU的使能與禁止
MMU的使能/禁止可以通過(guò)CP15寄存器的c1的bit[0]來(lái)控制。
·??bit[0]=0,MMU禁止。
·??bit[0]=1,MMU使能。
下面的例子顯示了典型的MMU使能過(guò)程。
【例15.4】典型的MMU使能過(guò)程。
MRC??p15,0,r0,c1,0,0
ORR??r0,#01
MCR??p15,0,r0,c1,0,0
當(dāng)MMU被禁止時(shí),存儲(chǔ)訪問(wèn)執(zhí)行下列過(guò)程。
①?當(dāng)禁止MMU時(shí),存儲(chǔ)系統(tǒng)是否支持Cache和寫(xiě)緩存,根據(jù)不同芯片設(shè)計(jì)不同而有所不同(ARM公司將設(shè)計(jì)權(quán)交給芯片廠商)。
·??如果芯片規(guī)定當(dāng)禁止MMU時(shí)禁止Cache和寫(xiě)緩存,則存儲(chǔ)訪問(wèn)不考慮C、B控制位。
·??如果芯片規(guī)定禁止MMU時(shí)使能Cache和寫(xiě)緩存,則數(shù)據(jù)訪問(wèn)被視為無(wú)Cache(uncachable)和寫(xiě)緩存(unbufferable)的,即C=0、B=0。讀取指令時(shí),如果系統(tǒng)是統(tǒng)一的TLB,則C=0;如果使用分開(kāi)的TLB,則C=1。
②?存儲(chǔ)訪問(wèn)不受權(quán)限控制,MMU也不會(huì)產(chǎn)生存儲(chǔ)訪問(wèn)中止信號(hào)。
③?所有物理地址和虛擬地址相等,即使用平板存儲(chǔ)模式。
使能/禁止MMU時(shí)需要注意以下幾個(gè)問(wèn)題。
·??在使能MMU之前,正確的傳輸表要在內(nèi)存中事先建立,CP15的相關(guān)寄存器必須完成初始化操作。
·??如果使用的不是平板存儲(chǔ)模式(物理地址和對(duì)應(yīng)虛擬地址相等),在禁止/使能MMU時(shí),虛擬地址和物理地址的對(duì)應(yīng)關(guān)系發(fā)生變化,這時(shí)應(yīng)該清除(Flush)Cache中的當(dāng)前地址變換入口(Entry)。
·??如果完成禁止/使能MMU的代碼的物理地址和虛擬地址不同,則禁止/使能MMU將帶來(lái)很大麻煩,因此建議完成使能/禁止MMU的代碼的物理地址和虛擬地址相同。
15.5.5??虛擬地址到物理地址的轉(zhuǎn)換
(1)地址重定位
為了使任務(wù)有各自的虛擬存儲(chǔ)器映射,MMU硬件采用地址重定位,在地址訪問(wèn)主存之前,轉(zhuǎn)換有處理器輸出的虛擬地址。當(dāng)處理器產(chǎn)生一個(gè)虛擬地址時(shí),MMU取出這個(gè)虛擬地址的高位,遍歷傳輸表,從而形成一個(gè)物理地址。
虛擬存儲(chǔ)空間到物理存儲(chǔ)空間的映射是以?xún)?nèi)存塊為單位進(jìn)行的。也就是說(shuō),虛擬存儲(chǔ)空間中一塊連續(xù)的存儲(chǔ)空間被映射到物理存儲(chǔ)空間中同樣大小的一塊連續(xù)存儲(chǔ)空間。
虛擬存儲(chǔ)空間到物理存儲(chǔ)空間地址重映射過(guò)程如圖15.24所示。
圖15.24??虛擬存儲(chǔ)空間到物理存儲(chǔ)空間地址重映射過(guò)程
ARM支持的存儲(chǔ)塊的大小有以下幾種。
·??段(Sections):大小為1M的存儲(chǔ)塊。
·??大頁(yè)(Large?pages):大小為64KB。
·??小頁(yè)(Small?pages):大小為4KB。
·??極小頁(yè)(Tiny?Pages):大小為1KB。
段和大頁(yè)只需通過(guò)一次映射就可以將虛擬地址轉(zhuǎn)換成物理地址,也可以根據(jù)需要增加一級(jí)映射,采用兩級(jí)映射的方式再將大頁(yè)分成16KB的子頁(yè),小頁(yè)分成1KB的子頁(yè)。極小頁(yè)不能再分,只能以1KB大小的整頁(yè)為單位。
ARM在內(nèi)存中存在兩級(jí)頁(yè)表以實(shí)現(xiàn)上述地址映射過(guò)程。
·??一級(jí)頁(yè)表:一級(jí)頁(yè)表包括兩種類(lèi)型的頁(yè)表項(xiàng),即保持指向二級(jí)頁(yè)表起始地址的頁(yè)表項(xiàng)和保存用于轉(zhuǎn)換段(Section)地址的頁(yè)表項(xiàng)。一級(jí)頁(yè)表也稱(chēng)為段頁(yè)表(section?page?table)。
·??二級(jí)頁(yè)表:二級(jí)頁(yè)表包含以大頁(yè)和小頁(yè)為單位的地址變換頁(yè)表項(xiàng)。
一級(jí)頁(yè)表將4G地址空間劃分為多個(gè)1MB的段(Section),因此一級(jí)頁(yè)表包含4096個(gè)頁(yè)表項(xiàng)。一級(jí)頁(yè)表是一個(gè)混合表,可以作為二級(jí)頁(yè)表的目錄表,也可以作為用于轉(zhuǎn)換1MB段(也可視為1MB的虛擬頁(yè))的普通頁(yè)表。當(dāng)一級(jí)頁(yè)表作為頁(yè)目錄時(shí),其頁(yè)表項(xiàng)包含的是代表1MB虛擬空間的二級(jí)頁(yè)表指針。二級(jí)頁(yè)表分為粗頁(yè)表(Coarse)和細(xì)頁(yè)表(Fine)。當(dāng)一級(jí)頁(yè)表用于轉(zhuǎn)換一個(gè)1MB的段時(shí),其頁(yè)表項(xiàng)包含的是物理存儲(chǔ)器中對(duì)應(yīng)1MB頁(yè)幀(page?frame)的首地址。
注意 |
目錄頁(yè)表項(xiàng)和1MB的段頁(yè)表項(xiàng)可以共存于一級(jí)頁(yè)表中。 |
一個(gè)粗二級(jí)頁(yè)表(Coarse)包含256個(gè)頁(yè)表項(xiàng),占有1KB的主存空間,每個(gè)頁(yè)表項(xiàng)將一個(gè)4KB的虛擬存儲(chǔ)塊轉(zhuǎn)換成一個(gè)4KB的物理存儲(chǔ)塊。粗二級(jí)頁(yè)表支持4KB和64KB的頁(yè),頁(yè)表項(xiàng)包含的是4KB或64KB的頁(yè)幀地址。如果轉(zhuǎn)換的是一個(gè)64KB的頁(yè),則對(duì)于每個(gè)64KB的頁(yè),同一個(gè)頁(yè)表項(xiàng)必須在頁(yè)表中重復(fù)16次。
一個(gè)細(xì)二級(jí)頁(yè)表(Fine)有1024個(gè)頁(yè)表項(xiàng),占有4KB的主存空間,每個(gè)頁(yè)表項(xiàng)轉(zhuǎn)換一個(gè)1KB的存儲(chǔ)塊。細(xì)頁(yè)表支持1KB、4KB、64KB虛存頁(yè),每個(gè)頁(yè)表項(xiàng)包含1KB、4KB或64KB的物理頁(yè)幀首地址。如果轉(zhuǎn)換的是4KB的頁(yè),則同一個(gè)頁(yè)表項(xiàng)必須在頁(yè)表中連續(xù)重復(fù)4次;如果轉(zhuǎn)換的是64KB的頁(yè),則同一個(gè)頁(yè)表項(xiàng)需要在頁(yè)表中連續(xù)重復(fù)64次。
?
一級(jí)頁(yè)表和二級(jí)頁(yè)表的特征如表15.21所示。
表15.21 一級(jí)頁(yè)表和二級(jí)頁(yè)表特征
類(lèi)????型 |
頁(yè)表占用的存儲(chǔ)空間 (單位:KB) |
支持的頁(yè)大小 (單位:KB) |
頁(yè)表項(xiàng)數(shù)目 |
一級(jí)頁(yè)表 |
16 |
1024 |
4096 |
粗二級(jí)頁(yè)表 |
1 |
1,4,64 |
1024 |
細(xì)二級(jí)頁(yè)表 |
4 |
1,4,64 |
256 |
(2)傳輸表基地址
當(dāng)處理器發(fā)出地址請(qǐng)求信號(hào),而其要求的虛擬地址沒(méi)有包含在TLB中時(shí),MMU將會(huì)初始化一個(gè)產(chǎn)生過(guò)程。傳輸過(guò)程需要的地址轉(zhuǎn)換表——傳輸表的基地址存放在協(xié)處理器寄存器c2中,MMU通過(guò)此基地址找到傳輸表,準(zhǔn)備一次地址傳輸過(guò)程。
(3)基于一級(jí)頁(yè)表的地址變換過(guò)程
基于一級(jí)頁(yè)表的地址變換過(guò)程是指從虛擬地址到物理地址的轉(zhuǎn)換只需要一級(jí)頁(yè)表就能完成的地址轉(zhuǎn)換。一級(jí)頁(yè)表地址轉(zhuǎn)換過(guò)程如圖15.25所示。
圖15.25??一級(jí)頁(yè)表地址轉(zhuǎn)換過(guò)程
圖15.25中,CP15寄存器c2中存放的是內(nèi)存中一級(jí)頁(yè)表的基地址。因?yàn)橐患?jí)頁(yè)表大小為16KB,也就是說(shuō),一級(jí)頁(yè)表是16KB地址對(duì)齊的,所以c2中bits[13∶0]=0,bits[31∶14]為內(nèi)存中頁(yè)表基地址。
CP15的寄存器c2的bits[31∶14]和虛擬地址的bits[31∶20]結(jié)合作為一個(gè)31位數(shù)的高30位值,忽略32位值的最后兩位,可以使用該值從頁(yè)表中查到一個(gè)4字節(jié)的地址頁(yè)表項(xiàng)。
一級(jí)頁(yè)表支持以下4種類(lèi)型的頁(yè)表項(xiàng)。
·??1MB段轉(zhuǎn)換項(xiàng);
·??指向細(xì)二級(jí)頁(yè)表的目錄項(xiàng);
·??指向粗二級(jí)頁(yè)表的目錄項(xiàng);
·??產(chǎn)生中止異常的錯(cuò)誤項(xiàng)。
系統(tǒng)通過(guò)頁(yè)表項(xiàng)的低兩位bits[1:0]來(lái)確定頁(yè)表項(xiàng)的類(lèi)型。頁(yè)表項(xiàng)的格式要求二級(jí)頁(yè)表的地址必須與其頁(yè)大小的倍數(shù)對(duì)齊。一級(jí)頁(yè)表的各種頁(yè)表項(xiàng)的格式如圖15.26所示。
圖15.26??一級(jí)頁(yè)表項(xiàng)
如果bits[1:0]=0b10時(shí),該頁(yè)表項(xiàng)為段描述符(Section?Descriptor),段描述符定義了對(duì)應(yīng)的1MB的虛擬存儲(chǔ)空間的地址映射關(guān)系。
如果bits[1:0]=0b01時(shí),該頁(yè)表項(xiàng)包含了粗二級(jí)頁(yè)表的物理地址。該粗二級(jí)頁(yè)表定義了對(duì)應(yīng)的1MB虛擬存儲(chǔ)空間的地址映射關(guān)系。它可以實(shí)現(xiàn)以大頁(yè)和小頁(yè)為單位的地址映射。
如果bits[1:0]=0b11時(shí),該頁(yè)表項(xiàng)包含了細(xì)二級(jí)頁(yè)表的物理地址。該細(xì)二級(jí)頁(yè)表定義了對(duì)應(yīng)的1MB虛擬存儲(chǔ)空間的地址映射關(guān)系。它可以實(shí)現(xiàn)以大頁(yè)、小頁(yè)和極小頁(yè)為單位的地址映射。
如果bits[1:0]=0b00時(shí),說(shuō)明此頁(yè)表項(xiàng)是一個(gè)錯(cuò)誤頁(yè)表項(xiàng)。它將產(chǎn)生一個(gè)存儲(chǔ)頁(yè)錯(cuò)誤。錯(cuò)誤條件會(huì)導(dǎo)致預(yù)取指令中止或數(shù)據(jù)中止,這取決于具體的存儲(chǔ)器訪問(wèn)類(lèi)型。
?
(4)段描述符及其地址變換過(guò)程
如果一級(jí)頁(yè)表頁(yè)表項(xiàng)的bits[1∶0]=0b10,說(shuō)明此頁(yè)表項(xiàng)指向一個(gè)1MB的存儲(chǔ)段。頁(yè)表項(xiàng)的高12位代替虛擬地址的高12位來(lái)產(chǎn)生物理地址。該頁(yè)表項(xiàng)還包含域?qū)傩?、Cahche屬性、緩沖器屬性和訪問(wèn)權(quán)限屬性。具體定義如表15.22所示。
表15.22 段頁(yè)表項(xiàng)中各字段含義
字????段 |
含????義 |
bits[1:0] |
段頁(yè)表項(xiàng)標(biāo)識(shí) |
bits[3:2] |
定義段的Cache和寫(xiě)緩存屬性 |
bit[4] |
生產(chǎn)商定義 |
bits[8:5] |
本段所在的域 |
bit[9] |
當(dāng)前未被使用,設(shè)置成0 |
bits[11:10] |
訪問(wèn)權(quán)限控制AP位,見(jiàn)表15.23 |
bits[19:12] |
當(dāng)前未被使用,設(shè)置成0 |
bits[31:20] |
該段對(duì)應(yīng)的物理空間基地址的高12位 |
表15.23 訪問(wèn)權(quán)限控制位的編碼及其含義
訪問(wèn)權(quán)限控制AP |
S |
R |
特?權(quán)?模?式 |
用?戶(hù)?模?式 |
0b00 |
0 |
0 |
不可訪問(wèn) |
不可訪問(wèn) |
0b00 |
1 |
0 |
只讀 |
不可訪問(wèn) |
0b00 |
0 |
1 |
只讀 |
只讀 |
0b00 |
1 |
1 |
不可預(yù)知 |
不可預(yù)知 |
0b01 |
X |
X |
讀/寫(xiě) |
無(wú)訪問(wèn) |
0b10 |
X |
X |
讀/寫(xiě) |
只讀 |
0b11 |
X |
X |
讀/寫(xiě) |
讀/寫(xiě) |
表中S和R位是CP15寄存器c1中的控制位,它們分別對(duì)應(yīng)系統(tǒng)(S)和ROM(R)位。這兩位用來(lái)在不同模式加速系統(tǒng)中訪問(wèn)大的存儲(chǔ)塊。
設(shè)置S位使得所有頁(yè)具有不可訪問(wèn)權(quán)限,從而允許特權(quán)模式任務(wù)對(duì)頁(yè)有讀訪問(wèn)權(quán)限。因此通過(guò)改變CP15寄存器c1中的一位,所有標(biāo)識(shí)為不可訪問(wèn)的空間一下子變?yōu)榭捎茫恍枰淖兠總€(gè)頁(yè)表項(xiàng)的AP位,節(jié)省了開(kāi)銷(xiāo)。
改變R位使得所有頁(yè)具有不可訪問(wèn)權(quán)限,因而特權(quán)模式任務(wù)和用戶(hù)模式任務(wù)對(duì)頁(yè)都有讀訪問(wèn)權(quán)限。同樣,這一位可以加速對(duì)大塊存儲(chǔ)塊的訪問(wèn),而不需要修改許多頁(yè)表項(xiàng)的值。
注意 |
地址轉(zhuǎn)換過(guò)程中,在物理地址產(chǎn)生之前,將會(huì)按表2.22的編碼對(duì)訪問(wèn)地址的權(quán)限進(jìn)行檢測(cè)。 |
基于段的地址變換過(guò)程如圖15.27所示。
圖15.27??基于段的地址變換過(guò)程
?
(5)粗二級(jí)頁(yè)表描述符及其地址變換過(guò)程
如果一級(jí)頁(yè)表項(xiàng)的bits[1∶0]=0b01,說(shuō)明此頁(yè)表項(xiàng)包含一個(gè)粗二級(jí)頁(yè)表首地址指針,同時(shí)還包含一級(jí)頁(yè)表項(xiàng)代表的1MB虛存段的域信息。粗頁(yè)表必須與1KB的倍數(shù)地址對(duì)齊。頁(yè)表項(xiàng)具體定義見(jiàn)表15.24。
表15.24 粗二級(jí)頁(yè)表項(xiàng)中各字段含義
字????段 |
含????義 |
bits[1:0] |
粗二級(jí)頁(yè)表描述符標(biāo)識(shí) |
bits[4:2] |
生產(chǎn)商定義 |
bits[8:5] |
域標(biāo)識(shí)符 |
bit?[9] |
當(dāng)前未被使用,設(shè)置成0 |
bits[31:10] |
粗二級(jí)頁(yè)表基地址,該地址1KB對(duì)齊 |
基于粗二級(jí)頁(yè)表的地址變換過(guò)程如圖15.28所示。
(6)細(xì)二級(jí)頁(yè)表描述符及其地址變換過(guò)程
如果一級(jí)頁(yè)表項(xiàng)的bits[1:0]=0b11,說(shuō)明此頁(yè)表項(xiàng)包含一個(gè)細(xì)二級(jí)頁(yè)表首地址指針,同時(shí)還包含一級(jí)頁(yè)表項(xiàng)代表的1MB虛存段的域信息。細(xì)頁(yè)表必須與4KB的倍數(shù)地址對(duì)齊。頁(yè)表項(xiàng)具體定義如表15.25所示。
圖15.28??基于粗二級(jí)頁(yè)表的地址變換過(guò)程
表15.25 細(xì)二級(jí)頁(yè)表項(xiàng)中各字段含義
字????段 |
含????義 |
bits[1:0] |
細(xì)二級(jí)頁(yè)表描述符標(biāo)識(shí) |
bits[4:2] |
生產(chǎn)商定義 |
bits[8:5] |
域標(biāo)識(shí)符 |
bits?[11:9] |
當(dāng)前未被使用,設(shè)置成0 |
bits[31:12] |
細(xì)二級(jí)頁(yè)表基地址,該地址4KB對(duì)齊 |
?
基于細(xì)二級(jí)頁(yè)表的地址變換過(guò)程如圖15.29所示。
(7)基于二級(jí)頁(yè)表的地址變換過(guò)程
二級(jí)頁(yè)表有4種可能的頁(yè)表項(xiàng):
·??定義64KB頁(yè)幀屬性的大(Large)頁(yè)表項(xiàng);
·??定義4KB頁(yè)幀屬性的小(Small)頁(yè)表項(xiàng);
·??定義1KB頁(yè)幀屬性的微(tiny)頁(yè)表項(xiàng);
·??訪問(wèn)中止異常的錯(cuò)誤項(xiàng)。
系統(tǒng)通過(guò)頁(yè)表項(xiàng)的最低位[1:0]來(lái)確定頁(yè)表項(xiàng)的類(lèi)型。二級(jí)頁(yè)表的頁(yè)表項(xiàng)格式如圖15.30所示。
當(dāng)bits[1:0]=0b01時(shí),該頁(yè)表項(xiàng)為大頁(yè)表項(xiàng),它包含了一個(gè)64KB物理存儲(chǔ)塊的基地址。如果頁(yè)表是細(xì)二級(jí)頁(yè)表,那么大頁(yè)表項(xiàng)將在表中重復(fù)64次;如果頁(yè)表是粗二級(jí)頁(yè)表,那么大頁(yè)表項(xiàng)將在表中重復(fù)16次。
圖15.29??基于細(xì)二級(jí)頁(yè)表的地址變換過(guò)程
圖15.30??二級(jí)頁(yè)表的頁(yè)表項(xiàng)格式
當(dāng)bits[1:0]=0b10時(shí),該頁(yè)表項(xiàng)為小頁(yè)表項(xiàng),它保存一個(gè)4KB物理存儲(chǔ)塊的基地址。如果頁(yè)表是細(xì)二級(jí)頁(yè)表,那么小頁(yè)表項(xiàng)將在表中重復(fù)4次;如果頁(yè)表是粗二級(jí)頁(yè)表,那么大頁(yè)表項(xiàng)只需在表中出現(xiàn)1次。
當(dāng)bits[1:0]=0b11時(shí),該頁(yè)表項(xiàng)為微頁(yè)表項(xiàng),它保存一個(gè)1KB物理存儲(chǔ)塊的基地址。如果頁(yè)表是細(xì)二級(jí)頁(yè)表,那么微頁(yè)表項(xiàng)只需在表中重復(fù)1次;微頁(yè)表項(xiàng)不會(huì)出現(xiàn)在粗二級(jí)頁(yè)表中,如果出現(xiàn),那么訪問(wèn)結(jié)果不可預(yù)知。
當(dāng)bits[1:0]=0b00時(shí),該頁(yè)表項(xiàng)產(chǎn)生存儲(chǔ)頁(yè)訪問(wèn)錯(cuò)誤。錯(cuò)誤條件會(huì)導(dǎo)致預(yù)取指中止或數(shù)據(jù)中止,這取決于具體的存儲(chǔ)器訪問(wèn)類(lèi)型。
(8)大頁(yè)表描述符及其地址變換過(guò)程
如果二級(jí)頁(yè)表項(xiàng)bits[1:0]=0b01,說(shuō)明該頁(yè)表項(xiàng)為大頁(yè)表項(xiàng),它不僅包含了一個(gè)64KB物理存儲(chǔ)塊基地址,同時(shí)還含有4組權(quán)限位域以及頁(yè)的Cache和寫(xiě)緩存屬性。每一組訪問(wèn)權(quán)限域代表虛存頁(yè)的1/4,這些頁(yè)表項(xiàng)可以看成是16KB子頁(yè),以更好的控制64KB頁(yè)的訪問(wèn)權(quán)限。
具體定義如表15.26所示。
表15.26 大頁(yè)表項(xiàng)中各字段含義
字????段 |
含????義 |
bits[1:0] |
大頁(yè)表項(xiàng)類(lèi)型標(biāo)識(shí)符 |
bits[3:2] |
Cache和寫(xiě)緩存屬性 |
bits[11:4] |
訪問(wèn)權(quán)限控制位,具體編碼見(jiàn)表15.27。 一個(gè)大頁(yè)分為4個(gè)子頁(yè) AP0子頁(yè)0的訪問(wèn)權(quán)限 AP1子頁(yè)1的訪問(wèn)權(quán)限 AP2子頁(yè)2的訪問(wèn)權(quán)限 AP3子頁(yè)3的訪問(wèn)權(quán)限 |
bits?[15:12] |
當(dāng)前未使用,應(yīng)為0 |
bits[31:16] |
該大頁(yè)對(duì)應(yīng)的物理頁(yè)幀的基地址的高16位 |
圖15.31說(shuō)明了基于大頁(yè)表的地址變換過(guò)程。
圖15.31??基于大頁(yè)表的地址變換過(guò)程
(9)小頁(yè)表描述符及其地址變換過(guò)程
如果二級(jí)頁(yè)表項(xiàng)bits[1∶0]=0b10,說(shuō)明該頁(yè)表項(xiàng)為小頁(yè)表項(xiàng),它不僅包含了一個(gè)4KB物理存儲(chǔ)塊基地址,同時(shí)還含有4組權(quán)限位域以及頁(yè)的Cache和寫(xiě)緩存屬性。每一組訪問(wèn)權(quán)限域代表虛存頁(yè)的1/4,這些頁(yè)表項(xiàng)可以看成是1KB子頁(yè),以更好的控制4KB頁(yè)的訪問(wèn)權(quán)限。
頁(yè)表項(xiàng)的具體定義如表15.27所示。
表15.27 小頁(yè)表項(xiàng)中各字段含義
字????段 |
含????義 |
bits[1:0] |
小頁(yè)表項(xiàng)類(lèi)型標(biāo)識(shí)符 |
bits[3:2] |
Cache和寫(xiě)緩存屬性 |
bits[11:4] |
訪問(wèn)權(quán)限控制位,具體編碼見(jiàn)表15.22。 一個(gè)小頁(yè)分為4個(gè)子頁(yè) AP0子頁(yè)0的訪問(wèn)權(quán)限 AP1子頁(yè)1的訪問(wèn)權(quán)限 AP2子頁(yè)2的訪問(wèn)權(quán)限 AP3子頁(yè)3的訪問(wèn)權(quán)限 |
bits?[15:12] |
當(dāng)前未使用,應(yīng)為0 |
bits[31:16] |
該小頁(yè)對(duì)應(yīng)的物理頁(yè)幀的基地址的高20位 |
圖15.32說(shuō)明了基于小頁(yè)表的地址變換過(guò)程。
圖15.32??基于小頁(yè)表的地址變換過(guò)程
(10)微頁(yè)表描述符及其地址變換過(guò)程
如果二級(jí)頁(yè)表項(xiàng)bits[1∶0]=0b11,該二級(jí)頁(yè)表項(xiàng)是微頁(yè)表項(xiàng),它提供了一個(gè)1KB物理存儲(chǔ)塊的基地址,同時(shí)含有一個(gè)訪問(wèn)權(quán)限位域以及頁(yè)的Cache和寫(xiě)緩存屬性。微頁(yè)表項(xiàng)的具體含義如表15.28所示。
表15.28 微頁(yè)表項(xiàng)中各字段含義
字????段 |
含????義 |
bits[1:0] |
微頁(yè)表項(xiàng)類(lèi)型標(biāo)識(shí)符 |
bits[3:2] |
Cache和寫(xiě)緩存屬性 |
bits[5:4] |
訪問(wèn)權(quán)限控制位,具體編碼見(jiàn)表15.29 |
bits?[9:6] |
當(dāng)前未使用,應(yīng)為0 |
bits[31:10] |
該微頁(yè)對(duì)應(yīng)的物理頁(yè)幀的基地址的高22位 |
圖15.33說(shuō)明了基于微頁(yè)表的地址變換過(guò)程。
圖15.33??基于微頁(yè)表的地址變換過(guò)程
?
注意 |
ARMv6體系結(jié)構(gòu)不包含微頁(yè),如果打算創(chuàng)建一個(gè)很容易移植到以后體系結(jié)構(gòu)的系統(tǒng),則建議在該系統(tǒng)中避免使用1KB微頁(yè)。 |
?
15.5.6??域(domain)和存儲(chǔ)器訪問(wèn)權(quán)限
域指的是一些段、大頁(yè)或者小頁(yè)的集合。編程的中,設(shè)計(jì)者最多可以使用16個(gè)域,每個(gè)域的訪問(wèn)控制特征由CP15中的c3中的兩位控制。
CP15中的寄存器c3的格式如圖15.34。
圖15.34??CP15寄存器c3編碼格式
其中,每?jī)蓚€(gè)位控制一個(gè)域的訪問(wèn)控制特性,其編碼及對(duì)應(yīng)的含義如表15.29所示。
表15.29 域訪問(wèn)控制字段編碼及含義
控制位編碼 |
訪問(wèn)類(lèi)型 |
含????義 |
0b00 |
無(wú)訪問(wèn)權(quán)限 |
這時(shí)訪問(wèn)該域?qū)a(chǎn)生訪問(wèn)失效 |
0b01 |
客戶(hù)類(lèi)型(client) |
根據(jù)頁(yè)表中地址變換頁(yè)表項(xiàng)的域訪問(wèn)權(quán)限控制位決定是否允許特定的存儲(chǔ)訪問(wèn) |
0b10 |
保留 |
使用該值會(huì)產(chǎn)生不可預(yù)知的結(jié)果 |
0b11 |
管理者權(quán)限(Manager) |
不考慮頁(yè)表中頁(yè)表項(xiàng)內(nèi)的訪問(wèn)控制權(quán)限位,所以這種情況下不產(chǎn)生訪問(wèn)失效 |
綜上所述,有兩種不同的控制來(lái)管理一個(gè)任務(wù)的存儲(chǔ)器訪問(wèn)權(quán)限。
·??管理者(manager)用于主控(primary?control),不考慮每個(gè)段、大頁(yè)和小頁(yè)的訪問(wèn)權(quán)限。
·??客戶(hù)(client)使用頁(yè)表中的訪問(wèn)權(quán)限用于次控(secondary?control)。
當(dāng)多個(gè)段或者頁(yè)從屬于一個(gè)域時(shí),這些段或者頁(yè)的訪問(wèn)權(quán)限可以很容易的由域來(lái)統(tǒng)一控制。存儲(chǔ)器采用這種管理策略將不同的存儲(chǔ)單元“打包”。
注意 |
即使不使用MMU提供的虛擬存儲(chǔ)功能,仍然可以把這些內(nèi)核用作簡(jiǎn)單的存儲(chǔ)保護(hù)單元。首先將虛擬存儲(chǔ)空間直接映射到物理存儲(chǔ)空間,然后為每個(gè)任務(wù)分配一個(gè)不同的域,最后使用這些域來(lái)保護(hù)睡眠任務(wù)(通過(guò)將它們的域訪問(wèn)設(shè)置成不可訪問(wèn))。 |
15.5.7??與TLB相關(guān)的操作
(1)清除TLB
如果操作系統(tǒng)改變了頁(yè)表中的數(shù)據(jù),那么緩存在TLB中的轉(zhuǎn)換數(shù)據(jù)可能就不再有效了。存儲(chǔ)器核有一些CP15命令用于清除TLB,從而使TLB中的數(shù)據(jù)作廢。表15.30是一些可用的命令:清除所有TLB數(shù)據(jù),清除指令TLB,清除數(shù)據(jù)TLB,也可以一次只清除一行TLB數(shù)據(jù)。
表15.30 清除TLB的CP15命令
命????令 |
MCR指令 |
Rd的值 |
支持的內(nèi)核 |
使所有TLB無(wú)效 |
MCR??p15,0,Rd,c8,c7,0 |
0 |
ARM720T、ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale |
按行使TLB無(wú)效 |
MCR??p15,0,Rd,c8,c7,1 |
要使之無(wú)效的虛擬地址 |
ARM720T |
使指令TLB無(wú)效 |
MCR??p15,0,Rd,c8,c5,0 |
要使之無(wú)效的虛擬地址 |
ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale |
按行使指令TLB無(wú)效 |
MCR??p15,0,Rd,c8,c5,1 |
要使之無(wú)效的虛擬地址 |
ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale |
使數(shù)據(jù)TLB無(wú)效 |
MCR??p15,0,Rd,c8,c6,0 |
要使之無(wú)效的虛擬地址 |
ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale |
按行使數(shù)據(jù)TLB無(wú)效 |
MCR??p15,0,Rd,c8,c6,1 |
要使之無(wú)效的虛擬地址 |
ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale |
?
下面的例子顯示了一個(gè)使TLB無(wú)效的過(guò)程。
【例】一個(gè)使TLB無(wú)效的過(guò)程。
MOV??r1,0;
MCR??p15,0,r1,c8,c7,0
(2)鎖定TLB
由于對(duì)TLB表的查詢(xún)經(jīng)常會(huì)使系統(tǒng)訪問(wèn)內(nèi)存(要查詢(xún)的段、頁(yè)不在TLB中),這就使得系統(tǒng)的平均訪問(wèn)時(shí)間大大增加。對(duì)于實(shí)時(shí)系統(tǒng),就需要將一些關(guān)鍵的頁(yè)表項(xiàng)鎖定在訪問(wèn)速度相對(duì)較快的TLB中。
ARM920T、ARM922T、ARM926EJ-S、ARM1022E和ARM1026EJ-S內(nèi)核版本支持TLB轉(zhuǎn)換數(shù)據(jù)的鎖定。如果TLB中的某一行是鎖定的,則當(dāng)TLB清除命令發(fā)出時(shí),它仍然保留在TLB中。
與TLB鎖定相關(guān)的操作可以通過(guò)對(duì)CP15寄存器r10編程來(lái)實(shí)現(xiàn)。
各種ARM核的可用鎖定命令如表15.31所示。
表15.31 訪問(wèn)TLB鎖定寄存器的命令
命????令 |
MCR指令 |
Rd的值 |
支持的內(nèi)核 |
讀數(shù)據(jù)TLB鎖定寄存器 |
MRC??p15,0,Rd,c10,c0,0 |
TLB鎖定 |
ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale |
寫(xiě)數(shù)據(jù)TLB鎖定寄存器 |
MCR??p15,0,Rd,c10,c7,1 |
TLB鎖定 |
ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale |
讀指令TLB鎖定寄存器 |
MRC??p15,0,Rd,c8,c5,0 |
TLB鎖定 |
ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale |
寫(xiě)指令TLB鎖定寄存器 |
MCR??p15,0,Rd,c8,c5,1 |
TLB鎖定 |
ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale |
其中Rd的格式如圖15.35所示。
圖15.35??Rd格式詳解
其中,
·??W=log2N,N為T(mén)LB中入口(entry)的個(gè)數(shù)。對(duì)ARM920T、ARM922T、ARM926EJ-S、ARM1022E版本的內(nèi)核來(lái)講,W=6;而對(duì)于ARM1026EJ-S內(nèi)核版本,W=3。
·??victm位域:確定下次被換出的TLB入口(entry)。
·??base位域:從第0個(gè)入口(entry)到base??1入口的TLB值,被鎖定。
鎖定TLB中N條地址入口的操作序列如下。
①?確保在整個(gè)鎖定過(guò)程中不會(huì)發(fā)生異常中斷,可以通過(guò)禁止中斷等方法實(shí)現(xiàn)。
②?如果鎖定的是指令TLB或指令/數(shù)據(jù)統(tǒng)一的TLB,將base=N、victim=N、P=0寫(xiě)入寄存器c10。
③?使整個(gè)將要鎖定的TLB無(wú)效。
④?如果要鎖定指令TLB,確保與鎖定過(guò)程有關(guān)的指令地址變換地址入口已經(jīng)加載到指令TLB中。
注意 |
在此過(guò)程中,TLB的一個(gè)地址變換入口可以涵蓋所有與鎖定TLB相關(guān)的指令。這通常是由使整個(gè)TLB無(wú)效后的第一條指令實(shí)現(xiàn)的。 |
如果要鎖定的是數(shù)據(jù)TLB,確保與鎖定過(guò)程有關(guān)的數(shù)據(jù)地址變換地址入口已經(jīng)加載到數(shù)據(jù)TLB中。
注意 |
在此過(guò)程中避免使用內(nèi)嵌語(yǔ)法(inline?literal)。所有鎖定TLB用到的數(shù)據(jù)可以被TLB中一個(gè)地址變換條目所覆蓋。 |
如果系統(tǒng)使用統(tǒng)一的數(shù)據(jù)TLB和指令TLB,上述兩條都要保證。
⑤?對(duì)于I=0到N,重復(fù)執(zhí)行下列操作:
·??將base=I、victim=I、P=1寫(xiě)入寄存器c10中;
·??將每一條想要鎖定到TLB的變換地址入口讀取到TLB中。對(duì)于數(shù)據(jù)TLB和數(shù)據(jù)/指令統(tǒng)一的TLB可以使用LDR指令讀取一個(gè)涉及該變換地址入口的數(shù)據(jù),將該地址變換入口讀取到TLB中。對(duì)于指令TLB,通過(guò)操作寄存器c7,將相應(yīng)的變換地址讀取到指令TLB中。
⑥??將base=N、victim=N、P=0寫(xiě)入寄存器c10中。
要解除TLB中被鎖定的變換地址入口,可以使用下面的操作序列。
①??通過(guò)操作寄存器c8,使TLB中各被鎖定的變換地址入口無(wú)效。
②??將base=0、victim=0、P=0寫(xiě)入寄存器c10中。
15.5.8??存儲(chǔ)訪問(wèn)失效
ARM中有兩種存儲(chǔ)訪問(wèn)失效(Fault)可以導(dǎo)致處理器停止執(zhí)行。
·??MMU失效(MMU?Fault):由MMU檢測(cè)到失效(Fault)并通知處理器。
·??外部存儲(chǔ)器訪問(wèn)中止(External?Abort):由外部存儲(chǔ)器向存儲(chǔ)器報(bào)告無(wú)效的存儲(chǔ)器訪問(wèn)請(qǐng)求。
上述兩種情況統(tǒng)稱(chēng)為存儲(chǔ)訪問(wèn)中止(Abort)。如果存儲(chǔ)訪問(wèn)中止發(fā)生在數(shù)據(jù)訪問(wèn)周期,CPU將產(chǎn)生數(shù)據(jù)訪問(wèn)中止異常中斷(Data?Abort);如果存儲(chǔ)訪問(wèn)發(fā)生在指令預(yù)取周期,當(dāng)該指令執(zhí)行時(shí),CPU產(chǎn)生指令預(yù)取異常中斷(Prefetch?Abort)。
注意 |
預(yù)取指令時(shí)發(fā)生錯(cuò)誤,只有當(dāng)該指令執(zhí)行時(shí),CPU才會(huì)產(chǎn)生指令預(yù)取異常中斷。 |
(1)MMU失效
MMU可以產(chǎn)生4種類(lèi)型的訪問(wèn)失效,分別是:
·??地址對(duì)齊失效(Alignment?Fault);
·??地址變換失效(Translation?Fault);
·??域控制失效(Domain?Fault);
·??訪問(wèn)權(quán)限控制失效(Permission?Fault)。
存儲(chǔ)系統(tǒng)可以中止3種類(lèi)型的存儲(chǔ)訪問(wèn):
·??Cache行預(yù)?。╨ine?fetch);
·??無(wú)Cache和寫(xiě)緩存的存儲(chǔ)器訪問(wèn)(uncached?or?unbuffered?accesses);
·??傳輸表訪問(wèn)(translation?table?accesses)。
MMU失效優(yōu)先于外部存儲(chǔ)器訪問(wèn)中止請(qǐng)求。當(dāng)存儲(chǔ)訪問(wèn)失效發(fā)生時(shí),系統(tǒng)控制協(xié)處理器中有兩個(gè)寄存器分別負(fù)責(zé)保存發(fā)生中止的失效狀態(tài)和地址。
注意 |
如果一條指令在預(yù)取階段發(fā)生錯(cuò)誤,它仍將進(jìn)入指令流水線,直到該條指令被執(zhí)行時(shí),預(yù)取異常才發(fā)生。但當(dāng)預(yù)取錯(cuò)誤指令在進(jìn)入執(zhí)行階段前,指令發(fā)生跳轉(zhuǎn),那么該預(yù)取異常不會(huì)發(fā)生,協(xié)處理器錯(cuò)誤寄存器的狀態(tài)也不會(huì)被更新。 |
(2)MMU中與存儲(chǔ)訪問(wèn)失效相關(guān)的寄存器
MMU中與存儲(chǔ)訪問(wèn)失效相關(guān)的寄存器有兩個(gè):
·??失效狀態(tài)寄存器(FSR,F(xiàn)ault?Status?Register);
·??失效地址寄存器(FAR,F(xiàn)ault?Address?Register)。
失效狀態(tài)寄存器是協(xié)處理器寄存器c5。失效地址寄存器為協(xié)處理器寄存器c6。
當(dāng)存儲(chǔ)訪問(wèn)失效發(fā)生時(shí),失效狀態(tài)寄存器中的字段被更新以反映所發(fā)生的存儲(chǔ)訪問(wèn)失效的相關(guān)的信息,包括存儲(chǔ)訪問(wèn)所屬的域以及存儲(chǔ)訪問(wèn)的類(lèi)型。同時(shí)存儲(chǔ)訪問(wèn)失效的虛擬地址被保存到地址寄存器c6中。
在數(shù)據(jù)訪問(wèn)周期發(fā)生存儲(chǔ)訪問(wèn)失效更新了失效狀態(tài)寄存器后,如果系統(tǒng)尚未進(jìn)入存儲(chǔ)異常模式,這時(shí)發(fā)生了指令預(yù)取引起的存儲(chǔ)失效,則該指令預(yù)取引起的訪問(wèn)失效將不會(huì)更新失效狀態(tài)寄存器的值。這樣就保證了數(shù)據(jù)訪問(wèn)周期發(fā)生的存儲(chǔ)訪問(wèn)失效狀態(tài)信息不會(huì)被指令預(yù)取周期發(fā)生的存儲(chǔ)訪問(wèn)失效破壞。
?
引起存儲(chǔ)訪問(wèn)失效的存儲(chǔ)訪問(wèn)類(lèi)型如表15.32所示。
表中,對(duì)齊失效的編碼可以為0b0001或0b0011。
表15.32 存儲(chǔ)訪問(wèn)失效的存儲(chǔ)訪問(wèn)類(lèi)型
優(yōu)先級(jí) |
引起存儲(chǔ)訪問(wèn)失效的原因 |
失效狀態(tài)字段 |
域字段 |
失效地址寄存器c6 |
|
最高 |
極端異常(Terminal?Exception) |
0b0010 |
無(wú)效 |
生產(chǎn)商定義 |
|
中斷向量訪問(wèn)異常(Vector?Exception) |
0b0000 |
無(wú)效 |
有效 |
||
地址對(duì)齊(Alignment) |
0b00x1 |
無(wú)效 |
有效 |
||
擴(kuò)展地址變換失效(頁(yè)表訪問(wèn)失效) |
一級(jí)頁(yè)表 |
0b1100 |
有效 |
有效 |
|
二級(jí)頁(yè)表 |
0b1110 |
無(wú)效 |
有效 |
||
地址變換失效 |
段失效 |
0b0101 |
無(wú)效 |
有效 |
|
頁(yè)失效 |
0b0111 |
有效 |
有效 |
||
域控制失效 |
段失效 |
0b1001 |
有效 |
有效 |
|
頁(yè)失效 |
0b1011 |
有效 |
有效 |
||
訪問(wèn)權(quán)限控制失效 |
段失效 |
0b1101 |
有效 |
有效 |
|
頁(yè)失效 |
0b1111 |
有效 |
有效 |
||
基于Cache的外部存儲(chǔ)訪問(wèn)系統(tǒng)異常 |
段失效 |
0b0100 |
有效 |
有效 |
|
頁(yè)失效 |
0b0110 |
有效 |
有效 |
||
最低 |
非Cache預(yù)取時(shí)外部存儲(chǔ)訪問(wèn)異常 |
段失效 |
0b1000 |
有效 |
有效 |
頁(yè)失效 |
0b1010 |
有效 |
有效 |
在域控制字段(bits[3:0])中存在無(wú)效值,是因?yàn)闊o(wú)效發(fā)生在域訪問(wèn)之前。
當(dāng)不同的存儲(chǔ)訪問(wèn)類(lèi)型同時(shí)引起存儲(chǔ)訪問(wèn)失效時(shí),按照優(yōu)先級(jí)由高到低的次序,先保存優(yōu)先級(jí)高的存儲(chǔ)訪問(wèn)失效相關(guān)信息,在表中各存儲(chǔ)訪問(wèn)優(yōu)先級(jí)由上到下依次遞減。
圖15.36顯示了判斷存儲(chǔ)訪問(wèn)失效的全過(guò)程。
下面分別介紹各種類(lèi)型的存儲(chǔ)訪問(wèn)失效方式。
①?極端異常(terminal?exception)
極端異常指的是發(fā)生了不可恢復(fù)的存儲(chǔ)訪問(wèn)失效。具體屬于哪種情況,有生產(chǎn)商定義。
②?中斷向量訪問(wèn)異常(vector?exception)
在數(shù)據(jù)訪問(wèn)周期,如果訪問(wèn)異常中斷向量表(地址0x0到0x1f)時(shí)發(fā)生存儲(chǔ)訪問(wèn)失效,這種存儲(chǔ)訪問(wèn)失效稱(chēng)為中斷向量訪問(wèn)異常。當(dāng)MMU被禁止時(shí)是否產(chǎn)生中斷向量訪問(wèn)異常由生產(chǎn)商決定。
③?地址對(duì)齊失效
在數(shù)據(jù)訪問(wèn)周期,如果訪問(wèn)字單元地址時(shí)地址bits[1:0]位不是0b00,或者訪問(wèn)半字單元時(shí)地址bits[0]位不是0b0,則產(chǎn)生的存儲(chǔ)訪問(wèn)失效稱(chēng)為地址對(duì)齊失效。在指令預(yù)取周期不會(huì)產(chǎn)生地址對(duì)齊失效。在數(shù)據(jù)訪問(wèn)周期,如果訪問(wèn)字節(jié)單位,不會(huì)產(chǎn)生地址訪問(wèn)失效。
④?地址變換失效
有兩種類(lèi)型的地址變換失效。一種是基于段的地址變換失效,它指當(dāng)一級(jí)頁(yè)表描述符的位bits[1:0]=0b00時(shí),表示該一級(jí)描述符頁(yè)表項(xiàng)無(wú)效,這時(shí)產(chǎn)生基于段的地址變換失效。第二種是基于頁(yè)的地址變換失效。當(dāng)二級(jí)描述符的位bits[1:0]=0b00時(shí),表示該二級(jí)描述符頁(yè)表項(xiàng)無(wú)效,這時(shí)產(chǎn)生基于頁(yè)的地址變換失效。
圖15.36??判斷存儲(chǔ)訪問(wèn)失效的全過(guò)程。
?
⑤?域控制位失效
域控制位失效包括兩種類(lèi)型。一種基于段的存儲(chǔ)訪問(wèn)域控制失效。在一級(jí)描述符中包含4位的域標(biāo)識(shí)符。該標(biāo)識(shí)符指定了本段所屬的域,在MMU讀取一級(jí)描述符時(shí),它檢查域訪問(wèn)控制寄存器c3中對(duì)應(yīng)于該域的控制位,如果相應(yīng)的兩位控制位為0b00,說(shuō)明該域不允許存儲(chǔ)訪問(wèn),這時(shí),就產(chǎn)生了基于段的存儲(chǔ)訪問(wèn)域控制失效。第二種是基于頁(yè)的存儲(chǔ)訪問(wèn)中域控制位失效。在一級(jí)描述符中包含4位的域標(biāo)識(shí)符。該標(biāo)識(shí)符指定了本頁(yè)所屬的域,在MMU讀取一級(jí)描述符時(shí),它檢查域訪問(wèn)控制寄存器c3中對(duì)應(yīng)于該域的控制位,如果相應(yīng)的兩位控制位為0b00,說(shuō)明該域不允許存儲(chǔ)訪問(wèn),這時(shí)就產(chǎn)生了基于頁(yè)的存儲(chǔ)訪問(wèn)域控制失效。
⑥?訪問(wèn)權(quán)限失效
訪問(wèn)權(quán)限失效的檢查是在域控制位失效檢查時(shí)進(jìn)行的。這時(shí)如果域訪問(wèn)控制器中對(duì)應(yīng)于該域的控制位為0b01,則要進(jìn)行相應(yīng)的權(quán)限檢查。訪問(wèn)權(quán)限失效有兩種類(lèi)型。一種基于段的存儲(chǔ)訪問(wèn)權(quán)限控制失效,對(duì)于基于段的存儲(chǔ)訪問(wèn),在一級(jí)描述符中包含一個(gè)兩位的訪問(wèn)權(quán)限控制位AP。如果字段AP標(biāo)識(shí)了不允許進(jìn)行相關(guān)存儲(chǔ)訪問(wèn)時(shí),產(chǎn)出基于段的存儲(chǔ)訪問(wèn)權(quán)限控制失效。第二種是基于頁(yè)的存儲(chǔ)訪問(wèn)控制失效。對(duì)于基于頁(yè)的存儲(chǔ)訪問(wèn),在二級(jí)描述符中定義的可能為大頁(yè)、小頁(yè)或者微頁(yè)。當(dāng)二級(jí)描述符中定義的為微頁(yè)時(shí),該二級(jí)描述符中包含一個(gè)對(duì)應(yīng)于該微頁(yè)的訪問(wèn)控制字段AP,如果字段AP標(biāo)識(shí)了不允許進(jìn)行相關(guān)的存儲(chǔ)訪問(wèn),這時(shí)產(chǎn)生基于子頁(yè)的存儲(chǔ)訪問(wèn)權(quán)限控制失效。同樣,當(dāng)二級(jí)頁(yè)表描述符中定義的為小頁(yè)或大頁(yè)時(shí),操作過(guò)程同微頁(yè)。
(3)外部存儲(chǔ)訪問(wèn)失效
除處理器內(nèi)部MMU向CPU報(bào)告錯(cuò)誤外,ARM體系結(jié)構(gòu)還定義了一個(gè)外部訪問(wèn)中斷引腳。該引腳可以用于外部存儲(chǔ)器向CPU訪問(wèn)失效異常。但是,并不是所有失效異常都可以通過(guò)這種方式報(bào)告,所以該引腳在連線時(shí)要非常注意。下面列舉了存儲(chǔ)訪問(wèn)操作,可以通過(guò)這種機(jī)制中止和重啟動(dòng)。
·??讀操作(reads)。
·??非緩存的寫(xiě)操作(unbuffered?writes)。
·??一級(jí)描述符預(yù)?。╢irst-level?descriptor?fetch)。
·??二級(jí)描述符預(yù)?。╯econd-level?descriptor?fetch)。
·??非緩存的信號(hào)量操作(semaphores?in?uncachable/unbufferablememory?areas)。
在Cache預(yù)取時(shí),可以在任意字時(shí)終止存儲(chǔ)訪問(wèn)過(guò)程。如果存儲(chǔ)訪問(wèn)發(fā)生在存儲(chǔ)器想要獲取的數(shù)據(jù)中,這時(shí)該存儲(chǔ)訪問(wèn)將立即被中止。如果產(chǎn)生中止的數(shù)據(jù)是在Cache預(yù)取時(shí),從存儲(chǔ)器順序讀出的,那么直到這些數(shù)據(jù)被存儲(chǔ)器訪問(wèn)時(shí),該存儲(chǔ)訪問(wèn)才會(huì)被中止。
帶緩存的寫(xiě)操作不能通過(guò)這種方式向CPU報(bào)告異常。因此,在系統(tǒng)中標(biāo)記為可外部中止的存儲(chǔ)區(qū)域不要進(jìn)行可緩存的寫(xiě)操作。
15.5.9??快速上下文切換擴(kuò)展(FCSE,F(xiàn)ast?Context?Switch?Extension)
(1)快速上下文切換擴(kuò)展原理
快速上下文切換擴(kuò)展(FCSE,F(xiàn)ast?Context?Switch?Extension)是MMU中的一個(gè)附加硬件,用于提高ARM嵌入式系統(tǒng)的系統(tǒng)性能。FCSE使得多個(gè)獨(dú)立任務(wù)可以運(yùn)行在一個(gè)固定的重疊存儲(chǔ)空間中,而在上下文切換時(shí),不需要清理(clean)或清除(flush)Cache和TLB。FCSE主要特征就是不需要清除Cache和TLB。
通常情況下,如果兩個(gè)進(jìn)程占有的虛擬地址空間有重疊,系統(tǒng)在兩個(gè)進(jìn)程之間進(jìn)行切換時(shí),必須進(jìn)行虛擬地址到物理地址的重映射。而虛擬地址到物理地址重映射涉及到重建MMU中頁(yè)表,而且Cache及TLB中的內(nèi)容都必須使無(wú)效。這樣操作將帶來(lái)巨大的系統(tǒng)開(kāi)銷(xiāo),一方面重建MMU和使無(wú)效Cache及TLB的內(nèi)容需要很大的開(kāi)銷(xiāo),另一方面重建Cache和TLB內(nèi)容也需要很大的開(kāi)銷(xiāo)。
快速上下文切換擴(kuò)展的引入避免了這種開(kāi)銷(xiāo)。它位于CPU和MMU之間,如果兩個(gè)進(jìn)程使用了同樣的虛擬地址空間,則對(duì)CPU而言,兩個(gè)進(jìn)程的空間地址是一樣的??焖偕舷挛那袚Q擴(kuò)展對(duì)各進(jìn)程的虛擬地址進(jìn)行變換,這樣系統(tǒng)中CPU之外的部分看到的是經(jīng)過(guò)快速上下文切換擴(kuò)展變換的虛擬地址??焖偕舷挛那袚Q擴(kuò)展將各進(jìn)程的虛擬空間變換成不同的虛擬空間。這樣在進(jìn)行進(jìn)程間切換時(shí)就不需要進(jìn)行虛擬地址到物理地址的重映射。
快速上下文切換擴(kuò)展將CPU發(fā)出的每個(gè)虛擬地址按照上述的規(guī)則進(jìn)行變換,然后發(fā)送到系統(tǒng)中的其他部分。變換過(guò)程如圖15.37所示。
圖15.37??快速上下文切換擴(kuò)展變換過(guò)程
使用快速上下文切換擴(kuò)展,虛擬存儲(chǔ)管理增加了一次地址轉(zhuǎn)換??焖偕舷挛那袚Q擴(kuò)展在虛擬地址到達(dá)Cache和TLB前,使用一個(gè)特殊的、包含進(jìn)程ID值的重定位寄存器來(lái)修改虛地址。把第一次變換前的地址稱(chēng)為虛地址VA(Virtual?Address),把第一次變換后的地址稱(chēng)為修改后虛擬地址MVA(Modified?virtual?Address)。
這樣,任務(wù)間的切換就不用涉及到改變頁(yè)表,只需簡(jiǎn)單地將新任務(wù)的進(jìn)程ID寫(xiě)到位于CP15地FCSE進(jìn)程ID寄存器。正是因?yàn)槿蝿?wù)切換不需要改變頁(yè)表,因而切換后Cache和TLB中的值依然保持有效,不需要清除。
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)為1的進(jìn)程空間塊中的進(jìn)程實(shí)際使用虛擬地址空間為1×0x02000000~1×0x02000000+0x01ffffff。這個(gè)地址空間是系統(tǒng)中除CPU之外的其他部分看到的該進(jìn)程所占有的虛擬地址空間。
由地址VA到MVA的變換算法如下所示。
MVA=VA+(ox02000000×進(jìn)程ID)
保存在CP15寄存器c13寄存器中的值包含進(jìn)程ID,c13中從bit[31]~bit[25]共7位標(biāo)識(shí)進(jìn)程ID,因此可以有128個(gè)進(jìn)程。寄存器格式如圖15.38。
圖15.38??快速上下文切換寄存器c13
訪問(wèn)寄存器c13的指令格式如下所示:
MCR??p15,0,<Rd>,<c13>,c0,0
MRC??p15,0,<Rd>,<c13>,c0,0
其中,在讀操作時(shí),結(jié)果中位[31:25]返回PID,其他位的數(shù)值是不可預(yù)知的。寫(xiě)操作將設(shè)置PID的值。
當(dāng)PID=0時(shí),MVA=VA,相當(dāng)于禁止了FCSE。系統(tǒng)復(fù)位后PID為0。
當(dāng)正在運(yùn)行的進(jìn)程訪問(wèn)別的進(jìn)程時(shí),被訪問(wèn)的進(jìn)程標(biāo)識(shí)不能為0。這時(shí),CPU發(fā)生的地址VA的高7位不是全0。
完整的VA到MVA的變換算法如下所示。
If?(VA[31:25]==0b0000000)then
MVA=VA|(PID<<25=
Else
MVA=VA
?
(2)一個(gè)快速上下文切換的例子
圖15.39顯示了一個(gè)從任務(wù)1切換到任務(wù)2之前和之后的存儲(chǔ)器布局。
任務(wù)1正在運(yùn)行
任務(wù)2正在運(yùn)行
圖15.39??快速上下文切換擴(kuò)展例子
從圖中可以看出,任務(wù)1和任務(wù)2都運(yùn)行在0x00000000~0x01ffffff的地址空間。從任務(wù)1切換到任務(wù)2域控制要做相應(yīng)的改變。通過(guò)在CPU和MMU之間加FCSE使系統(tǒng)的虛擬地址空間映射沒(méi)有改變,所以不需要清除(Flush)或清理(Clean)Cache或TLB。
使用FCSE時(shí)執(zhí)行一次上下文切換需要的步驟:
①?保存執(zhí)行任務(wù)的上下文,并將執(zhí)行任務(wù)設(shè)置為睡眠態(tài);
②?將喚醒任務(wù)的進(jìn)程ID寫(xiě)到CP15的寄存器c13中;
③?通過(guò)寫(xiě)CP15的寄存器c3,將當(dāng)前任務(wù)的域設(shè)置為不可訪問(wèn),而喚醒任務(wù)的域設(shè)置為客戶(hù)訪問(wèn);
④?恢復(fù)喚醒任務(wù)的上下文;
⑤?繼續(xù)執(zhí)行被恢復(fù)的任務(wù)。
下面是關(guān)于FCSE的一些提示。
①?任務(wù)在大小上有固定的最大32MB的限制。
②?存儲(chǔ)管理必須使用有固定起始地址(32MB的倍數(shù))的固定32MB分區(qū)。
③?除非想為每個(gè)任務(wù)管理一個(gè)異常向量表,否則使用CP15寄存器c1的V位將異常向量表放置在虛擬地址0xffff0000。
④?必須定義和使用一個(gè)活躍的域控制系統(tǒng)。
⑤?如果使用域來(lái)保護(hù)各個(gè)任務(wù),則除非修改一級(jí)頁(yè)表中域的相應(yīng)位,并在上下文切換時(shí)清除TLB,否則最多只能有16個(gè)并發(fā)任務(wù)。