• 正文
    • 15.5  存儲(chǔ)管理單元MMU
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

ARM存儲(chǔ)器之:存儲(chǔ)管理單元MMU

2013/09/30
1
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

?

15.5??存儲(chǔ)管理單元MMU

在創(chuàng)建多任務(wù)嵌入式系統(tǒng)時(shí),最好有一個(gè)簡單的方式來編寫、裝載及運(yùn)行各自獨(dú)立的任務(wù)。目前大多數(shù)的嵌入式系統(tǒng)不再使用自己定制的控制系統(tǒng),而使用操作系統(tǒng)來簡化這個(gè)過程。較高級(jí)的操作系統(tǒng)采用基于硬件的存儲(chǔ)管理單元MMU來實(shí)現(xiàn)上述操作。

MMU提供的一個(gè)關(guān)鍵服務(wù)是使各個(gè)任務(wù)作為各自獨(dú)立的程序在其自己的私有存儲(chǔ)空間中運(yùn)行。在帶MMU的操作系統(tǒng)控制下,運(yùn)行的任務(wù)無須知道其他與之無關(guān)的任務(wù)的存儲(chǔ)需求情況,這就簡化了各個(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)換過程允許運(yùn)行的多個(gè)程序使用相同的虛擬地址,而各自存儲(chǔ)在物理存儲(chǔ)器的不同位置。

這樣存儲(chǔ)器就有兩種類型的地址:虛擬地址和物理地址。虛擬地址由編譯器連接器在定位程序時(shí)分配;物理地址用來訪問實(shí)際的主存硬件模塊(物理上程序存在的區(qū)域)。

15.5.1??MMU概述

內(nèi)存管理單位MMU對(duì)處理器內(nèi)存提供了很好的管理。這種管理主要是通過一個(gè)叫作傳輸表的數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)的。這個(gè)傳輸表存在于內(nèi)存中,它有多個(gè)稱為Entry的入口,每個(gè)入口定義了存儲(chǔ)空間的一個(gè)頁,頁的大小從1KB到1MB,同時(shí)定義了這些頁的屬性。

ARM系統(tǒng)中,MMU主要完成以下工作:

①?虛擬存儲(chǔ)空間到物理存儲(chǔ)空間的映射,它能夠?qū)崿F(xiàn)從虛擬地址到物理地址的轉(zhuǎn)換;

②?存儲(chǔ)器訪問權(quán)限的控制;

③?設(shè)置虛擬存儲(chǔ)空間的緩存特性。

MMU通過它的協(xié)處理器寄存器來確定傳輸表在內(nèi)存中的位置,并通過這些寄存器來向ARM處理器提供內(nèi)存訪問錯(cuò)誤信息。

從虛擬地址到物理地址的變換過程是查詢傳輸表的過程,由于傳輸表放在內(nèi)存中,這個(gè)查詢過程通常代價(jià)很大。這個(gè)訪問時(shí)間通常是1~2個(gè)內(nèi)存周期。為了減少平均內(nèi)存訪問時(shí)間,ARM結(jié)構(gòu)體系中采用一個(gè)容量更?。ㄍǔ?~16個(gè)字)、訪問速度和CPU通用寄存器相當(dāng)?shù)拇鎯?chǔ)器件來存放當(dāng)前訪問需要的地址變換條目,它是一個(gè)小容量的Cache。這個(gè)小容量的頁表Cache稱為TLB(Translation?Lookaside?Buffer)。

注意

如果系統(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ū)域具有相同的訪問控制屬性。MMU中寄存器c3用于控制與域有關(guān)的屬性配置。

表15.20列出了與MMU有關(guān)的協(xié)處理器寄存器及其作用。

表15.20 與MMU有關(guān)的協(xié)處理器寄存器

協(xié)處理器寄存器

作????用

c1中某些位

配置MMU中的一些操作

c2

保存內(nèi)存中頁表基地址

c3

設(shè)置域訪問權(quán)限

c4

保留

c5

內(nèi)存訪問失效狀態(tài)標(biāo)準(zhǔn)

c6

內(nèi)存訪問失效時(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中引入了“域”的概念來管理內(nèi)存,而且域是在專用寄存器中設(shè)置的。而MMU將域設(shè)置從寄存器移到了內(nèi)存單位,這樣使域的設(shè)置更加靈活,但同時(shí)也增加了系統(tǒng)訪問時(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ù)訪問由該區(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ǔ)器中的放置,使得它們在物理存儲(chǔ)器中擁有彼此不同的地址,這個(gè)地址與其設(shè)計(jì)時(shí)的虛擬運(yùn)行地址不一樣。

15.5.3??內(nèi)存訪問過程

當(dāng)處理器產(chǎn)生一個(gè)內(nèi)存訪問請(qǐng)求時(shí),將傳輸一個(gè)虛擬地址給MMU,MMU首先遍歷TLB(如果使用分離的存儲(chǔ)系統(tǒng),它將分別遍歷數(shù)據(jù)TLB和指令TLB)。如果TLB中不保護(hù)虛擬地址入口(Entry),那么它將轉(zhuǎn)入保存在內(nèi)存中的傳輸主表,來獲得所有訪問地址的物理地址和訪問權(quán)限。一旦訪問成功,它將新的虛擬地址入口(Entry)信息保存在TLB中,以備下次查詢使用。

當(dāng)?shù)玫搅说刂纷儞Q入口(Entry)后,將進(jìn)行以下操作:

①?根據(jù)入口(Entry)中的C(cachable)控制位和B(Bufferable)控制位決定是否緩存該內(nèi)存訪問結(jié)果。

②?根據(jù)訪問權(quán)限控制位和域訪問控制位確定該內(nèi)存訪問是否被允許。如果該內(nèi)存訪問不被允許,CP15向ARM處理器報(bào)告存儲(chǔ)訪問中止。

③?對(duì)應(yīng)不允許緩存的存儲(chǔ)訪問,直接得到物理地址訪問內(nèi)存。對(duì)于允許緩存的存儲(chǔ)訪問,如果在Cache命中,則忽略物理地址;如果Cache沒有命中,則使用物理地址訪問內(nèi)存,并把該數(shù)據(jù)塊讀到Cache中。

圖15.23為帶Cache的MMU存儲(chǔ)訪問示意圖。

