ARM處理器模式切換(含MRS,MSR指令)
1.1.1ARM處理器模式切換(含MRS,MSR指令)
除了用戶模式和系統(tǒng)模式,其余模式下都有一個(gè)私有SPSR保存狀態(tài)寄存器,用來(lái)保存切換到該模式之前的執(zhí)行狀態(tài),之所以用戶模式和系統(tǒng)模式?jīng)]有SPSR是因?yàn)?,通常CPU大部分時(shí)間執(zhí)行在用戶模式下,當(dāng)產(chǎn)生異?;蛳到y(tǒng)調(diào)用時(shí)會(huì)分別切換進(jìn)入另外幾種模式,保存用戶模式下的狀態(tài),當(dāng)切換回原先模式時(shí),直接回復(fù)SPSR的值到CPSR就可以了,因此,用戶模式和系統(tǒng)模式下不需要SPSR,其詳細(xì)操作查看下節(jié)異常處理。以上幾種模式通過(guò)CPSR里的M[4:0]位進(jìn)行區(qū)分,如圖3-1所示:
圖3-1 CPSR控制位
通過(guò)向模式位M[4:0]里寫入相應(yīng)的數(shù)據(jù)切換到不同的模式,在對(duì)CPSR,SPSR寄存器進(jìn)行操作不能使用mov,ldr等通用指令,只能使用特權(quán)指令msr和mrs。
在ARM處理器中,只有MRS(Move to Register from State register)指令可以對(duì)狀態(tài)寄存器CPSR和SPSR進(jìn)行讀操作。通過(guò)讀CPSR可以獲得當(dāng)前處理器的工作狀態(tài)。讀SPSR寄存器可以獲得進(jìn)入異常前的處理器狀態(tài)(因?yàn)橹挥挟惓DJ较掠蠸PSR寄存器)。
例如:
MRSR1,CPSR;將CPSR狀態(tài)寄存器讀取,保存到R1中
MRSR2,SPSR;將SPSR狀態(tài)寄存器讀取,保存到R2中
通過(guò)MRS指令可以取得狀態(tài)寄存器里的值,然后比較其模式位M[4:0]的值判斷當(dāng)前所處模式,當(dāng)然也可以比較其它相應(yīng)位了解當(dāng)前CPU的狀態(tài)。MRSR2,SPSR;將SPSR狀態(tài)寄存器讀取,保存到R2中
同樣,在ARM處理器中,只有MSR指令可以對(duì)狀態(tài)寄存器CPSR和SPSR進(jìn)行寫操作。與MRS配合使用,可以實(shí)現(xiàn)對(duì)CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。
由于xPSR寄存器代表了CPU的狀態(tài),其每個(gè)位有特殊意義,在執(zhí)行對(duì)xPSR狀態(tài)寄存器寫入時(shí)(讀取時(shí)不存在該用法),為了防止誤操作和方便記憶,將xPSR里32位分成四個(gè)區(qū)域,每個(gè)區(qū)域用小寫字母表示:
c控制域屏蔽psr[7..0]
x擴(kuò)展域屏蔽psr[15..8]
s狀態(tài)域屏蔽psr[23..16]
f標(biāo)志域屏蔽psr[31..24]
注意:區(qū)域名必須為小寫字母
向?qū)?yīng)區(qū)域進(jìn)行執(zhí)行寫入時(shí),使用xPSR_x可以指定寫入?yún)^(qū)域,而不影響狀態(tài)寄存器其它位,如:x擴(kuò)展域屏蔽psr[15..8]
s狀態(tài)域屏蔽psr[23..16]
f標(biāo)志域屏蔽psr[31..24]
注意:區(qū)域名必須為小寫字母
使能IRQ中斷:
ENABLE_IRQ
MRSR0,CPSR;將CPSR寄存器內(nèi)容讀出到R0
BICR0,R0,#0x80;清掉CPSR中的I控制位
MSRCPSR_c,R0;將修改后的值寫回CPSR寄存器的對(duì)應(yīng)控制域
MOVPC,LR;返回上一層函數(shù)
禁用IRQ中斷:MRSR0,CPSR;將CPSR寄存器內(nèi)容讀出到R0
BICR0,R0,#0x80;清掉CPSR中的I控制位
MSRCPSR_c,R0;將修改后的值寫回CPSR寄存器的對(duì)應(yīng)控制域
MOVPC,LR;返回上一層函數(shù)
DISABLE_IRQ
MRSR0 CPSR;將CPSR寄存器內(nèi)容讀出到R0
ORRR0,R0,#0x80;設(shè)置CPSR中的I控制位
MSRCPSR_c,R0;將修改后的值寫回CPSR寄存器的對(duì)應(yīng)控制域
MOVPC,LR;返回上一層函數(shù)
下表列出了不同模式的二進(jìn)制數(shù)表示:MRSR0 CPSR;將CPSR寄存器內(nèi)容讀出到R0
ORRR0,R0,#0x80;設(shè)置CPSR中的I控制位
MSRCPSR_c,R0;將修改后的值寫回CPSR寄存器的對(duì)應(yīng)控制域
MOVPC,LR;返回上一層函數(shù)
表3-3不同工作模式對(duì)應(yīng)二進(jìn)制
模式名 | 用戶 | 快中斷 | 中斷 | 管理 | 中止 | 未定義 | 系統(tǒng) |
M[4:0] | 10000 | 10001 | 10010 | 10011 | 10111 | 11011 | 11111 |
stack_init;棧指針初始化函數(shù)
@ undefine_stack
msr cpsr_c,#0xdb;切換到未定義異常
ldrsp,=0x34000000;棧指針為內(nèi)存最高地址,棧為倒生的棧
;??臻g的最后1M0x34000000~0x33f00000
@ abort_stack
msr cpsr_c,#0xd7;切換到終止異常模式
ldrsp,=0x33f00000;??臻g為1M,0x33f00000~0x33e00000
@ irq_stack
msrcpsr_c,#0xd2;切換到中斷模式
ldrsp,=0x33e00000;棧空間為1M,0x33e00000~0x33d00000
@ sys_stack
msrcpsr_c,#0xdf;切換到系統(tǒng)模式
ldrsp,=0x33d00000;??臻g為1M,0x33d00000~0x33c00000
msrcpsr_c,#0xd3;切換回管理模式
mov pc,lr
評(píng)論