ARM存儲(chǔ)器之:存儲(chǔ)保護(hù)單元MPU
一些嵌入式系統(tǒng)使用多任務(wù)的操作和控制。這些系統(tǒng)必須提供一種機(jī)制來(lái)保證正在運(yùn)行的任務(wù)不破壞其他任務(wù)的操作。即要防止系統(tǒng)資源和其他一些任務(wù)不受非法訪(fǎng)問(wèn)。要達(dá)到這一目的通常有軟件保護(hù)和硬件保護(hù)兩種途徑。這里軟件保護(hù)是指僅靠軟件來(lái)保護(hù)系統(tǒng)資源。系統(tǒng)中無(wú)保護(hù)硬件或硬件沒(méi)啟動(dòng)。在多任務(wù)的系統(tǒng)中,通常要運(yùn)行操作系統(tǒng)來(lái)達(dá)到任務(wù)間同步與通信。所以,這種軟件的資源保護(hù)通常由操作系統(tǒng)來(lái)完成。但這種通過(guò)軟件來(lái)協(xié)調(diào)任務(wù)運(yùn)行,保護(hù)系統(tǒng)資源的做法有時(shí)會(huì)出現(xiàn)一些不可避免的問(wèn)題。如當(dāng)對(duì)一個(gè)通信用串口寄存器進(jìn)行操作時(shí),如果一個(gè)任務(wù)正在使用串口,則它沒(méi)有辦法來(lái)防止其他任務(wù)使用同一個(gè)串口。因此,若要成功使用該串口,則必須通過(guò)一個(gè)訪(fǎng)問(wèn)該串口的系統(tǒng)調(diào)用來(lái)協(xié)調(diào)。使用這些調(diào)用任務(wù)的非授權(quán)訪(fǎng)問(wèn),很容易破壞經(jīng)過(guò)該串口的通信。因此資源的不合理使用也許是不可避免的。
相反,受保護(hù)系統(tǒng)有專(zhuān)門(mén)的硬件來(lái)檢測(cè)和限制系統(tǒng)資源的訪(fǎng)問(wèn)。它能保證資源的所有權(quán),任務(wù)需要遵守一組由操作環(huán)境定義的、由硬件維護(hù)的規(guī)則,在硬件級(jí)上授予監(jiān)視和控制資源程序的特殊權(quán)限。受保護(hù)系統(tǒng)主動(dòng)防止一個(gè)任務(wù)使用其他任務(wù)的資源。因此使用硬件主動(dòng)監(jiān)視系統(tǒng)比協(xié)調(diào)加強(qiáng)的軟件歷程,提供了更好的保護(hù)。
ARM中配備的有效保護(hù)系統(tǒng)資源的硬件,有兩種:
·MPU(MemoryProtectionUnit);
·MMU(MemoryManagementUnit)。
MMU是比MPU提供了功能更強(qiáng)大的內(nèi)存保護(hù)機(jī)制,MPU只提供了內(nèi)存區(qū)域保護(hù),而MMU是在此基礎(chǔ)上提供了虛擬地址映射技術(shù),而且在操作上,MMU要比MPU負(fù)責(zé)。本節(jié)主要討論帶MPU的處理器內(nèi)核,MMU將在下一節(jié)詳細(xì)介紹。
15.4.1保護(hù)域(ProtectionRegions)ARM處理器中的MPU使用“域(regions)”來(lái)對(duì)內(nèi)存單元進(jìn)行管理。域是與存儲(chǔ)空間相關(guān)聯(lián)的屬性,處理器核將這些數(shù)據(jù)保存在協(xié)處理器CP15的一些寄存器中。通常域的個(gè)數(shù)為8個(gè),編號(hào)為從0~7。
域的大小和起始地址保存在CP15的寄存器c6中。大小可以是4KB~4GB的任何2的乘冪。域的起始地址必須是其大小的倍數(shù)。比如,一個(gè)定義為4KB的域其起始地址可以是0x12345000,而一個(gè)大小定義為8KB的域起始地址只能是0x2000的倍數(shù)。
另外,操作系統(tǒng)可以為這些域分配更多的屬性:訪(fǎng)問(wèn)權(quán)限、cache和寫(xiě)緩存。存儲(chǔ)器基于當(dāng)時(shí)的處理器模式(管理模式或用戶(hù)模式)可以設(shè)定這些區(qū)域的訪(fǎng)問(wèn)權(quán)限為讀/寫(xiě)、只讀和不可訪(fǎng)問(wèn)。
當(dāng)處理器訪(fǎng)問(wèn)主存的一個(gè)域時(shí),MPU比較該域的訪(fǎng)問(wèn)權(quán)限屬性和當(dāng)時(shí)的處理器模式。如果請(qǐng)求符合域的訪(fǎng)問(wèn)標(biāo)準(zhǔn),則MPU允許內(nèi)核讀/寫(xiě)主存;如果存儲(chǔ)器請(qǐng)求不符號(hào)域的訪(fǎng)問(wèn)標(biāo)準(zhǔn),將產(chǎn)生一個(gè)異常信號(hào)。
異常信號(hào)被送到處理器核。處理器核執(zhí)行一個(gè)異常向量,然后跳轉(zhuǎn)到異常處理程序,異常處理程序判斷異常類(lèi)型為預(yù)取指或數(shù)據(jù)中止,然后根據(jù)異常類(lèi)型,跳轉(zhuǎn)到相應(yīng)的服務(wù)例程。
對(duì)于ARM處理器,存儲(chǔ)空間的某一部分可以被分配給一個(gè)以上的區(qū)域。也就是說(shuō)域可以重疊。在重疊的域內(nèi),可以設(shè)置域的優(yōu)先級(jí)。在分配訪(fǎng)問(wèn)權(quán)限時(shí)重疊域比非重疊域有更大的靈活性。后面一節(jié)將會(huì)詳細(xì)介紹域的重疊。
15.4.2內(nèi)存訪(fǎng)問(wèn)順序當(dāng)ARM處理器產(chǎn)生一個(gè)內(nèi)存訪(fǎng)問(wèn)信號(hào)時(shí),內(nèi)存保護(hù)單位MPU將負(fù)責(zé)檢查要訪(fǎng)問(wèn)的地址是否在被定義的域中。
①如果地址不在任何域中,存儲(chǔ)器產(chǎn)生異常。如果內(nèi)核預(yù)取指令則MPU產(chǎn)生預(yù)取中止異常;如果是存儲(chǔ)器數(shù)據(jù)請(qǐng)求,則產(chǎn)生數(shù)據(jù)中止異常。
②如果地址在多個(gè)域內(nèi),由MPU判斷域的有效級(jí)來(lái)決定存儲(chǔ)區(qū)域的訪(fǎng)問(wèn)屬性。訪(fǎng)問(wèn)屬性可以在CP15的寄存器中設(shè)定,可設(shè)定的位為C(Cache)、B(Buffer)、AP(AccessPermission)。這些屬性的具體定義為:
·C和B可以控制Cache和寫(xiě)緩存屬性的Cache策略。例如,可以設(shè)置一個(gè)域使用回寫(xiě)(write-back)策略訪(fǎng)問(wèn)存儲(chǔ)器,而另一個(gè)域則以無(wú)Cache和無(wú)寫(xiě)緩存方式訪(fǎng)問(wèn);
·AP(accesspermission)決定域是否可以被訪(fǎng)問(wèn)。如果在當(dāng)前處理器模式下,該域不能被訪(fǎng)問(wèn),MPU將產(chǎn)生一個(gè)存儲(chǔ)器訪(fǎng)問(wèn)異常。
圖15.16顯示了一個(gè)存儲(chǔ)器訪(fǎng)問(wèn)過(guò)程。
圖15.16存儲(chǔ)器訪(fǎng)問(wèn)過(guò)程
15.4.3使能MPU通過(guò)對(duì)協(xié)處理器CP15的寄存器c1中的bit[0]置1,可以使能存儲(chǔ)器保護(hù)單元MPU。在系統(tǒng)上電時(shí),默認(rèn)狀態(tài)是該位清零,所有保護(hù)域無(wú)效。
在使能MPU之前,至少一個(gè)域要被設(shè)定,而且該域的屬性和訪(fǎng)問(wèn)權(quán)限要預(yù)先設(shè)定好。
注意
在數(shù)據(jù)和指令域分離的系統(tǒng)中,如ARM940T,在指令和數(shù)據(jù)域中都要有一個(gè)有效域被預(yù)先設(shè)定好。
另外,使能MPU的指令要設(shè)在有效的域中。如果在使能MPU之前,域的屬性和訪(fǎng)問(wèn)權(quán)限沒(méi)有設(shè)定,那么系統(tǒng)的運(yùn)行結(jié)果將不可預(yù)知。
當(dāng)MPU無(wú)效(將協(xié)處理器CP15寄存器r1的bit[0]置0)時(shí),整個(gè)內(nèi)存區(qū)域都被處理器視為無(wú)Cache、無(wú)寫(xiě)緩存、無(wú)存儲(chǔ)保護(hù)狀態(tài)。
15.4.4重疊域域的定義在MPU的作用下可以重疊。當(dāng)重疊的域被訪(fǎng)問(wèn)時(shí),MPU會(huì)判斷域的優(yōu)先權(quán),決定使用那個(gè)域的屬性來(lái)操作重疊域。
域?qū)傩詢(xún)?yōu)先級(jí)的排列順序?yàn)椋河?的有效級(jí)最高,其次為域6,域0的優(yōu)先級(jí)最低。
【例15.3】
假設(shè)將一個(gè)從0x3000起始的4KB地址空間定義為域2,其訪(fǎng)問(wèn)屬性AP定義為0b10(AP=0b10,特權(quán)模式讀/寫(xiě)訪(fǎng)問(wèn),用戶(hù)模式只讀)。
將起始地址為0x0的16KB地址空間定義為域1,其訪(fǎng)問(wèn)屬性AP定義為0b01(AP=0b01,特權(quán)模式只讀)。
系統(tǒng)域劃分如圖15.17所示。
圖15.17重疊域的訪(fǎng)問(wèn)
當(dāng)處理器在用戶(hù)模式下執(zhí)行Load指令,從0x3010地址取數(shù)據(jù)時(shí),0x3010地址既在域1中也在域2中,因?yàn)橛?的屬性?xún)?yōu)先級(jí)高于域1,所有MPU執(zhí)行域2的訪(fǎng)問(wèn)屬性從0x3010地址取數(shù)據(jù)。域2是用戶(hù)模式可讀,所以不會(huì)發(fā)生數(shù)據(jù)異常。
在分配訪(fǎng)問(wèn)權(quán)限時(shí)重疊區(qū)域比非重疊區(qū)域有更大的靈活性,它可以使內(nèi)存的某個(gè)特定聯(lián)系內(nèi)存單位在程序中擔(dān)任背景的作用,用來(lái)給一塊大存儲(chǔ)空間分配相同的屬性的低優(yōu)先級(jí)域。其他具有較高優(yōu)先級(jí)域的區(qū)域與該背景域某些部分重疊,用來(lái)改變已定義的背景域的較小子集的屬性。這樣,具有較高優(yōu)先級(jí)的域可以改變背景域?qū)傩缘淖蛹1尘坝蚩梢杂脕?lái)保護(hù)一些睡眠狀態(tài)的存儲(chǔ)空間,使其不受非法訪(fǎng)問(wèn),而此時(shí)由另一個(gè)不同域控制下的背景域的其他部分可以處于活躍狀態(tài)。
15.4.5與MPU相關(guān)的CP15寄存器與MPU相關(guān)的協(xié)處理器寄存器主要是c2,c3,c5及c6。另外還有寄存器c1中的1到2位。
(1)c1中的MPU相關(guān)位
c1的編碼格式如圖15.18所示。
圖15.18協(xié)處理器寄存器c1編碼格式
M(bit[0])控制控制MPU的使能。
·M=0:禁止MPU
·M=1:使能MPU
A(bit[1])選擇是否支持內(nèi)存訪(fǎng)問(wèn)地址對(duì)齊檢查。
·B=0:禁止地址對(duì)齊檢查
·B=1:使能地址對(duì)齊檢查
(2)c2中的MPU相關(guān)位
c2的編碼格式如圖15.19所示。
圖15.19協(xié)處理器寄存器c2編碼格式
寄存器位0~7分別對(duì)應(yīng)域0~7的Cache屬性。位8~31應(yīng)該設(shè)置成0。
注意
在數(shù)據(jù)和指令分離的系統(tǒng)中,通過(guò)MRC和MCR指令的第二個(gè)操作數(shù)<opcode2>來(lái)決定讀寫(xiě)D-Cache和I-Cache屬性。
(3)c3中的MPU相關(guān)位
c3的編碼格式如圖15.20所示。
圖15.20協(xié)處理器寄存器c3編碼格式
寄存器位0~7分別對(duì)應(yīng)域0~7的寫(xiě)緩存屬性。位8~31應(yīng)該設(shè)置成0。
當(dāng)用指令MCR/MRC對(duì)c3進(jìn)行讀寫(xiě)時(shí),第二個(gè)操作數(shù)<opcode2>將被忽略,在指令要設(shè)置成0。
當(dāng)配置數(shù)據(jù)域時(shí),域的Cache位和寫(xiě)緩存區(qū)位一起決定域的訪(fǎng)問(wèn)策略。寫(xiě)緩存位有兩個(gè)用途:使能/禁止域的寫(xiě)緩存和設(shè)置域的Cache寫(xiě)策略。域的Cache位控制寫(xiě)緩存位的作用。具體位分配見(jiàn)表15.16。
表15.16 Cache位和寫(xiě)緩存位的分配策略
Cache位
寫(xiě)緩存區(qū)位
域?qū)傩?/p>
C=0
B=0
禁止Cache、禁止寫(xiě)緩存
C=0
B=1
禁止Cache、使能寫(xiě)緩存
C=1
B=0
使能Cache,域使用回寫(xiě)策略
C=10
B=1
使能Cache,域使用直寫(xiě)策略
(4)訪(fǎng)問(wèn)權(quán)限寄存器c5
協(xié)處理器CP15的寄存器c5設(shè)置內(nèi)存域的訪(fǎng)問(wèn)權(quán)限。
寄存器c5的編碼格式如圖15.21所示。
圖15.21寄存器c5的編碼格式
讀寄存器c3的bits[15:0]存放域的AP(accesspermission,訪(fǎng)問(wèn)權(quán)限),其中bits[2n+1:2n]對(duì)于域n的訪(fǎng)問(wèn)權(quán)限。AP編碼與訪(fǎng)問(wèn)權(quán)限的對(duì)應(yīng)關(guān)系如表15.17所示。
表15.17 AP編碼與訪(fǎng)問(wèn)權(quán)限的對(duì)應(yīng)關(guān)系
AP編碼
管理者
用戶(hù)
00
不可訪(fǎng)問(wèn)
不可訪(fǎng)問(wèn)
01
讀/寫(xiě)
不可訪(fǎng)問(wèn)
10
讀/寫(xiě)
只讀
11
讀/寫(xiě)
讀/寫(xiě)
對(duì)于Arm940T、Arm940T兩個(gè)內(nèi)核版本來(lái)說(shuō),使用MRC和MCR指令對(duì)其進(jìn)行讀寫(xiě)時(shí),第二個(gè)協(xié)處理器寄存器<CRm>將被忽略,指令中以c0的形式出現(xiàn)。對(duì)于指令數(shù)據(jù)統(tǒng)一的域,第二操作數(shù)<opcode2>要設(shè)成0,而對(duì)于數(shù)據(jù)和指令分離的系統(tǒng),如果opcode2=0,說(shuō)明操作對(duì)數(shù)據(jù)域有效,如果opcode=1,說(shuō)明操作對(duì)指令域有效。
注意
對(duì)于Arm946E-S和Arm1026EJ-S兩個(gè)內(nèi)核版本,它們的訪(fǎng)問(wèn)權(quán)限機(jī)制更復(fù)雜,采用的是擴(kuò)展AP,擴(kuò)展組AP位域編碼支持兩個(gè)增強(qiáng)的權(quán)限域,對(duì)其進(jìn)行操作的MRC和MCR指令形式更復(fù)雜,有關(guān)更詳細(xì)的內(nèi)容,請(qǐng)參加Arm公司的用戶(hù)手冊(cè)。
(5)域大小控制寄存器c6
Arm系統(tǒng)中通過(guò)寫(xiě)協(xié)處理器c6來(lái)定義域的大小,通過(guò)MCR指令中第二個(gè)操作寄存器賦不同的值來(lái)指示是對(duì)哪個(gè)具體域進(jìn)行操作。第二個(gè)操作寄存器取值為c0~c7,分別對(duì)應(yīng)域0~域7。
每個(gè)域的起始地址必須對(duì)齊到其大小的整數(shù)倍。比如,一個(gè)域的大小位64KB,其起始地址可以是0x10000的整數(shù)倍的任何數(shù)。域的大小可以是4KB~4GB的2的任意乘冪。
寄存器c6的編碼格式如圖15.22所示。
圖15.22域大小控制寄存器c6編碼格式
編碼含義如表15.18所示
表15.18 寄存器c6編碼含義
位名稱(chēng)
對(duì)應(yīng)位
注釋
起始地址
[31:12]
保護(hù)域的第一個(gè)字節(jié)起始地址,具體見(jiàn)表2.18
SBZ
[11:6]
必須設(shè)為0
Size
[5:1]
設(shè)Size=N,則域尺寸為2N+1,其中11≤N≤31
E
[0]
域使能,E=1使能,E=0禁止
關(guān)于c6中bits[31:12],因?yàn)橛虻钠鹗家怯虼笮〉恼稊?shù),域最小為4KB,所有域起始地址的bits[11:0]通常為0,不用設(shè)置。具體c6中起始地址的設(shè)置和c6中Size(bits[5:1])的對(duì)應(yīng)關(guān)系如表15.19所示。
表15.19 域尺寸編碼
Size(bits[5:1])
域尺寸
起始地址(bits[31:12])
0b00000~0b01010
未定義
-
0b01011
4KB
無(wú)
0b01100
8KB
bit[12]必須為0
0b01101
16KB
bits[13:12]必須為0
0b01110
32KB
bits[14:12]必須為0
0b01111
64KB
bits[15:12]必須為0
0b10000
126KB
bits[16:12]必須為0
0b10001
256KB
bits[17:12]必須為0
0b10010
512KB
bits[18:12]必須為0
0b10011
1MB
bits[19:12]必須為0
0b10100
2MB
bits[20:12]必須為0
0b10101
4MB
bits[21:12]必須為0
0b10110
8MB
bits[22:12]必須為0
0b10111
16MB
bits[23:12]必須為0
0b11000
32MB
bits[24:12]必須為0
0b11001
64MB
bits[25:12]必須為0
0b11010
128MB
bits[26:12]必須為0
0b11011
256MB
bits[27:12]必須為0
0b11100
512MB
bits[28:12]必須為0
0b11101
1GB
bits[29:12]必須為0
續(xù)表
Size(bits[5:1])
域尺寸
起始地址(bits[31:12])
0b11110
2GB
bits[30:12]必須為0
0b11111
4GB
bits[31:12]必須為0