圖15.23??帶Cache的MMU存儲(chǔ)訪問示意圖

?

15.5.4??MMU的使能與禁止

MMU的使能/禁止可以通過CP15寄存器的c1的bit[0]來控制。

·??bit[0]=0,MMU禁止。

·??bit[0]=1,MMU使能。

下面的例子顯示了典型的MMU使能過程。

【例15.4】典型的MMU使能過程。

MRC??p15,0,r0,c1,0,0

ORR??r0,#01

MCR??p15,0,r0,c1,0,0

當(dāng)MMU被禁止時(shí),存儲(chǔ)訪問執(zhí)行下列過程。

①?當(dāng)禁止MMU時(shí),存儲(chǔ)系統(tǒng)是否支持Cache和寫緩存,根據(jù)不同芯片設(shè)計(jì)不同而有所不同(ARM公司將設(shè)計(jì)權(quán)交給芯片廠商)。

·??如果芯片規(guī)定當(dāng)禁止MMU時(shí)禁止Cache和寫緩存,則存儲(chǔ)訪問不考慮C、B控制位。

·??如果芯片規(guī)定禁止MMU時(shí)使能Cache和寫緩存,則數(shù)據(jù)訪問被視為無Cache(uncachable)和寫緩存(unbufferable)的,即C=0、B=0。讀取指令時(shí),如果系統(tǒng)是統(tǒng)一的TLB,則C=0;如果使用分開的TLB,則C=1。

②?存儲(chǔ)訪問不受權(quán)限控制,MMU也不會(huì)產(chǎn)生存儲(chǔ)訪問中止信號(hào)。

③?所有物理地址和虛擬地址相等,即使用平板存儲(chǔ)模式。

使能/禁止MMU時(shí)需要注意以下幾個(gè)問題。

·??在使能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將帶來很大麻煩,因此建議完成使能/禁止MMU的代碼的物理地址和虛擬地址相同。

15.5.5??虛擬地址到物理地址的轉(zhuǎn)換

(1)地址重定位

為了使任務(wù)有各自的虛擬存儲(chǔ)器映射,MMU硬件采用地址重定位,在地址訪問主存之前,轉(zhuǎn)換有處理器輸出的虛擬地址。當(dāng)處理器產(chǎn)生一個(gè)虛擬地址時(shí),MMU取出這個(gè)虛擬地址的高位,遍歷傳輸表,從而形成一個(gè)物理地址。

虛擬存儲(chǔ)空間到物理存儲(chǔ)空間的映射是以內(nèi)存塊為單位進(jìn)行的。也就是說,虛擬存儲(chǔ)空間中一塊連續(xù)的存儲(chǔ)空間被映射到物理存儲(chǔ)空間中同樣大小的一塊連續(xù)存儲(chǔ)空間。

虛擬存儲(chǔ)空間到物理存儲(chǔ)空間地址重映射過程如圖15.24所示。

圖15.24??虛擬存儲(chǔ)空間到物理存儲(chǔ)空間地址重映射過程

ARM支持的存儲(chǔ)塊的大小有以下幾種。

·??段(Sections):大小為1M的存儲(chǔ)塊。

·??大頁(Large?pages):大小為64KB。

·??小頁(Small?pages):大小為4KB。

·??極小頁(Tiny?Pages):大小為1KB。

段和大頁只需通過一次映射就可以將虛擬地址轉(zhuǎn)換成物理地址,也可以根據(jù)需要增加一級(jí)映射,采用兩級(jí)映射的方式再將大頁分成16KB的子頁,小頁分成1KB的子頁。極小頁不能再分,只能以1KB大小的整頁為單位。

ARM在內(nèi)存中存在兩級(jí)頁表以實(shí)現(xiàn)上述地址映射過程。

·??一級(jí)頁表:一級(jí)頁表包括兩種類型的頁表項(xiàng),即保持指向二級(jí)頁表起始地址的頁表項(xiàng)和保存用于轉(zhuǎn)換段(Section)地址的頁表項(xiàng)。一級(jí)頁表也稱為段頁表(section?page?table)。

·??二級(jí)頁表:二級(jí)頁表包含以大頁和小頁為單位的地址變換頁表項(xiàng)。

一級(jí)頁表將4G地址空間劃分為多個(gè)1MB的段(Section),因此一級(jí)頁表包含4096個(gè)頁表項(xiàng)。一級(jí)頁表是一個(gè)混合表,可以作為二級(jí)頁表的目錄表,也可以作為用于轉(zhuǎn)換1MB段(也可視為1MB的虛擬頁)的普通頁表。當(dāng)一級(jí)頁表作為頁目錄時(shí),其頁表項(xiàng)包含的是代表1MB虛擬空間的二級(jí)頁表指針。二級(jí)頁表分為粗頁表(Coarse)和細(xì)頁表(Fine)。當(dāng)一級(jí)頁表用于轉(zhuǎn)換一個(gè)1MB的段時(shí),其頁表項(xiàng)包含的是物理存儲(chǔ)器中對(duì)應(yīng)1MB頁幀(page?frame)的首地址。

注意

目錄頁表項(xiàng)和1MB的段頁表項(xiàng)可以共存于一級(jí)頁表中。

一個(gè)粗二級(jí)頁表(Coarse)包含256個(gè)頁表項(xiàng),占有1KB的主存空間,每個(gè)頁表項(xiàng)將一個(gè)4KB的虛擬存儲(chǔ)塊轉(zhuǎn)換成一個(gè)4KB的物理存儲(chǔ)塊。粗二級(jí)頁表支持4KB和64KB的頁,頁表項(xiàng)包含的是4KB或64KB的頁幀地址。如果轉(zhuǎn)換的是一個(gè)64KB的頁,則對(duì)于每個(gè)64KB的頁,同一個(gè)頁表項(xiàng)必須在頁表中重復(fù)16次。

一個(gè)細(xì)二級(jí)頁表(Fine)有1024個(gè)頁表項(xiàng),占有4KB的主存空間,每個(gè)頁表項(xiàng)轉(zhuǎn)換一個(gè)1KB的存儲(chǔ)塊。細(xì)頁表支持1KB、4KB、64KB虛存頁,每個(gè)頁表項(xiàng)包含1KB、4KB或64KB的物理頁幀首地址。如果轉(zhuǎn)換的是4KB的頁,則同一個(gè)頁表項(xiàng)必須在頁表中連續(xù)重復(fù)4次;如果轉(zhuǎn)換的是64KB的頁,則同一個(gè)頁表項(xiàng)需要在頁表中連續(xù)重復(fù)64次。

