ARM的異常處理過程
阿新 • • 發佈:2018-11-18
當異常發生時(中斷也是異常的一種):
1)ARM core (即CPU)拷貝當前狀態的CPSR到對應異常模式下的SPSR,這步的目的是保護當前狀態的CPSR(每種異常模式都對應一個自己的SPSR,以便將來在異常返回時,從SPSR恢復至CPSR)
2)這個時候CPU會自動設定適當的CPSR位:改變暫存器狀態進入ARM態(注意Thumb態和ARM態由CPSR的T位來決定),反映在CPSR上就是將其T位置0;改變處理器模式進入相應的模式;如果需要的話還會設定中斷禁止位禁止相應的中斷。這些都是CPU自動完成的。
3)儲存返回地址(注意儲存的返回地址是異常發生前正在執行指令的下一條地址,即此時的為PC - 4)到對應異常模式下的LR暫存器。若不儲存那麼從異常模式返回後就不知道返回到哪裡,這就像你自己出門要記住自己家裡的地址一樣。
4)設定PC為相應的異常向量,說白了就是讓PC = 對應異常模式在異常向量表中的地址。因為PC為程式指標,指向程式執行的地方,原來指向哪裡可能不知道但現在讓其指向對應異常的地址就可以了。由於異常向量表存的是該異常的首地址只有四個位元組,所以PC跳轉到這裡後還會繼續跳轉到真正的異常處理程式哪裡去處理異常,處理完成後利用LR直接返回到原來模式下繼續處理原來正在做的事。
5)當返回時從SPSR恢復CPSR和從LR恢復PC。
注意:以上說的CPU設計時提供的向量表一般稱為一級向量表,有些CPU為了支援多種中斷,還提供二級向量表。