王茹
摘要:ARM協(xié)處理器CP15中的MCR指令和MRC指令是非常重要的指令,擔(dān)負(fù)著協(xié)處理器和主處理器之間的數(shù)據(jù)傳遞。對(duì)于虛擬存儲(chǔ)來來講作用尤為重要,它可以通過設(shè)置MMU、Cache、TLB表等操作來實(shí)現(xiàn)虛擬存儲(chǔ)。MCR指令和MRC指令用法復(fù)雜,目前介紹這兩個(gè)指令應(yīng)用的資料不多,大多點(diǎn)到即止。該文主要通過具體實(shí)例介紹MCR指令和MRC指令在ARM存儲(chǔ)系統(tǒng)中的使用情況。
關(guān)鍵詞:存儲(chǔ)系統(tǒng);MCR;MRC;MMU;Cache
中圖分類號(hào):TP313文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2012)05-1190-04
MCR and MRC Instructions Used in the Storage System
WANG Ru
( Liaoning Equipment Manufacturing Technical College, Shenyang 110161, China)
Abstract: MRC and MCR instructions are very important command in the ARM coprocessor CP15, their responsible is data transfer be? tween co-processor and host processor. They are particularly important to virtual storage, it can set the MMU, Cache, TLB table and other operations to achieve the virtual storage. MCR and MRC instructions are complex instructions, Now, the application describe of these two commands is no more information. This paper mainly through concrete examples to introduced how to use MCR instructions and MRC instructions in the ARM memory system .
Key words: storage system; MCR; MRC; MMU; Cache
在基于ARM的嵌入式應(yīng)用系統(tǒng)中,存儲(chǔ)系統(tǒng)的操作通常是由協(xié)處理器CP15完成的。CP15包含16個(gè)32位的寄存器,其編號(hào)為0~15。而訪問CP15寄存器的指令主要是MCR和MRC這兩個(gè)指令。本文主要介紹MRC和MCR指令在存儲(chǔ)系統(tǒng)中是如何使用的。
1 MRC和MCR指令格式
1.1 MRC指令格式
MRC {條件}協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,{協(xié)處理器操作碼2}
MRC指令用于將協(xié)處理器寄存器中的數(shù)據(jù)傳送到ARM處理器寄存器中,如果協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義的指令異常。
其中,協(xié)處理器操作碼1為協(xié)處理器將要執(zhí)行的操作。對(duì)于CP15協(xié)處理器來說,協(xié)處理器操作碼1永遠(yuǎn)為0b000,當(dāng)協(xié)處理器操作碼1不為0b000時(shí),該指令操作結(jié)果不可預(yù)知;
目的寄存器為ARM處理器的寄存器;源寄存器1和2為協(xié)處理器的寄存器;
協(xié)處理器操作碼2為協(xié)處理器將要執(zhí)行的操作。通常源寄存器2和協(xié)處理器操作碼2兩者組合決定對(duì)協(xié)處理器寄存器進(jìn)行所需要的操作,如果沒有指定,則將源寄存器2設(shè)置為C0,協(xié)處理器操作碼2設(shè)置為0,否則可能導(dǎo)致不可預(yù)知的結(jié)果。
1.2 MCR指令格式
MCR {條件}協(xié)處理器編碼,協(xié)處理器操作碼1,源寄存器,目的寄存器1,目的寄存器2,{協(xié)處理器操作碼2}
MCR指令用于將ARM處理器寄存器中的數(shù)據(jù)傳送到協(xié)處理器寄存器中,如果協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義的指令異常。
其中,源寄存器為ARM處理器的寄存器;目的寄存器1和2均為協(xié)處理器的寄存器;協(xié)處理器操作碼1和2的含義及用法同MRC指令。
2 MRC和MCR在存儲(chǔ)器管理單元(MMU)中的使用
2.1禁止/使能MMU
CP15協(xié)處理器的寄存器C1的位[0]用于控制禁止/使能MMU。當(dāng)CP15協(xié)處理器的寄存器C1的位[0]設(shè)置為0時(shí),禁止MMU;當(dāng)CP15協(xié)處理器的寄存器C1的位[0]設(shè)置為1時(shí),使能MMU。
使能MMU的指令:MRC P15, 0 , R0 ,C1 ,0 , 0
ORR R0,R0,#1
MCR P15, 0 ,R0 , C1 ,0 , 0
禁止MMU的指令:MRC P15, 0 , R0 ,C1 ,0 , 0
BIC R0,R0,#1
MCR P15, 0 ,R0 , C1 ,0 , 0
2.2設(shè)置頁表的基地址
頁表存放在內(nèi)存中,通常在ARM中系統(tǒng)協(xié)處理器CP15的C2寄存器用來保存頁表的基地址。其中位[31:14]為內(nèi)存頁表的基地址,位[13:0]為0。
加載頁表的首地址到CP15協(xié)處理器的寄存器C2的指令,例如:
MOV R3,#0X12340000
MCR p15, 0, R3, C2, C0, 0
2.3 MMU中存儲(chǔ)訪問權(quán)限控制
在MMU中,寄存器C1的R、S控制位和頁表中地址轉(zhuǎn)換條目中的訪問權(quán)限控制位AP聯(lián)合作用控制存儲(chǔ)訪問的權(quán)限。具體規(guī)則如表1所示。[1]
表1 MMU中存儲(chǔ)訪問權(quán)限控制
C1寄存器的R和S位的設(shè)置的指令,例如:
MRC p15, 0, R0, c1, c0, 0; read control register
AND R0,R0,#0XFFFFFCFF;set R=0,S=0
MCR P15, 0 ,R0 , C1 ,0 , 0; write control register
2.4 MMU中域的控制
MMU中的域指的是一些段、大頁或者小頁的集合。ARM支持最多16個(gè)域,每個(gè)域的訪問控制特性由CP15中的寄存器C3中的兩位來控制。
CP15中的寄存器C3的格式如圖1所示。
圖1 C3寄存器格式
該寄存器有效位為32,被分成16個(gè)區(qū)域,每個(gè)區(qū)域由兩個(gè)位組成,含義如下:
00:當(dāng)前級(jí)別下,該內(nèi)存區(qū)域不允許被訪問,任何的訪問都會(huì)引起一個(gè)domain fault
01:當(dāng)前級(jí)別下,該內(nèi)存區(qū)域的訪問必須配合該內(nèi)存區(qū)域段描述符中AP位進(jìn)行權(quán)檢查
10:保留狀態(tài)
11:當(dāng)前級(jí)別下,對(duì)該內(nèi)存區(qū)域的訪問都不進(jìn)行權(quán)限檢查
設(shè)置域的訪問權(quán)限可使用以下語句,例如:
MRC p15, 0, R0, C3, C0, 0; Read domain 15:0 access permissions
ORR R0,R0,#0X00000030 ; Set D2=0b11
MCR p15, 0, Rd, C3, C0, 0; Read domain 15:0 access permissions
2.5快表(TLB)的使用
2.5.1使快表內(nèi)容無效的操作
CP15協(xié)處理器的寄存器C8是用來控制清除TLB內(nèi)容的相關(guān)操作。它是一個(gè)只寫寄存器。使用MRC讀取該寄存器,會(huì)可能產(chǎn)生不可預(yù)知的效果。可使用MCR指令來寫該寄存器,具體格式如下:
MCR {條件} P15,0,源寄存器,C8,目的寄存器2,{協(xié)處理器操作碼2}
其中,源寄存器中位將寫入C8中的數(shù)據(jù);目的寄存器2,協(xié)處理器操作碼2的不同組合決定指令執(zhí)行不同的操作,具體含義如表2所示。[2]
表2使無效快表內(nèi)容的指令格式
2.5.2鎖定快表內(nèi)容
MMU可以將某些地址變換條目鎖定在TLB中,從而使得進(jìn)行與該地址變換條目相關(guān)的地址變換速度保持很快。在MMU中寄存器C10用于控制TBL內(nèi)容的鎖定。
TLB鎖定指令的具體格式:
MCR P15 , 0 ,源寄存器, C10 , C0 ,協(xié)處理器操作碼2。
MRC P15 , 0 ,目的寄存器,C10 , C0,協(xié)處理器操作碼2。
當(dāng)系統(tǒng)中包含獨(dú)立的數(shù)據(jù)TLB和指令TLB時(shí),對(duì)應(yīng)于數(shù)據(jù)TLB和指令TLB分別有一個(gè)獨(dú)立的TLB內(nèi)容鎖定寄存器。上面指令中的協(xié)處理器操作碼2用于選擇其中的某個(gè)寄存器。
協(xié)處理器操作碼2=1,選擇指令TLB的內(nèi)容鎖定寄存器。
協(xié)處理器操作碼2=0,選擇數(shù)據(jù)TLB的內(nèi)容鎖定寄存器。
當(dāng)系統(tǒng)中使用統(tǒng)一的數(shù)據(jù)cache和指令cache時(shí),協(xié)處理器操作碼2的值應(yīng)為0。
例如:MCR p15 , 0 , r0 , c10 , c0 , 0;鎖定數(shù)據(jù)TLB。
MCR p15 , 0 , r0 , c10 , c0 , 1;鎖定指令TLB。
3 MRC和MCR在高速緩沖存儲(chǔ)器(Cache)中的使用
3.1控制cache和寫緩沖區(qū)
CP15中的寄存器C7用于控制cache和寫緩沖區(qū)。它是一個(gè)只寫的寄存器,使用MCR指令來寫該寄存器,具體格式如下:
MCR P15, 0,源寄存器, C7,目的寄存器2,操作碼2
其中,源寄存器為將寫入C7中的數(shù)據(jù);目的寄存器2,操作碼2的不同組合決定執(zhí)行不同的操作,如表3所示。[2]
表3 MCR指令中目的寄存器2,操作碼2的不同組合決定執(zhí)行不同的操作
例如:MCR p15, 0, r0, c7, c7, 0;disable ICache, DCache
3.2鎖定Cache
寄存器C9是Cache內(nèi)容鎖定寄存器。Cache內(nèi)容鎖定就是將一些關(guān)鍵代碼和數(shù)據(jù)預(yù)取到Cache后,設(shè)置一定的屬性,使發(fā)生Cache塊替換時(shí),這些關(guān)鍵代碼和數(shù)據(jù)所在的塊不會(huì)被替換。[3]
Cache鎖定指令的具體格式:
MCR P15 , 0 ,源寄存器, C9 , C0 ,協(xié)處理器操作碼2
MRC P15 , 0 ,目的寄存器, C9 , C0,協(xié)處理器操作碼2
當(dāng)系統(tǒng)中包含獨(dú)立的數(shù)據(jù)Cache和指令Cache時(shí),對(duì)應(yīng)于數(shù)據(jù)Cache和指令Cache分別有一個(gè)獨(dú)立的Cache內(nèi)容鎖定寄存器。上面指令中的協(xié)處理器操作碼2用于選擇其中的某個(gè)寄存器。
協(xié)處理器操作碼2=1,選擇指令cache的內(nèi)容鎖定寄存器。協(xié)處理器操作碼2=0,選擇數(shù)據(jù)cache的內(nèi)容鎖定寄存器。
當(dāng)系統(tǒng)中使用統(tǒng)一的數(shù)據(jù)cache和指令cache時(shí),協(xié)處理器操作碼2的值應(yīng)為0。
例如:MCR p15 , 0 , r0 , c9 , c0 , 0;鎖數(shù)據(jù)Cache
MCR p15 , 0 , r0 , c9 , c0 , 1;鎖指令Cache
4結(jié)論
ARM中協(xié)處理器CP15中的MCR指令和MRC指令是非常重要的指令,擔(dān)負(fù)著協(xié)處理器和主處理器之間的數(shù)據(jù)傳遞。對(duì)于虛擬存儲(chǔ)來講作用尤為重要,它可以設(shè)置MMU、Cache、TLB表實(shí)現(xiàn)虛擬存儲(chǔ)。本文只對(duì)存儲(chǔ)系統(tǒng)中主要的幾個(gè)功能涉及的MCR和MRC指令如何使用做以介紹,希望通過具體的應(yīng)用例子,讀者能對(duì)MRC和MCR指令有更深的認(rèn)識(shí)。
參考文獻(xiàn):
[1]杜春雷. ARM體系結(jié)構(gòu)與編程[M].北京清華大學(xué)出版社,2005.
[2]孫曄. ARM嵌入式系統(tǒng)及應(yīng)用[M].江蘇教育出版社,2011.
[3] ARM9協(xié)處理器CP15及MCR與MRC [EB/OL]. http://6xudonghai.blog.163.com/blog/static/336406292008724103317304/.