?

一級(jí)頁表和二級(jí)頁表的特征如表15.21所示。

表15.21 一級(jí)頁表和二級(jí)頁表特征

類????型

頁表占用的存儲(chǔ)空間

(單位:KB)

支持的頁大小

(單位:KB)

頁表項(xiàng)數(shù)目

一級(jí)頁表

16

1024

4096

粗二級(jí)頁表

1

1,4,64

1024

細(xì)二級(jí)頁表

4

1,4,64

256

(2)傳輸表基地址

當(dāng)處理器發(fā)出地址請(qǐng)求信號(hào),而其要求的虛擬地址沒有包含在TLB中時(shí),MMU將會(huì)初始化一個(gè)產(chǎn)生過程。傳輸過程需要的地址轉(zhuǎn)換表——傳輸表的基地址存放在協(xié)處理器寄存器c2中,MMU通過此基地址找到傳輸表,準(zhǔn)備一次地址傳輸過程。

(3)基于一級(jí)頁表的地址變換過程

基于一級(jí)頁表的地址變換過程是指從虛擬地址到物理地址的轉(zhuǎn)換只需要一級(jí)頁表就能完成的地址轉(zhuǎn)換。一級(jí)頁表地址轉(zhuǎn)換過程如圖15.25所示。

圖15.25??一級(jí)頁表地址轉(zhuǎn)換過程

圖15.25中,CP15寄存器c2中存放的是內(nèi)存中一級(jí)頁表的基地址。因?yàn)橐患?jí)頁表大小為16KB,也就是說,一級(jí)頁表是16KB地址對(duì)齊的,所以c2中bits[13∶0]=0,bits[31∶14]為內(nèi)存中頁表基地址。

CP15的寄存器c2的bits[31∶14]和虛擬地址的bits[31∶20]結(jié)合作為一個(gè)31位數(shù)的高30位值,忽略32位值的最后兩位,可以使用該值從頁表中查到一個(gè)4字節(jié)的地址頁表項(xiàng)。

一級(jí)頁表支持以下4種類型的頁表項(xiàng)。

·??1MB段轉(zhuǎn)換項(xiàng);

·??指向細(xì)二級(jí)頁表的目錄項(xiàng);

·??指向粗二級(jí)頁表的目錄項(xiàng);

·??產(chǎn)生中止異常的錯(cuò)誤項(xiàng)。

系統(tǒng)通過頁表項(xiàng)的低兩位bits[1:0]來確定頁表項(xiàng)的類型。頁表項(xiàng)的格式要求二級(jí)頁表的地址必須與其頁大小的倍數(shù)對(duì)齊。一級(jí)頁表的各種頁表項(xiàng)的格式如圖15.26所示。

圖15.26??一級(jí)頁表項(xiàng)

如果bits[1:0]=0b10時(shí),該頁表項(xiàng)為段描述符(Section?Descriptor),段描述符定義了對(duì)應(yīng)的1MB的虛擬存儲(chǔ)空間的地址映射關(guān)系。

如果bits[1:0]=0b01時(shí),該頁表項(xiàng)包含了粗二級(jí)頁表的物理地址。該粗二級(jí)頁表定義了對(duì)應(yīng)的1MB虛擬存儲(chǔ)空間的地址映射關(guān)系。它可以實(shí)現(xiàn)以大頁和小頁為單位的地址映射。

如果bits[1:0]=0b11時(shí),該頁表項(xiàng)包含了細(xì)二級(jí)頁表的物理地址。該細(xì)二級(jí)頁表定義了對(duì)應(yīng)的1MB虛擬存儲(chǔ)空間的地址映射關(guān)系。它可以實(shí)現(xiàn)以大頁、小頁和極小頁為單位的地址映射。

如果bits[1:0]=0b00時(shí),說明此頁表項(xiàng)是一個(gè)錯(cuò)誤頁表項(xiàng)。它將產(chǎn)生一個(gè)存儲(chǔ)頁錯(cuò)誤。錯(cuò)誤條件會(huì)導(dǎo)致預(yù)取指令中止或數(shù)據(jù)中止,這取決于具體的存儲(chǔ)器訪問類型。

?

(4)段描述符及其地址變換過程

如果一級(jí)頁表頁表項(xiàng)的bits[1∶0]=0b10,說明此頁表項(xiàng)指向一個(gè)1MB的存儲(chǔ)段。頁表項(xiàng)的高12位代替虛擬地址的高12位來產(chǎn)生物理地址。該頁表項(xiàng)還包含域?qū)傩?、Cahche屬性、緩沖器屬性和訪問權(quán)限屬性。具體定義如表15.22所示。

表15.22 段頁表項(xiàng)中各字段含義

字????段

含????義

bits[1:0]

段頁表項(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]

訪問權(quán)限控制AP位,見表15.23

bits[19:12]

當(dāng)前未被使用,設(shè)置成0

bits[31:20]

該段對(duì)應(yīng)的物理空間基地址的高12位

表15.23 訪問權(quán)限控制位的編碼及其含義

訪問權(quán)限控制AP

S

R

特?權(quán)?模?式

用?戶?模?式

0b00

0

0

不可訪問

不可訪問

0b00

1

0

只讀

不可訪問

0b00

0

1

只讀

只讀

0b00

1

1

不可預(yù)知

不可預(yù)知

0b01

X

X

讀/寫

無訪問

0b10

X

X

讀/寫

只讀

0b11

X

X

讀/寫

讀/寫

表中S和R位是CP15寄存器c1中的控制位,它們分別對(duì)應(yīng)系統(tǒng)(S)和ROM(R)位。這兩位用來在不同模式加速系統(tǒng)中訪問大的存儲(chǔ)塊。

設(shè)置S位使得所有頁具有不可訪問權(quán)限,從而允許特權(quán)模式任務(wù)對(duì)頁有讀訪問權(quán)限。因此通過改變CP15寄存器c1中的一位,所有標(biāo)識(shí)為不可訪問的空間一下子變?yōu)榭捎?,而不需要改變每個(gè)頁表項(xiàng)的AP位,節(jié)省了開銷。

