本文轉載自:http://blog.csdn.net/lizhiguo0532/article/details/5922639
非常感謝原作者,受益匪淺!
ARM處理器共有7中運行模式:
使用者模式(usr) -- 正常程式執行模式
|-- |-- 快速中斷模式(fiq) -- 用於高速資料轉送和通道處理
特 | 異 | 外部中斷模式(irq) -- 用於通常的中斷處理
權 --| 常 --| 管理員模式(svc) -- 供作業系統使用的一種保護模式
模 | 模 | 資料訪問中止模式(abt) -- 用於虛擬儲存及儲存保護
式 | 式 |-- 未定義指令中止模式(und) -- 用於支援通過軟體模擬硬體的副處理器
|-- 系統模式(sys) -- 用於運行特權級的作業系統任務
特權模式:fiq、irq、svc、abt、und、sys -- 程式可以訪問所有的系統資源,也可以任意切換處理器模式
異常模式:fiq、irq、svc、abt、und
ARM異常中斷種類及優先順序:
優先順序 異常中斷名稱
高 複位(reset)
|| 資料訪問中止(data abort)
|| 快速插斷要求(FIQ)
|| 外部插斷要求(IRQ)
/||/ 指令預取中止(prefetch abort)
// 非強制中斷(SWI)
低 未定義指令(undefined instruction)
異常向量表:
地址 異常中斷名稱 優先順序
. .
. .
. .
0x1c FIQ 3
0x18 IRQ 4
0x14 Reserved X
0x10 Data Abort 2
0x0c Prefetch Abort 4
0x08 SWI 5
0x04 Undefined Instruction 6
0x00 Reset 1
Vector Table可以位於0x0或者0xFFFF0000處(ARM720T、ARM9、ARM10..)
優先順序為3的FIQ為什麼放在地址0x1c處呢?當初這麼設計應該是為了更加快速地響應FIQ中斷,也就是說不在0x1c地
址放跳轉指令,而是直接存放最關鍵的FIQ處理代碼在0x1c開始一段地址地區內。
異常進入及返回:
當異常產生時:
1. 拷貝當前模式的CPSR值到相應異常模式的SPSR_<mode>,如:CPSR(usr) --> SPSR_svc(svc)。
2. 設定適當的CPSR位:
改變處理器狀態進入ARM狀態
改變處理器模式進入相應的異常模式
如果需要可以設定中斷禁止位禁止相應中斷
3. 儲存返回地址(pc-4)到LR_<mode>。
4. 設定pc為相應的異常向量。
異常返回時,需要:
1. 從SPSR_<mode>恢複CPSR。
2. 從LR_<mode>恢複pc
(只能在ARM狀態下實現該返回操作)
異常返回的指令分析:
* 使用一資料處理指令實現,該指令帶“S”尾碼,同時pc作為目的寄存器
* 在特權模式下不僅僅要更新pc,而且還要拷貝SPSR到CPSR
1. 從SWI和Undef異常返回:
movs pc