歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

ARM用戶層發生異常後軟硬件協同處理流程

我這裡是要簡單說一下,在ARM平台的用戶層發生異常後的軟硬件協同處理流程,是個大致的概況,對宏觀了解後,具體細節內容網上有很多,可以自行查詢。

用戶層程序正在執行時,遇到未定義的指令(ARM不是別的指令)或者SWI軟件中斷指令(產生系統調用),就會產生異常,這裡以未定義指令異常為例進行說明:

一旦出現未定義指令異常,CPU會自動做如下操作:

(1)未定義模式(ARM七種運行模式的一種)下對應的lr(即R14,不同的運行模式有不同的lr寄存器)寄存器保存當前發生異常的指令下一條指令的地址。例如,在用戶態有A B C 三條指令順序執行,指令A發生未定義指令異常,則指令B的地址就會由CPU保存到未定義模式下的lr寄存器中,用於異常返回。

(2)CPU修改CPSR寄存器,進入未定義模式:

CPSR[4:0]=0b11011  /*將CPSR的低五位置位11011,正好對應未定義指令模式*/

(3)因為ARM異常只能在ARM狀態處理,所以要將狀態修改為ARM指令集狀態:

CPSR[5]=0

(4)CPU根據發生的異常是未定義指令異常,將PC置為0x0000 0004(也有可能是0xffff0004,在這裡不做分析):

PC=0x00000004

以上是CPU在做,剩下的都是操作系統完成,我這裡只說個大概,具體細節見我寫的另一個文檔:

該地址對應的正是一條跳轉指令:b        vector_und + stubs_offset。該指令會跳轉到相應的異常處理函數去執行,函數執行結束後會調用ret_to_usr函數,從SVC模式返回到USR模式,在這個函數中最後一條指令是:MOVS PC,LR。該指令將當前狀態的LR寄存器賦值給PC,並且將當前模式寄存器SPSR拷貝到CPSR中(指令中MOV後的S位)

(5)LR保存的就是上面指令B的地址,至此未定義指令異常處理完畢。

對於其他幾個異常,如中斷、快速中斷、數據中止等異常,除了返回地址、PC值等不同外,處理流程大致相同。

Copyright © Linux教程網 All Rights Reserved