改變R位使得所有頁具有不可訪問權(quán)限,因而特權(quán)模式任務(wù)和用戶模式任務(wù)對(duì)頁都有讀訪問權(quán)限。同樣,這一位可以加速對(duì)大塊存儲(chǔ)塊的訪問,而不需要修改許多頁表項(xiàng)的值。

注意

地址轉(zhuǎn)換過程中,在物理地址產(chǎn)生之前,將會(huì)按表2.22的編碼對(duì)訪問地址的權(quán)限進(jìn)行檢測。

基于段的地址變換過程如圖15.27所示。

圖15.27??基于段的地址變換過程

?

(5)粗二級(jí)頁表描述符及其地址變換過程

如果一級(jí)頁表項(xiàng)的bits[1∶0]=0b01,說明此頁表項(xiàng)包含一個(gè)粗二級(jí)頁表首地址指針,同時(shí)還包含一級(jí)頁表項(xiàng)代表的1MB虛存段的域信息。粗頁表必須與1KB的倍數(shù)地址對(duì)齊。頁表項(xiàng)具體定義見表15.24。

表15.24 粗二級(jí)頁表項(xiàng)中各字段含義

字????段

含????義

bits[1:0]

粗二級(jí)頁表描述符標(biāo)識(shí)

bits[4:2]

生產(chǎn)商定義

bits[8:5]

域標(biāo)識(shí)符

bit?[9]

當(dāng)前未被使用,設(shè)置成0

bits[31:10]

粗二級(jí)頁表基地址,該地址1KB對(duì)齊

基于粗二級(jí)頁表的地址變換過程如圖15.28所示。

(6)細(xì)二級(jí)頁表描述符及其地址變換過程

如果一級(jí)頁表項(xiàng)的bits[1:0]=0b11,說明此頁表項(xiàng)包含一個(gè)細(xì)二級(jí)頁表首地址指針,同時(shí)還包含一級(jí)頁表項(xiàng)代表的1MB虛存段的域信息。細(xì)頁表必須與4KB的倍數(shù)地址對(duì)齊。頁表項(xiàng)具體定義如表15.25所示。

圖15.28??基于粗二級(jí)頁表的地址變換過程

表15.25 細(xì)二級(jí)頁表項(xiàng)中各字段含義

字????段

含????義

bits[1:0]

細(xì)二級(jí)頁表描述符標(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í)頁表基地址,該地址4KB對(duì)齊

?

基于細(xì)二級(jí)頁表的地址變換過程如圖15.29所示。

(7)基于二級(jí)頁表的地址變換過程

二級(jí)頁表有4種可能的頁表項(xiàng):

·??定義64KB頁幀屬性的大(Large)頁表項(xiàng);

·??定義4KB頁幀屬性的?。⊿mall)頁表項(xiàng);

·??定義1KB頁幀屬性的微(tiny)頁表項(xiàng);

·??訪問中止異常的錯(cuò)誤項(xiàng)。

系統(tǒng)通過頁表項(xiàng)的最低位[1:0]來確定頁表項(xiàng)的類型。二級(jí)頁表的頁表項(xiàng)格式如圖15.30所示。

當(dāng)bits[1:0]=0b01時(shí),該頁表項(xiàng)為大頁表項(xiàng),它包含了一個(gè)64KB物理存儲(chǔ)塊的基地址。如果頁表是細(xì)二級(jí)頁表,那么大頁表項(xiàng)將在表中重復(fù)64次;如果頁表是粗二級(jí)頁表,那么大頁表項(xiàng)將在表中重復(fù)16次。

圖15.29??基于細(xì)二級(jí)頁表的地址變換過程

圖15.30??二級(jí)頁表的頁表項(xiàng)格式

當(dāng)bits[1:0]=0b10時(shí),該頁表項(xiàng)為小頁表項(xiàng),它保存一個(gè)4KB物理存儲(chǔ)塊的基地址。如果頁表是細(xì)二級(jí)頁表,那么小頁表項(xiàng)將在表中重復(fù)4次;如果頁表是粗二級(jí)頁表,那么大頁表項(xiàng)只需在表中出現(xiàn)1次。

當(dāng)bits[1:0]=0b11時(shí),該頁表項(xiàng)為微頁表項(xiàng),它保存一個(gè)1KB物理存儲(chǔ)塊的基地址。如果頁表是細(xì)二級(jí)頁表,那么微頁表項(xiàng)只需在表中重復(fù)1次;微頁表項(xiàng)不會(huì)出現(xiàn)在粗二級(jí)頁表中,如果出現(xiàn),那么訪問結(jié)果不可預(yù)知。

當(dāng)bits[1:0]=0b00時(shí),該頁表項(xiàng)產(chǎn)生存儲(chǔ)頁訪問錯(cuò)誤。錯(cuò)誤條件會(huì)導(dǎo)致預(yù)取指中止或數(shù)據(jù)中止,這取決于具體的存儲(chǔ)器訪問類型。

(8)大頁表描述符及其地址變換過程

如果二級(jí)頁表項(xiàng)bits[1:0]=0b01,說明該頁表項(xiàng)為大頁表項(xiàng),它不僅包含了一個(gè)64KB物理存儲(chǔ)塊基地址,同時(shí)還含有4組權(quán)限位域以及頁的Cache和寫緩存屬性。每一組訪問權(quán)限域代表虛存頁的1/4,這些頁表項(xiàng)可以看成是16KB子頁,以更好的控制64KB頁的訪問權(quán)限。

具體定義如表15.26所示。

表15.26 大頁表項(xiàng)中各字段含義

字????段

含????義

bits[1:0]

大頁表項(xiàng)類型標(biāo)識(shí)符

bits[3:2]

Cache和寫緩存屬性

bits[11:4]

訪問權(quán)限控制位,具體編碼見表15.27。

一個(gè)大頁分為4個(gè)子頁

AP0子頁0的訪問權(quán)限

AP1子頁1的訪問權(quán)限

AP2子頁2的訪問權(quán)限

AP3子頁3的訪問權(quán)限

bits?[15:12]

