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