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