異常處理的基本術語
中斷搶占 Preemption
如果異常的優先級高于當前執行優先級,則可以先發制人當前執行。 當一個異常優先于另一個異常時,這些異常被稱為嵌套異常。
中斷返回 Return
當異常處理程序完成時,就會發生這種情況。 處理器彈出堆棧,并將處理器狀態恢復到中斷發生前的狀態。
末尾連續中斷 Tail-chaining
這種機制加快了異常服務。在異常處理程序完成后或返回操作期間,如果有符合異常輸入要求的掛起異常,則跳過堆棧彈出,控制直接傳輸到新的異常處理程序。
遲到中斷 Late arriving interrupts
這種機制可以有效的提高高優先級搶占中斷速度。如果在為上一個異常保存狀態期間發生更高優先級異常,處理器將切換以處理高優先級異常,并啟動該高優先級異常的向量獲取。狀態保存可能會受到當前中斷和遲到的更高優先級中斷的影響,具體取決于原始異常和延遲到達異常的堆棧要求。從延遲到達異常的異常處理程序返回時,系統會通過末尾連續中斷的方式處理懸起的低優先級中斷。
中斷進入
當處理器正在處理中斷或者處于線程模式的時候,如果此時有更高優先級的異常事件發生,處理器就會開始進入異常處理流程,在這種情況下,新的中斷會搶占正在處理的低優先級的中斷。
高優先級中斷打斷低優先級中斷的情況稱為中斷嵌套。
如果處理器在處理中斷的過程中,發生了優先級較低的中斷,那么這個低優先級的中斷會懸起(pending),處理器必須在處理完當前中斷之后才會通過末尾連續的中斷方式處理低優先級中斷。
當處理器接受異常時,除非異常是尾鏈或延遲到達的異常,否則處理器會將信息推送到當前堆棧中。此操作稱為壓棧,壓入堆棧數據結構稱為堆棧Frame。
如果浮點上下文處于活動狀態,Cortex-M33處理器可以在中斷處理過程中自動將浮點處理的數據壓入堆棧。下圖顯示了當堆棧上中斷或異常時Cortex-M33處理器堆棧數據結構:
- 具有浮點狀態。
- 沒有浮點狀態。
堆棧數據結構
在未分配浮點狀態的堆棧空間時,堆棧結構與沒有FPU的Armv8-M實現相同。
上圖中無論是否處于浮點狀態,處理器狀態結構體(state context)都會保存在堆棧中。
如果實現了安全擴展,當非安全異常搶占安全狀態運行的軟件時,處理器會將額外的其他上下文信息將保存到堆棧中,并清除壓入過堆棧的寄存器,以確保非安全軟件沒有不會讀取到安全數據,如下圖所示。
有TrustZone時的堆棧數據結構
如果浮點上下文處于活動狀態,Cortex-M33處理器會自動將浮點狀態堆疊到堆棧幀中。有兩種幀格式包含浮點上下文。如果從安全狀態中提取異常并設置了FPCR.TS
,則系統還需要保存額外的浮點上下文。在所有其他情況下,系統堆棧僅保存標準浮點上下文,如下圖所示。
包含浮點額外上下文的堆棧數據結構
處理器將會根據不同的觸發條件決定是否需要保存額外的浮點信息上下文數據。
在中斷發生的時候,系統總是直接使用當前的堆棧指針來進行壓棧操作。例如,如果異常從安全狀態帶到非安全處理程序,則使用安全堆棧指針來保存狀態。
壓棧后,堆棧指針會立即指向堆棧幀中的最低地址。
堆棧數據包含中斷返回地址。這是中斷程序中下一個指令的地址。處理器在中斷返回時候通過這個值恢復PC,以便中斷的程序恢復。
在處理器進行壓棧操作的同時,處理器執行中斷向量獲取,從中斷向量表中讀取中斷處理程序開始地址。壓棧完成后,處理器開始執行中斷處理程序。同時,處理器將EXC_RETURN
值寫入LR
。此值用于在異常處理程序完成后觸發異常返回。
如果中斷進入期間沒有發生更高的優先級中斷,處理器將開始執行異常處理程序,并自動將相應掛起中斷的狀態更改為活動狀態。
如果在中斷處理期間發生另一個更高的優先級異常,處理器將開始執行此異常的異常處理程序,并且不會更改早期異常的掛起狀態。這種狀態就是中斷延遲。
異常返回
當處理器處于處理程序模式,并且執行以下指令之一試圖將PC設置為EXC_RETURN值時,就會發生異常返回:
- 加載PC的
POP
或LDM
指令。 - 加載PC的
LDR
指令 - 使用任何寄存器的
BX
指令。
使用安全擴展實現中的異常返回
處理器在中斷進入時將EXC_RETURN值保存到LR。異常處理機制依賴于此值來檢測處理器何時完成異常處理程序。當處理器將與此模式匹配的值加載到PC時,它會檢測到該操作不是正常的分支操作,而是異常是完整的。因此,它開始異常返回序列。EXC_RETURN
值的位[6:0]表示所需的返回堆棧、處理器模式、安全狀態和堆棧框架,如下表所示。
表2-22異常返回行為
Bit | Name | Function |
---|---|---|
[31:24] | PREFIX | 表示這是一個EXC_RETURN 值。 |
此字段讀為0b11111111。 | ||
[23:7] | — | 保留,RES1。 |
[6] | S | 指示寄存器是否已推送到安全堆棧或非安全堆棧。0表示使用非安全堆棧。1表示使用安全堆棧。 |
[5] | DCRS | 指示默認堆棧規則是否適用,或者被調用方寄存器是否已經在堆棧上。0表示跳過被調用方保存的寄存器的堆棧。1表示遵循堆棧的默認規則。 |
[4] | FType | 在具有主點和浮點擴展的PE中:0表示PE在堆棧上為FP上下文分配了空間。1表示PE沒有為FP上下文在堆棧上分配空間。 |
在沒有浮點擴展的PE中,此位是保留的,RES1。 | ||
[3] | Mode | 指示堆疊的模式。0表示Handler模式。1表示線程(Thread)模式。 |
[2] | SPSEL | 指示哪個堆棧包含異常堆棧幀。0表示主堆棧指針。1表示進程堆棧指針。 |
[1] | — | 保留,RES0。 |
[0] | ES | 指示被異常的安全狀態。0不安全。1安全。 |
沒有安全擴展系統中的異常返回
處理器在中斷進入時將EXC_RETURN
值保存到LR。處理器的異常處理機制依賴于此值來檢測處理器何時完成異常處理程序。當處理器將與此模式匹配的值加載到PC時,它會檢測到該操作不是正常的分支操作,而是異常是完整的。因此,它開始異常返回序列。EXC_RETURN
值的位[6:0]表示所需的返回堆棧、處理器模式和堆棧幀,如下表所示。
表2-23異常返回行為
比特 | 姓名 | 功能 |
---|---|---|
[31:24] | PREFIX | 表示這是一個EXC_RETURN值。 |
此字段讀為0b11111111。 | ||
[23:7] | — | 保留,RES1。 |
[6] | — | 保留,RES0。 |
[5] | — | 保留,RES1。 |
[4] | FType | 在具有主點和浮點擴展的PE中:0表示PE在堆棧上為FP上下文分配了空間。1表示PE沒有為FP上下文在堆棧上分配空間。 |
在沒有浮點擴展的PE中,此位是保留的,RES1。 | ||
[3] | Mode | 指示堆疊的模式。0表示Handler模式。1表示線程(Thread)模式。 |
[2] | SPSEL | 指示哪個堆棧包含異常堆棧幀。0表示主堆棧指針。1表示線程堆棧指針。 |
[1:0] | — | 保留,RES0。 |
系統的工作模式
線程模式(Thread mode)
處理器復位或異常退出時為此模式。此模式下的代碼可以是特權代碼也可以是用戶代碼,通過CONTROL[0]控制。
處理模式(Handler mode)
出現異常(包括中斷)時進入此模式,此模式下所有代碼為特權訪問。
特權訪問
對處理器資源擁有完全訪問限權;處理器復位后進入此訪問模式;清零 CONTROL[0]進入用戶模式。
用戶訪問
禁止訪問多數系統寄存器。只能通過進入異常(中斷)來返回特權模式。進入異常前是用戶級訪問,則退出異常時自動回到用戶及,除非在異常中修改CONTROL[0]位。
-
處理器
+關注
關注
68文章
19291瀏覽量
229907 -
ARM
+關注
關注
134文章
9097瀏覽量
367653 -
中斷
+關注
關注
5文章
898瀏覽量
41513 -
異常處理
+關注
關注
0文章
14瀏覽量
7290
發布評論請先 登錄
相關推薦
評論