當(dāng)前未使用,應(yīng)為0

bits[31:16]

該大頁對(duì)應(yīng)的物理頁幀的基地址的高16位

圖15.31說明了基于大頁表的地址變換過程。

圖15.31??基于大頁表的地址變換過程

(9)小頁表描述符及其地址變換過程

如果二級(jí)頁表項(xiàng)bits[1∶0]=0b10,說明該頁表項(xiàng)為小頁表項(xiàng),它不僅包含了一個(gè)4KB物理存儲(chǔ)塊基地址,同時(shí)還含有4組權(quán)限位域以及頁的Cache和寫緩存屬性。每一組訪問權(quán)限域代表虛存頁的1/4,這些頁表項(xiàng)可以看成是1KB子頁,以更好的控制4KB頁的訪問權(quán)限。

頁表項(xiàng)的具體定義如表15.27所示。

表15.27 小頁表項(xiàng)中各字段含義

字????段

含????義

bits[1:0]

小頁表項(xiàng)類型標(biāo)識(shí)符

bits[3:2]

Cache和寫緩存屬性

bits[11:4]

訪問權(quán)限控制位,具體編碼見表15.22。

一個(gè)小頁分為4個(gè)子頁

AP0子頁0的訪問權(quán)限

AP1子頁1的訪問權(quán)限

AP2子頁2的訪問權(quán)限

AP3子頁3的訪問權(quán)限

bits?[15:12]

當(dāng)前未使用,應(yīng)為0

bits[31:16]

該小頁對(duì)應(yīng)的物理頁幀的基地址的高20位

圖15.32說明了基于小頁表的地址變換過程。

圖15.32??基于小頁表的地址變換過程

(10)微頁表描述符及其地址變換過程

如果二級(jí)頁表項(xiàng)bits[1∶0]=0b11,該二級(jí)頁表項(xiàng)是微頁表項(xiàng),它提供了一個(gè)1KB物理存儲(chǔ)塊的基地址,同時(shí)含有一個(gè)訪問權(quán)限位域以及頁的Cache和寫緩存屬性。微頁表項(xiàng)的具體含義如表15.28所示。

表15.28 微頁表項(xiàng)中各字段含義

字????段

含????義

bits[1:0]

微頁表項(xiàng)類型標(biāo)識(shí)符

bits[3:2]

Cache和寫緩存屬性

bits[5:4]

訪問權(quán)限控制位,具體編碼見表15.29

bits?[9:6]

當(dāng)前未使用,應(yīng)為0

bits[31:10]

該微頁對(duì)應(yīng)的物理頁幀的基地址的高22位

圖15.33說明了基于微頁表的地址變換過程。

圖15.33??基于微頁表的地址變換過程

?

注意

ARMv6體系結(jié)構(gòu)不包含微頁,如果打算創(chuàng)建一個(gè)很容易移植到以后體系結(jié)構(gòu)的系統(tǒng),則建議在該系統(tǒng)中避免使用1KB微頁。

?

15.5.6??域(domain)和存儲(chǔ)器訪問權(quán)限

域指的是一些段、大頁或者小頁的集合。編程的中,設(shè)計(jì)者最多可以使用16個(gè)域,每個(gè)域的訪問控制特征由CP15中的c3中的兩位控制。

CP15中的寄存器c3的格式如圖15.34。

圖15.34??CP15寄存器c3編碼格式

其中,每兩個(gè)位控制一個(gè)域的訪問控制特性,其編碼及對(duì)應(yīng)的含義如表15.29所示。

表15.29 域訪問控制字段編碼及含義

控制位編碼

訪問類型

含????義

0b00

無訪問權(quán)限

這時(shí)訪問該域?qū)a(chǎn)生訪問失效

0b01

客戶類型(client)

根據(jù)頁表中地址變換頁表項(xiàng)的域訪問權(quán)限控制位決定是否允許特定的存儲(chǔ)訪問

0b10

保留

使用該值會(huì)產(chǎn)生不可預(yù)知的結(jié)果

0b11

管理者權(quán)限(Manager)

不考慮頁表中頁表項(xiàng)內(nèi)的訪問控制權(quán)限位,所以這種情況下不產(chǎn)生訪問失效

綜上所述,有兩種不同的控制來管理一個(gè)任務(wù)的存儲(chǔ)器訪問權(quán)限。

·??管理者(manager)用于主控(primary?control),不考慮每個(gè)段、大頁和小頁的訪問權(quán)限。

·??客戶(client)使用頁表中的訪問權(quán)限用于次控(secondary?control)。

當(dāng)多個(gè)段或者頁從屬于一個(gè)域時(shí),這些段或者頁的訪問權(quán)限可以很容易的由域來統(tǒng)一控制。存儲(chǔ)器采用這種管理策略將不同的存儲(chǔ)單元“打包”。

注意

即使不使用MMU提供的虛擬存儲(chǔ)功能,仍然可以把這些內(nèi)核用作簡單的存儲(chǔ)保護(hù)單元。首先將虛擬存儲(chǔ)空間直接映射到物理存儲(chǔ)空間,然后為每個(gè)任務(wù)分配一個(gè)不同的域,最后使用這些域來保護(hù)睡眠任務(wù)(通過將它們的域訪問設(shè)置成不可訪問)。

15.5.7??與TLB相關(guān)的操作

(1)清除TLB

