ARM寄存器分析以及異常處理方法
ARM 有7個基本工作模式
User : 非特權(quán)模式,大部分任務(wù)執(zhí)行在這種模式
FIQ : 當(dāng)一個高優(yōu)先級(fast) 中斷產(chǎn)生時將會進入這種模式
IRQ : 當(dāng)一個低優(yōu)先級(normal) 中斷產(chǎn)生時將會進入這種模式
Supervisor :當(dāng)復(fù)位或軟中斷指令執(zhí)行時將會進入這種模式
Abort : 當(dāng)存取異常時將會進入這種模式
Undef : 當(dāng)執(zhí)行未定義指令時會進入這種模式
System : 使用和User模式相同寄存器集的特權(quán)模式
注意:除User(用戶模式)是Normal(普通模式)外,其他6種都是Privilege(特權(quán)模式)。 Privilege中除Sys模式外,其余5種為異常模式。 各種模式的切換,可以是程序員通過代碼主動切換(通過寫CPSR寄存器);也可以是CPU在某些情況下自動切換。 各種模式下權(quán)限和可以訪問的寄存器不同。
非特權(quán)模式:User
特權(quán)模式:
異常模式:FIQ IRQ Svc Abort Udef
非異常模式:System Monitor
ARM寄存器分析
ARM共有37個寄存器,都是32位長度 37個寄存器中30個為“通用”型,1個固定用作PC,一個固定用作CPSR,5個固定用作5種異常模式下的SPSR。
r13(sp)用作堆??梢员4嫔舷挛模阌谝院筇D(zhuǎn)回來能繼續(xù)執(zhí)行
r14(lr)用于存儲返回地址,當(dāng)我們返回原模式可以bl lr或者mov pc lr這樣就實現(xiàn)了返回
r15(pc):程序指針,PC指向哪里,CPU就會執(zhí)行哪條指令(所以程序跳轉(zhuǎn)時就是把目標(biāo)地址代碼放到PC中)
cpsr:中各個bit位表明了cpu的某些狀態(tài)信息,這些信息非常重要,和后面學(xué)到的匯編指令息息相關(guān)(譬如BLE指令中的E就和
CPSR中的Z標(biāo)志位有關(guān)) cpsr中的I、F位和開中斷、關(guān)中斷有關(guān) cpsr中的mode位(bit4~bit0共5位)決定了CPU的工作模式,
在uboot代碼中會使用匯編進行設(shè)置。
spsr:用來保存cpsr
1.條件標(biāo)志位
-N: Negative result from ALU
-Z: Zero result from ALU
-C: ALU operation Carried out (進位/借位)
-V: ALU operation overflowed (溢出)
* N=1時,說明運算的結(jié)果為負(fù)數(shù),N=0時,說明運算的結(jié)果為正數(shù)或零。
* Z=1時,說明運算的結(jié)果為0,Z=0時,說明運算的結(jié)果為非0。
* C:
- 加法運算(包括CMP):當(dāng)運算結(jié)果產(chǎn)生了進位時(無符號數(shù)溢出),C=1,否則為0。
- 減法運算(包括CMP):當(dāng)運算結(jié)果產(chǎn)生了借位時(無符號數(shù)溢出),C=0,否則C=1。
- 對于包含移位操作的非加減指令操作時,C為移除值的最后一位。
- 對于其它的非加減指令,C的值通常不變。
* V:
- 對于加減法運算指令,當(dāng)操作數(shù)和運算結(jié)果為二進制的補碼表示的帶符號數(shù)時,V=1表示符號位溢出
- 對于其它的非加減法指令,V的值通常不變。
2.Q位:
* 在ARM V5及以上的版本的E系列處理器中,Q標(biāo)識位指示增強的DSP運算指令是否發(fā)生了溢出,在其它版本的處理器中,Q未定義。
3.J位:
* 僅ARM 5TE/J 架構(gòu)支持
* J=1時,處理器處于Jazelle狀態(tài)
跳轉(zhuǎn)過程
異常向量表
所有的CPU都有異常向量表,這是CPU設(shè)計時就設(shè)定好的,是硬件決定的。 當(dāng)異常發(fā)生時,CPU會自動動作(PC跳轉(zhuǎn)到異常向量處處理異常,有時伴有一些輔助動作) 異常向量表是硬件向軟件提供的處理異常的支持。
***異常產(chǎn)生時
做好保護現(xiàn)場的工作:
(1)把cpsr保存到spsr中,設(shè)置適當(dāng)?shù)腸psr(改變處理器的ARM狀態(tài)、改變處理器進入相應(yīng)的異常模式、(視情況)改變中斷禁止位禁止相應(yīng)中斷)
(2)保存返回地址到lr
(3)設(shè)置pc為相應(yīng)的異常向量
實現(xiàn)跳轉(zhuǎn)。
***異常返回時
做好恢復(fù)現(xiàn)場工作:
(1)從spsr恢復(fù)cpsr
(2)從lr恢復(fù)pc
注意:這些操作必須在ARM狀態(tài)執(zhí)行
TIPS:
(1)異常向量表中除了FIQ中斷都是4個字節(jié),所以只夠存放一段異常處理程序的代碼的首地址
(2)FIQ中斷為快速中斷,其中一個特殊的地方就體現(xiàn)在他的異常向量表(Vector Table)地址在最后一個,所以它可以存放不止4個字節(jié),這樣的話FIQ中斷可以不用只存放地址,而是把整個異常處理程序放進去,這樣就少跳轉(zhuǎn)了一次,加快了中斷相應(yīng)速度。