ARM存儲(chǔ)器之:存儲(chǔ)管理單元MMU
掃描二維碼
隨時(shí)隨地手機(jī)看文章
在創(chuàng)建多任務(wù)嵌入式系統(tǒng)時(shí),最好有一個(gè)簡(jiǎn)單的方式來(lái)編寫、裝載及運(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ǔ)器就有兩種類型的地址:虛擬地址和物理地址。虛擬地址由編譯器和連接器在定位程序時(shí)分配;物理地址用來(lái)訪問(wèn)實(shí)際的主存硬件模塊(物理上程序存在的區(qū)域)。
15.5.1MMU概述內(nèi)存管理單位MMU對(duì)處理器內(nèi)存提供了很好的管理。這種管理主要是通過(guò)一個(gè)叫作傳輸表的數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)的。這個(gè)傳輸表存在于內(nèi)存中,它有多個(gè)稱為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ò)程是查詢傳輸表的過(guò)程,由于傳輸表放在內(nèi)存中,這個(gè)查詢過(guò)程通常代價(jià)很大。這個(gè)訪問(wèn)時(shí)間通常是1~2個(gè)內(nèi)存周期。為了減少平均內(nèi)存訪問(wèn)時(shí)間,ARM結(jié)構(gòu)體系中采用一個(gè)容量更?。ㄍǔ?~16個(gè)字)、訪問(wèn)速度和CPU中通用寄存器相當(dāng)?shù)拇鎯?chǔ)器件來(lái)存放當(dāng)前訪問(wèn)需要的地址變換條目,它是一個(gè)小容量的Cache。這個(gè)小容量的頁(yè)表Cache稱為TLB(TranslationLookasideBuffer)。
注意
如果系統(tǒng)中使用數(shù)據(jù)和指令統(tǒng)一存儲(chǔ)系統(tǒng),那么TLB也將是統(tǒng)一的。如果系統(tǒng)是數(shù)據(jù)和指令分開的存儲(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.2MMU與MPU在ARM體系結(jié)構(gòu)中,MMU將MPU的功能大大地增加,使系統(tǒng)內(nèi)存管理更加靈活、方便。在MPU中引入了“域”的概念來(lái)管理內(nèi)存,而且域是在專用寄存器中設(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中,以備下次查詢使用。
當(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.4MMU的使能與禁止MMU的使能/禁止可以通過(guò)CP15寄存器的c1的bit[0]來(lái)控制。
·bit[0]=0,MMU禁止。
·bit[0]=1,MMU使能。
下面的例子顯示了典型的MMU使能過(guò)程。
【例15.4】典型的MMU使能過(guò)程。
MRCp15,0,r0,c1,0,0
ORRr0,#01
MCRp15,0,r0,c1,0,0
當(dāng)MMU被禁止時(shí),存儲(chǔ)訪問(wèn)執(zhí)行下列過(guò)程。
①當(dāng)禁止MMU時(shí),存儲(chǔ)系統(tǒng)是否支持Cache和寫緩存,根據(jù)不同芯片設(shè)計(jì)不同而有所不同(ARM公司將設(shè)計(jì)權(quán)交給芯片廠商)。
·如果芯片規(guī)定當(dāng)禁止MMU時(shí)禁止Cache和寫緩存,則存儲(chǔ)訪問(wèn)不考慮C、B控制位。
·如果芯片規(guī)定禁止MMU時(shí)使能Cache和寫緩存,則數(shù)據(jù)訪問(wèn)被視為無(wú)Cache(uncachable)和寫緩存(unbufferable)的,即C=0、B=0。讀取指令時(shí),如果系統(tǒng)是統(tǒng)一的TLB,則C=0;如果使用分開的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ǔ)空間的映射是以內(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è)(Largepages):大小為64KB。
·小頁(yè)(Smallpages):大小為4KB。
·極小頁(yè)(TinyPages):大小為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è)表包括兩種類型的頁(yè)表項(xiàng),即保持指向二級(jí)頁(yè)表起始地址的頁(yè)表項(xiàng)和保存用于轉(zhuǎn)換段(Section)地址的頁(yè)表項(xiàng)。一級(jí)頁(yè)表也稱為段頁(yè)表(sectionpagetable)。
·二級(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è)幀(pageframe)的首地址。
注意
目錄頁(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è)表特征
類型
頁(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種類型的頁(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)的類型。頁(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)為段描述符(SectionDescriptor),段描述符定義了對(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)類型。
(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和寫緩存屬性
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)模式
用戶模式
0b00
0
0
不可訪問(wèn)
不可訪問(wèn)
0b00
1
0
只讀
不可訪問(wèn)
0b00
0
1
只讀
只讀
0b00
1
1
不可預(yù)知
不可預(yù)知
0b01
X
X
讀/寫
無(wú)訪問(wèn)
0b10
X
X
讀/寫
只讀
0b11
X
X
讀/寫
讀/寫
表中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é)省了開銷。
改變R位使得所有頁(yè)具有不可訪問(wèn)權(quán)限,因而特權(quán)模式任務(wù)和用戶模式任務(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è)幀屬性的?。⊿mall)頁(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)的類型。二級(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)類型。
(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和寫緩存屬性。每一組訪問(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)類型標(biāo)識(shí)符
bits[3:2]
Cache和寫緩存屬性
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和寫緩存屬性。每一組訪問(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)類型標(biāo)識(shí)符
bits[3:2]
Cache和寫緩存屬性
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和寫緩存屬性。微頁(yè)表項(xiàng)的具體含義如表15.28所示。
表15.28 微頁(yè)表項(xiàng)中各字段含義
字段
含義
bits[1:0]
微頁(yè)表項(xiàng)類型標(biāo)識(shí)符
bits[3:2]
Cache和寫緩存屬性
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.34CP15寄存器c3編碼格式
其中,每?jī)蓚€(gè)位控制一個(gè)域的訪問(wèn)控制特性,其編碼及對(duì)應(yīng)的含義如表15.29所示。
表15.29 域訪問(wèn)控制字段編碼及含義
控制位編碼
訪問(wèn)類型
含義
0b00
無(wú)訪問(wèn)權(quán)限
這時(shí)訪問(wèn)該域?qū)a(chǎn)生訪問(wèn)失效
0b01
客戶類型(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)用于主控(primarycontrol),不考慮每個(gè)段、大頁(yè)和小頁(yè)的訪問(wèn)權(quán)限。
·客戶(client)使用頁(yè)表中的訪問(wèn)權(quán)限用于次控(secondarycontrol)。
當(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ú)效
MCRp15,0,Rd,c8,c7,0
0
ARM720T、ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale
按行使TLB無(wú)效
MCRp15,0,Rd,c8,c7,1
要使之無(wú)效的虛擬地址
ARM720T
使指令TLB無(wú)效
MCRp15,0,Rd,c8,c5,0
要使之無(wú)效的虛擬地址
ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale
按行使指令TLB無(wú)效
MCRp15,0,Rd,c8,c5,1
要使之無(wú)效的虛擬地址
ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale
使數(shù)據(jù)TLB無(wú)效
MCRp15,0,Rd,c8,c6,0
要使之無(wú)效的虛擬地址
ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale
按行使數(shù)據(jù)TLB無(wú)效
MCRp15,0,Rd,c8,c6,1
要使之無(wú)效的虛擬地址
ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale
下面的例子顯示了一個(gè)使TLB無(wú)效的過(guò)程。
【例】一個(gè)使TLB無(wú)效的過(guò)程。
MOVr1,0;
MCRp15,0,r1,c8,c7,0
(2)鎖定TLB
由于對(duì)TLB表的查詢經(jīng)常會(huì)使系統(tǒng)訪問(wèn)內(nèi)存(要查詢的段、頁(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鎖定寄存器
MRCp15,0,Rd,c10,c0,0
TLB鎖定
ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale
寫數(shù)據(jù)TLB鎖定寄存器
MCRp15,0,Rd,c10,c7,1
TLB鎖定
ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale
讀指令TLB鎖定寄存器
MRCp15,0,Rd,c8,c5,0
TLB鎖定
ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale
寫指令TLB鎖定寄存器
MCRp15,0,Rd,c8,c5,1
TLB鎖定
ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale
其中Rd的格式如圖15.35所示。
圖15.35Rd格式詳解
其中,
·W=log2N,N為TLB中入口(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寫入寄存器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ǔ)法(inlineliteral)。所有鎖定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寫入寄存器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寫入寄存器c10中。
要解除TLB中被鎖定的變換地址入口,可以使用下面的操作序列。
①通過(guò)操作寄存器c8,使TLB中各被鎖定的變換地址入口無(wú)效。
②將base=0、victim=0、P=0寫入寄存器c10中。
15.5.8存儲(chǔ)訪問(wèn)失效ARM中有兩種存儲(chǔ)訪問(wèn)失效(Fault)可以導(dǎo)致處理器停止執(zhí)行。
·MMU失效(MMUFault):由MMU檢測(cè)到失效(Fault)并通知處理器。
·外部存儲(chǔ)器訪問(wèn)中止(ExternalAbort):由外部存儲(chǔ)器向存儲(chǔ)器報(bào)告無(wú)效的存儲(chǔ)器訪問(wèn)請(qǐng)求。
上述兩種情況統(tǒng)稱為存儲(chǔ)訪問(wèn)中止(Abort)。如果存儲(chǔ)訪問(wèn)中止發(fā)生在數(shù)據(jù)訪問(wèn)周期,CPU將產(chǎn)生數(shù)據(jù)訪問(wèn)中止異常中斷(DataAbort);如果存儲(chǔ)訪問(wèn)發(fā)生在指令預(yù)取周期,當(dāng)該指令執(zhí)行時(shí),CPU產(chǎn)生指令預(yù)取異常中斷(PrefetchAbort)。
注意
預(yù)取指令時(shí)發(fā)生錯(cuò)誤,只有當(dāng)該指令執(zhí)行時(shí),CPU才會(huì)產(chǎn)生指令預(yù)取異常中斷。
(1)MMU失效
MMU可以產(chǎn)生4種類型的訪問(wèn)失效,分別是:
·地址對(duì)齊失效(AlignmentFault);
·地址變換失效(TranslationFault);
·域控制失效(DomainFault);
·訪問(wèn)權(quán)限控制失效(PermissionFault)。
存儲(chǔ)系統(tǒng)可以中止3種類型的存儲(chǔ)訪問(wèn):
·Cache行預(yù)取(linefetch);
·無(wú)Cache和寫緩存的存儲(chǔ)器訪問(wèn)(uncachedorunbufferedaccesses);
·傳輸表訪問(wèn)(translationtableaccesses)。
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)aultStatusRegister);
·失效地址寄存器(FAR,F(xiàn)aultAddressRegister)。
失效狀態(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)的類型。同時(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)類型如表15.32所示。
表中,對(duì)齊失效的編碼可以為0b0001或0b0011。
表15.32 存儲(chǔ)訪問(wèn)失效的存儲(chǔ)訪問(wèn)類型
優(yōu)先級(jí)
引起存儲(chǔ)訪問(wèn)失效的原因
失效狀態(tài)字段
域字段
失效地址寄存器c6
最高
極端異常(TerminalException)
0b0010
無(wú)效
生產(chǎn)商定義
中斷向量訪問(wèn)異常(VectorException)
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)類型同時(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ò)程。
下面分別介紹各種類型的存儲(chǔ)訪問(wèn)失效方式。
①極端異常(terminalexception)
極端異常指的是發(fā)生了不可恢復(fù)的存儲(chǔ)訪問(wèn)失效。具體屬于哪種情況,有生產(chǎn)商定義。
②中斷向量訪問(wèn)異常(vectorexception)
在數(shù)據(jù)訪問(wèn)周期,如果訪問(wèn)異常中斷向量表(地址0x0到0x1f)時(shí)發(fā)生存儲(chǔ)訪問(wèn)失效,這種存儲(chǔ)訪問(wèn)失效稱為中斷向量訪問(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)失效稱為地址對(duì)齊失效。在指令預(yù)取周期不會(huì)產(chǎn)生地址對(duì)齊失效。在數(shù)據(jù)訪問(wèn)周期,如果訪問(wèn)字節(jié)單位,不會(huì)產(chǎn)生地址訪問(wèn)失效。
④地址變換失效
有兩種類型的地址變換失效。一種是基于段的地址變換失效,它指當(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ò)程。
⑤域控制位失效
域控制位失效包括兩種類型。一種基于段的存儲(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)限失效有兩種類型。一種基于段的存儲(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)。
·非緩存的寫操作(unbufferedwrites)。
·一級(jí)描述符預(yù)?。╢irst-leveldescriptorfetch)。
·二級(jí)描述符預(yù)?。╯econd-leveldescriptorfetch)。
·非緩存的信號(hào)量操作(semaphoresinuncachable/unbufferablememoryareas)。
在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ì)被中止。
帶緩存的寫操作不能通過(guò)這種方式向CPU報(bào)告異常。因此,在系統(tǒng)中標(biāo)記為可外部中止的存儲(chǔ)區(qū)域不要進(jìn)行可緩存的寫操作。
15.5.9快速上下文切換擴(kuò)展(FCSE,F(xiàn)astContextSwitchExtension)(1)快速上下文切換擴(kuò)展原理
快速上下文切換擴(kuò)展(FCSE,F(xiàn)astContextSwitchExtension)是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)開銷,一方面重建MMU和使無(wú)效Cache及TLB的內(nèi)容需要很大的開銷,另一方面重建Cache和TLB內(nèi)容也需要很大的開銷。
快速上下文切換擴(kuò)展的引入避免了這種開銷。它位于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)換。快速上下文切換擴(kuò)展在虛擬地址到達(dá)Cache和TLB前,使用一個(gè)特殊的、包含進(jìn)程ID值的重定位寄存器來(lái)修改虛地址。把第一次變換前的地址稱為虛地址VA(VirtualAddress),把第一次變換后的地址稱為修改后虛擬地址MVA(ModifiedvirtualAddress)。
這樣,任務(wù)間的切換就不用涉及到改變頁(yè)表,只需簡(jiǎn)單地將新任務(wù)的進(jìn)程ID寫到位于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的指令格式如下所示:
MCRp15,0,<Rd>,<c13>,c0,0
MRCp15,0,<Rd>,<c13>,c0,0
其中,在讀操作時(shí),結(jié)果中位[31:25]返回PID,其他位的數(shù)值是不可預(yù)知的。寫操作將設(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寫到CP15的寄存器c13中;
③通過(guò)寫CP15的寄存器c3,將當(dāng)前任務(wù)的域設(shè)置為不可訪問(wèn),而喚醒任務(wù)的域設(shè)置為客戶訪問(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ù)。