如果操作系統(tǒng)改變了頁表中的數(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無效

MCR??p15,0,Rd,c8,c7,0

0

ARM720T、ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale

按行使TLB無效

MCR??p15,0,Rd,c8,c7,1

要使之無效的虛擬地址

ARM720T

使指令TLB無效

MCR??p15,0,Rd,c8,c5,0

要使之無效的虛擬地址

ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale

按行使指令TLB無效

MCR??p15,0,Rd,c8,c5,1

要使之無效的虛擬地址

ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale

使數(shù)據(jù)TLB無效

MCR??p15,0,Rd,c8,c6,0

要使之無效的虛擬地址

ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale

按行使數(shù)據(jù)TLB無效

MCR??p15,0,Rd,c8,c6,1

要使之無效的虛擬地址

ARM920T、ARM922T、ARM926EJ-S、ARM1022E、ARM1026EJ-S、StrongARM、Xscale

?

下面的例子顯示了一個(gè)使TLB無效的過程。

【例】一個(gè)使TLB無效的過程。

MOV??r1,0;

MCR??p15,0,r1,c8,c7,0

(2)鎖定TLB

由于對(duì)TLB表的查詢經(jīng)常會(huì)使系統(tǒng)訪問內(nèi)存(要查詢的段、頁不在TLB中),這就使得系統(tǒng)的平均訪問時(shí)間大大增加。對(duì)于實(shí)時(shí)系統(tǒng),就需要將一些關(guān)鍵的頁表項(xiàng)鎖定在訪問速度相對(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)的操作可以通過對(duì)CP15寄存器r10編程來實(shí)現(xiàn)。

各種ARM核的可用鎖定命令如表15.31所示。

表15.31 訪問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

寫數(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

寫指令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為TLB中入口(entry)的個(gè)數(shù)。對(duì)ARM920T、ARM922T、ARM926EJ-S、ARM1022E版本的內(nèi)核來講,W=6;而對(duì)于ARM1026EJ-S內(nèi)核版本,W=3。

·??victm位域:確定下次被換出的TLB入口(entry)。

·??base位域:從第0個(gè)入口(entry)到base??1入口的TLB值,被鎖定。

鎖定TLB中N條地址入口的操作序列如下。

①?確保在整個(gè)鎖定過程中不會(huì)發(fā)生異常中斷,可以通過禁止中斷等方法實(shí)現(xiàn)。

②?如果鎖定的是指令TLB或指令/數(shù)據(jù)統(tǒng)一的TLB,將base=N、victim=N、P=0寫入寄存器c10。

③?使整個(gè)將要鎖定的TLB無效。

④?如果要鎖定指令TLB,確保與鎖定過程有關(guān)的指令地址變換地址入口已經(jīng)加載到指令TLB中。

注意

在此過程中,TLB的一個(gè)地址變換入口可以涵蓋所有與鎖定TLB相關(guān)的指令。這通常是由使整個(gè)TLB無效后的第一條指令實(shí)現(xiàn)的。

如果要鎖定的是數(shù)據(jù)TLB,確保與鎖定過程有關(guān)的數(shù)據(jù)地址變換地址入口已經(jīng)加載到數(shù)據(jù)TLB中。

注意

在此過程中避免使用內(nèi)嵌語法(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寫入寄存器c10中;

·??將每一條想要鎖定到TLB的變換地址入口讀取到TLB中。對(duì)于數(shù)據(jù)TLB和數(shù)據(jù)/指令統(tǒng)一的TLB可以使用LDR指令讀取一個(gè)涉及該變換地址入口的數(shù)據(jù),將該地址變換入口讀取到TLB中。對(duì)于指令TLB,通過操作寄存器c7,將相應(yīng)的變換地址讀取到指令TLB中。

⑥??將base=N、victim=N、P=0寫入寄存器c10中。

要解除TLB中被鎖定的變換地址入口,可以使用下面的操作序列。

①??通過操作寄存器c8,使TLB中各被鎖定的變換地址入口無效。

②??將base=0、victim=0、P=0寫入寄存器c10中。

15.5.8??存儲(chǔ)訪問失效

ARM中有兩種存儲(chǔ)訪問失效(Fault)可以導(dǎo)致處理器停止執(zhí)行。

·??MMU失效(MMU?Fault):由MMU檢測到失效(Fault)并通知處理器。

·??外部存儲(chǔ)器訪問中止(External?Abort):由外部存儲(chǔ)器向存儲(chǔ)器報(bào)告無效的存儲(chǔ)器訪問請(qǐng)求。

上述兩種情況統(tǒng)稱為存儲(chǔ)訪問中止(Abort)。如果存儲(chǔ)訪問中止發(fā)生在數(shù)據(jù)訪問周期,CPU將產(chǎn)生數(shù)據(jù)訪問中止異常中斷(Data?Abort);如果存儲(chǔ)訪問發(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種類型的訪問失效,分別是:

·??地址對(duì)齊失效(Alignment?Fault);

·??地址變換失效(Translation?Fault);

·??域控制失效(Domain?Fault);

·??訪問權(quán)限控制失效(Permission?Fault)。

存儲(chǔ)系統(tǒng)可以中止3種類型的存儲(chǔ)訪問:

·??Cache行預(yù)?。╨ine?fetch);

·??無Cache和寫緩存的存儲(chǔ)器訪問(uncached?or?unbuffered?accesses);

·??傳輸表訪問(translation?table?accesses)。

MMU失效優(yōu)先于外部存儲(chǔ)器訪問中止請(qǐng)求。當(dāng)存儲(chǔ)訪問失效發(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ǔ)訪問失效相關(guān)的寄存器

MMU中與存儲(chǔ)訪問失效相關(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ǔ)訪問失效發(fā)生時(shí),失效狀態(tài)寄存器中的字段被更新以反映所發(fā)生的存儲(chǔ)訪問失效的相關(guān)的信息,包括存儲(chǔ)訪問所屬的域以及存儲(chǔ)訪問的類型。同時(shí)存儲(chǔ)訪問失效的虛擬地址被保存到地址寄存器c6中。

在數(shù)據(jù)訪問周期發(fā)生存儲(chǔ)訪問失效更新了失效狀態(tài)寄存器后,如果系統(tǒng)尚未進(jìn)入存儲(chǔ)異常模式,這時(shí)發(fā)生了指令預(yù)取引起的存儲(chǔ)失效,則該指令預(yù)取引起的訪問失效將不會(huì)更新失效狀態(tài)寄存器的值。這樣就保證了數(shù)據(jù)訪問周期發(fā)生的存儲(chǔ)訪問失效狀態(tài)信息不會(huì)被指令預(yù)取周期發(fā)生的存儲(chǔ)訪問失效破壞。

?

引起存儲(chǔ)訪問失效的存儲(chǔ)訪問類型如表15.32所示。

表中,對(duì)齊失效的編碼可以為0b0001或0b0011。

表15.32 存儲(chǔ)訪問失效的存儲(chǔ)訪問類型

優(yōu)先級(jí)

引起存儲(chǔ)訪問失效的原因

失效狀態(tài)字段

域字段

失效地址寄存器c6

最高

極端異常(Terminal?Exception)

0b0010

無效

生產(chǎn)商定義

中斷向量訪問異常(Vector?Exception)

0b0000

無效

有效

地址對(duì)齊(Alignment)

0b00x1

無效

有效

擴(kuò)展地址變換失效(頁表訪問失效)

一級(jí)頁表

0b1100

有效

有效

二級(jí)頁表

0b1110

無效

有效

地址變換失效

段失效

0b0101

無效

有效

頁失效

0b0111

有效

有效

域控制失效

段失效

0b1001

有效

有效

頁失效

0b1011

有效

有效

訪問權(quán)限控制失效

段失效

0b1101

有效

有效

頁失效

0b1111

有效

有效

基于Cache的外部存儲(chǔ)訪問系統(tǒng)異常

段失效

0b0100

有效

有效

頁失效

0b0110

有效

有效

最低

非Cache預(yù)取時(shí)外部存儲(chǔ)訪問異常

段失效

0b1000

有效

有效

頁失效

0b1010

有效

有效

在域控制字段(bits[3:0])中存在無效值,是因?yàn)闊o效發(fā)生在域訪問之前。

當(dāng)不同的存儲(chǔ)訪問類型同時(shí)引起存儲(chǔ)訪問失效時(shí),按照優(yōu)先級(jí)由高到低的次序,先保存優(yōu)先級(jí)高的存儲(chǔ)訪問失效相關(guān)信息,在表中各存儲(chǔ)訪問優(yōu)先級(jí)由上到下依次遞減。

圖15.36顯示了判斷存儲(chǔ)訪問失效的全過程。

下面分別介紹各種類型的存儲(chǔ)訪問失效方式。

①?極端異常(terminal?exception)

極端異常指的是發(fā)生了不可恢復(fù)的存儲(chǔ)訪問失效。具體屬于哪種情況,有生產(chǎn)商定義。

②?中斷向量訪問異常(vector?exception)

在數(shù)據(jù)訪問周期,如果訪問異常中斷向量表(地址0x0到0x1f)時(shí)發(fā)生存儲(chǔ)訪問失效,這種存儲(chǔ)訪問失效稱為中斷向量訪問異常。當(dāng)MMU被禁止時(shí)是否產(chǎn)生中斷向量訪問異常由生產(chǎn)商決定。

③?地址對(duì)齊失效

在數(shù)據(jù)訪問周期,如果訪問字單元地址時(shí)地址bits[1:0]位不是0b00,或者訪問半字單元時(shí)地址bits[0]位不是0b0,則產(chǎn)生的存儲(chǔ)訪問失效稱為地址對(duì)齊失效。在指令預(yù)取周期不會(huì)產(chǎn)生地址對(duì)齊失效。在數(shù)據(jù)訪問周期,如果訪問字節(jié)單位,不會(huì)產(chǎn)生地址訪問失效。

④?地址變換失效

有兩種類型的地址變換失效。一種是基于段的地址變換失效,它指當(dāng)一級(jí)頁表描述符的位bits[1:0]=0b00時(shí),表示該一級(jí)描述符頁表項(xiàng)無效,這時(shí)產(chǎn)生基于段的地址變換失效。第二種是基于頁的地址變換失效。當(dāng)二級(jí)描述符的位bits[1:0]=0b00時(shí),表示該二級(jí)描述符頁表項(xiàng)無效,這時(shí)產(chǎn)生基于頁的地址變換失效。

圖15.36??判斷存儲(chǔ)訪問失效的全過程。

?

⑤?域控制位失效

域控制位失效包括兩種類型。一種基于段的存儲(chǔ)訪問域控制失效。在一級(jí)描述符中包含4位的域標(biāo)識(shí)符。該標(biāo)識(shí)符指定了本段所屬的域,在MMU讀取一級(jí)描述符時(shí),它檢查域訪問控制寄存器c3中對(duì)應(yīng)于該域的控制位,如果相應(yīng)的兩位控制位為0b00,說明該域不允許存儲(chǔ)訪問,這時(shí),就產(chǎn)生了基于段的存儲(chǔ)訪問域控制失效。第二種是基于頁的存儲(chǔ)訪問中域控制位失效。在一級(jí)描述符中包含4位的域標(biāo)識(shí)符。該標(biāo)識(shí)符指定了本頁所屬的域,在MMU讀取一級(jí)描述符時(shí),它檢查域訪問控制寄存器c3中對(duì)應(yīng)于該域的控制位,如果相應(yīng)的兩位控制位為0b00,說明該域不允許存儲(chǔ)訪問,這時(shí)就產(chǎn)生了基于頁的存儲(chǔ)訪問域控制失效。

⑥?訪問權(quán)限失效

訪問權(quán)限失效的檢查是在域控制位失效檢查時(shí)進(jìn)行的。這時(shí)如果域訪問控制器中對(duì)應(yīng)于該域的控制位為0b01,則要進(jìn)行相應(yīng)的權(quán)限檢查。訪問權(quán)限失效有兩種類型。一種基于段的存儲(chǔ)訪問權(quán)限控制失效,對(duì)于基于段的存儲(chǔ)訪問,在一級(jí)描述符中包含一個(gè)兩位的訪問權(quán)限控制位AP。如果字段AP標(biāo)識(shí)了不允許進(jìn)行相關(guān)存儲(chǔ)訪問時(shí),產(chǎn)出基于段的存儲(chǔ)訪問權(quán)限控制失效。第二種是基于頁的存儲(chǔ)訪問控制失效。對(duì)于基于頁的存儲(chǔ)訪問,在二級(jí)描述符中定義的可能為大頁、小頁或者微頁。當(dāng)二級(jí)描述符中定義的為微頁時(shí),該二級(jí)描述符中包含一個(gè)對(duì)應(yīng)于該微頁的訪問控制字段AP,如果字段AP標(biāo)識(shí)了不允許進(jìn)行相關(guān)的存儲(chǔ)訪問,這時(shí)產(chǎn)生基于子頁的存儲(chǔ)訪問權(quán)限控制失效。同樣,當(dāng)二級(jí)頁表描述符中定義的為小頁或大頁時(shí),操作過程同微頁。

(3)外部存儲(chǔ)訪問失效

除處理器內(nèi)部MMU向CPU報(bào)告錯(cuò)誤外,ARM體系結(jié)構(gòu)還定義了一個(gè)外部訪問中斷引腳。該引腳可以用于外部存儲(chǔ)器向CPU訪問失效異常。但是,并不是所有失效異常都可以通過這種方式報(bào)告,所以該引腳在連線時(shí)要非常注意。下面列舉了存儲(chǔ)訪問操作,可以通過這種機(jī)制中止和重啟動(dòng)。

·??讀操作(reads)。

·??非緩存的寫操作(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ǔ)訪問過程。如果存儲(chǔ)訪問發(fā)生在存儲(chǔ)器想要獲取的數(shù)據(jù)中,這時(shí)該存儲(chǔ)訪問將立即被中止。如果產(chǎn)生中止的數(shù)據(jù)是在Cache預(yù)取時(shí),從存儲(chǔ)器順序讀出的,那么直到這些數(shù)據(jù)被存儲(chǔ)器訪問時(shí),該存儲(chǔ)訪問才會(huì)被中止。

帶緩存的寫操作不能通過這種方式向CPU報(bào)告異常。因此,在系統(tǒng)中標(biāo)記為可外部中止的存儲(chǔ)區(qū)域不要進(jìn)行可緩存的寫操作。

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中頁表,而且Cache及TLB中的內(nèi)容都必須使無效。這樣操作將帶來巨大的系統(tǒng)開銷,一方面重建MMU和使無效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)過快速上下文切換擴(kuò)展變換的虛擬地址??焖偕舷挛那袚Q擴(kuò)展將各進(jìn)程的虛擬空間變換成不同的虛擬空間。這樣在進(jìn)行進(jìn)程間切換時(shí)就不需要進(jìn)行虛擬地址到物理地址的重映射。

快速上下文切換擴(kuò)展將CPU發(fā)出的每個(gè)虛擬地址按照上述的規(guī)則進(jìn)行變換,然后發(fā)送到系統(tǒng)中的其他部分。變換過程如圖15.37所示。

圖15.37??快速上下文切換擴(kuò)展變換過程

使用快速上下文切換擴(kuò)展,虛擬存儲(chǔ)管理增加了一次地址轉(zhuǎn)換。快速上下文切換擴(kuò)展在虛擬地址到達(dá)Cache和TLB前,使用一個(gè)特殊的、包含進(jìn)程ID值的重定位寄存器來修改虛地址。把第一次變換前的地址稱為虛地址VA(Virtual?Address),把第一次變換后的地址稱為修改后虛擬地址MVA(Modified?virtual?Address)。

這樣,任務(wù)間的切換就不用涉及到改變頁表,只需簡單地將新任務(wù)的進(jìn)程ID寫到位于CP15地FCSE進(jìn)程ID寄存器。正是因?yàn)槿蝿?wù)切換不需要改變頁表,因而切換后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

