ARM體系結構中對異常中斷的一些概述
優先級
異常中斷類型 | 異常中斷模式 | 優先級 |
---|---|---|
Rset | 特權模式 | 1 |
Undef | 未定義指令中止模式 | 6 |
SWI | 特權模式 | 6 |
PAbort | 中止模式 | 5 |
DAbort | 中止模式 | 2 |
IRQ | 外部中斷模式 | 4 |
FIQ | 快速中斷模式 | 3 |
- SWI或Undef:發生該異常時,PC值未更新,它指向當前指令後面的第2條指令,進入中斷時,CPU將(
PC-4
)保存到lr_mode
中,(PC-4
)指向的是當前指令的下一條指令
;異常處理完後應返回當前指令的下一條指令
;即MOV PC, LR
- IRQ或FIQ:通常,CPU執行完當前指令後,查詢系統是否允許IRQ及FIQ中斷,以及是否產生IRQ及FIQ中斷,當該異常中斷產生時,PC值已更新,它指向當前指令的後3條指令,進入中斷時,CPU將(
PC-4
)保存到lr_mode
中,(PC-4
)指向的是當前指令後的第2條指令
;異常處理完後應返回當前指令的下一條指令
;即SUBS PC, LR, #4
- PAbort:指令預取中止異常;
ABC三條指令,在執行A時預取C,若C指令會產生異常則標記該指令,在執行指令C時,處理器產生指令預取中止異常中斷;當發生PAbort時,程序要返回到該有問題的指令處,重新讀取並執行該指令
。因此PAbort中斷程序應該返回到產生該指令預取中止異常中斷的指令處,而不是像前面的返回到發生中斷指令的下一條指令;
PAbort是由當前執行的指令自身產生的,當該異常產生時,PC值未更新,它指向當前指令後面的第2條指令,進入中斷時,CPU將(PC-4
)保存到lr_mode
中,(PC-4
)指向的是當前指令的下一條指令
;異常處理完後應返回當前指令
;即SUBS PC, LR, #4
- DAbort:數據訪問中止異常;
DAbort是由數據訪問指令產生的,當該異常產生時,PC值已更新,它指向當前指令後面的第3條指令,進入中斷時,CPU將(PC-4
)保存到lr_mode
中,(PC-4
)指向的是當前指令的第2條指令
;異常處理完後應返回到產生數據訪問中止異常中斷的指令處;即SUBS PC, LR, #8
總結
異常類型 | 返回操作 |
---|---|
SWI or Undef | MOV PC, LR |
IRQ or FIQ | SUBS PC, LR, #4 |
PAbort | SUBS PC, LR, #4 |
DAbort | SUBS PC, LR, #8 |
- 將
LR
修改爲中斷處理完後的返回地址; STMFD sp!, {reglist, lr}
// 保存現場,!
表示更新sp
的值;- 異常中斷處理程序;
LDMFD SP!, {reglist, lr}^
// 恢復現場,^
表示將SPSR_mode
寄存器的內容複製到當前程序狀態寄存器CPSR
中,該指令只能在特權模式下使用;
IROMBoot程序設置了這個表;
除了復位操作,其他幾種異常會跳到 0xFFFF0000 + offset
的地址;
0xFFFF0000
是內部 SRAM
的起始地址;板子啓動時IROM
程序會將nsih.bin
和2nboot.bin
複製到0xFFFF0000
處,下面是nsih.bin
開頭的部分代碼;
也是幾條跳轉指令,0xFFFF0200
是2nboot.bin
的起始地址,再看看2nboot.bin
的開頭幾條指令;
總結
友善Smart4418 官方安卓鏡像的異常處理過程:
- 由
IROMBOOT
程序設定異常向量表;
ARM CPU的異常處理程序應該挨個地存在0x0地址。通常將用戶的異常處理程序存在於零地址。但是,在IROMBOOT的情況下,用戶的異常處理程序不可能設置在0x0地址,因爲ROM存在於0x0地址。當使用MMU時,可以通過將任意存儲器映射到零地址來處理CPU異常。然而,IROBOOT提供了用於不使用MMU的系統重定向異常處理程序的功能。
- 當異常發生時,PC跳向
IROM(0x34000000 + offset)
; - 再跳向
nsih(0xFFFF0000 + offset)
; - 再跳向
2nboot(0xFFFF0200 + offset)
;