訪問寄存器c13的指令格式如下所示:

MCR??p15,0,<Rd>,<c13>,c0,0

MRC??p15,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)程訪問別的進(jìn)程時(shí),被訪問的進(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)的改變。通過在CPU和MMU之間加FCSE使系統(tǒng)的虛擬地址空間映射沒有改變,所以不需要清除(Flush)或清理(Clean)Cache或TLB。

使用FCSE時(shí)執(zhí)行一次上下文切換需要的步驟:

①?保存執(zhí)行任務(wù)的上下文,并將執(zhí)行任務(wù)設(shè)置為睡眠態(tài);

②?將喚醒任務(wù)的進(jìn)程ID寫到CP15的寄存器c13中;

③?通過寫CP15的寄存器c3,將當(dāng)前任務(wù)的域設(shè)置為不可訪問,而喚醒任務(wù)的域設(shè)置為客戶訪問;

④?恢復(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)。

⑤?如果使用域來保護(hù)各個(gè)任務(wù),則除非修改一級(jí)頁表中域的相應(yīng)位,并在上下文切換時(shí)清除TLB,否則最多只能有16個(gè)并發(fā)任務(wù)。

Arm

Arm

ARM公司是一家知識(shí)產(chǎn)權(quán)(IP)供應(yīng)商,主要為國際上其他的電子公司提供高性能RISC處理器、外設(shè)和系統(tǒng)芯片技術(shù)授權(quán)。目前,ARM公司的處理器內(nèi)核已經(jīng)成為便攜通訊、手持計(jì)算設(shè)備、多媒體數(shù)字消費(fèi)品等方案的RISC標(biāo)準(zhǔn)。公司1990年11月由Acorn、Apple和VLSI合并而成。

ARM公司是一家知識(shí)產(chǎn)權(quán)(IP)供應(yīng)商,主要為國際上其他的電子公司提供高性能RISC處理器、外設(shè)和系統(tǒng)芯片技術(shù)授權(quán)。目前,ARM公司的處理器內(nèi)核已經(jīng)成為便攜通訊、手持計(jì)算設(shè)備、多媒體數(shù)字消費(fèi)品等方案的RISC標(biāo)準(zhǔn)。公司1990年11月由Acorn、Apple和VLSI合并而成。收起

查看更多

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

華清遠(yuǎn)見(www.farsight.com.cn)是國內(nèi)領(lǐng)先嵌入師培訓(xùn)機(jī)構(gòu),2004年注冊于中國北京海淀高科技園區(qū),除北京總部外,上海、深圳、成都、南京、武漢、西安、廣州均有直營分公司。華清遠(yuǎn)見除提供嵌入式相關(guān)的長期就業(yè)培訓(xùn)、短期高端培訓(xùn)、師資培訓(xùn)及企業(yè)員工內(nèi)訓(xùn)等業(yè)務(wù)外,其下屬研發(fā)中心還負(fù)責(zé)嵌入式、Android及物聯(lián)網(wǎng)方向的教學(xué)實(shí)驗(yàn)平臺(tái)的研發(fā)及培訓(xùn)教材的出版,截止目前為止已公開出版70余本嵌入式/移動(dòng)開發(fā)/物聯(lián)網(wǎng)相關(guān)圖書。企業(yè)理念:專業(yè)始于專注 卓識(shí)源于遠(yuǎn)見。企業(yè)價(jià)值觀:做良心教育、做專業(yè)教育,更要做受人尊敬的職業(yè)教育。