RISC-V特權架構 - 中斷與異常概述
- 1 中斷概述
- 2 異常概述
- 3 廣義上的異常
- 3.1 同步異常
- 3.2 異步異常
- 3.3 常見同步異常和異步異常
本文屬于《 RISC-V指令集基礎系列教程》之一,歡迎查看其它文章。
1 中斷概述
中斷(Interrupt)機制,即處理器核在順序執行程序指令流的過程中,突然被別的請求打斷而中止執行當前的程序,轉而去處理別的事情,待其處理完了別的事情,然后重新回到之前程序中斷的點,繼續執行之前的程序指令流,其要點如下。
- 打斷處理器執行程序指令流的“別的請求”便稱之為中斷請求(Interrupt Request),“別的請求”的來源便稱之為中斷源(Interrupt Source)。中斷源通常來自于外圍硬件設備。
- 處理器轉而去處理的“別的事情”便稱之為中斷服務程序(Interrupt Service Routine,ISR)。
- 中斷處理是一種正常的機制,而非一種錯誤情形。處理器收到中斷請求之后,需要保存當前程序的現場,簡稱為保存現場。等到處理完中斷服務程序后,處理器需要恢復之前的現場,從而繼續執行之前被打斷的程序,簡稱為“恢復現場”。
- 可能存在多個中斷源,同時向處理器發起請求的情形,因此需要對這些中斷源進行仲裁,從而選擇哪個中斷源被優先處理。此種情況稱為“中斷仲裁”,同時可以給不同的中斷分配優先級以便于仲裁,因此中斷存在著“中斷優先級”的概念。
- 還有一種可能是,處理器已經在處理某個中斷過程中(執行該中斷的ISR 之中),此時有一個優先級更高的新中斷請求到來,此時處理器該如何是好呢?有如下兩種可能。
第一種,可能是處理器并不響應新的中斷,而是繼續執行當前正在處理的中斷服務程序,待到徹底完成之后才響應新的中斷請求,這種稱為處理器“不支持中斷嵌套”。
第二種,可能是處理器中止當前的中斷服務程序,轉而開始響應新的中斷,并執行其“中斷服務程序”,如此便形成了中斷嵌套(即前一個中斷還沒響應完,又開始響應新的中斷),并且嵌套的層次可以有很多層。
注意:
假設新來的中斷請求的優先級,比正在處理的中斷優先級低(或者相同),則不管處理器是否能支持“中斷嵌套”,都不應該響應這個新的中斷請求,處理器必須完成當前的中斷服務程序之后,才考慮響應新的中斷請求(因為新中斷請求的優先級并不比當前正在處理的中斷優先級高)。
RISC-V架構默認不支持中斷嵌套。
2 異常概述
異常(Exception)機制,即處理器核在順序執行程序指令流的過程中,突然遇到了異常的事情而中止執行當前的程序,轉而去處理該異常,其要點如下。
? 處理器遇到的“異常的事情”稱為異常(Exception)。異常與中斷的最大區別在于中斷往往是一種外因,而異常是由處理器內部事件或程序執行中的事件引起的,譬如本身硬件故障、程序故障,或者執行特殊的系統服務指令而引起的,簡而言之是一種內因。
? 與中斷服務程序類似,處理器也會進入異常服務處理程序。
? 與中斷類似,可能存在多個異常同時發生的情形,因此異常也有優先級,并且也可能發生多重異常的嵌套。
3 廣義上的異常
如上文所述,中斷和異常最大的區別是起因內外有別。除此之外,從本質上來講,中斷和異常對于處理器而言基本上是一個概念。中斷和異常發生時, 處理器將暫停當前正在執行的程序,轉而執行中斷和異常處理程序;返回時,處理器恢復執行之前被暫停的程序。
因此中斷和異常的劃分是一種狹義的劃分。從廣義上來講,中斷和異常都被認為是一種廣義上的異常。處理器廣義上的異常,通常只分為同步異常(Synchronous Exception)和異步異常(Asynchronous Exception)。
3.1 同步異常
同步異常,是指由于執行程序指令流或者試圖執行程序指令流而造成的異常。這種異常的原因,能夠被精確定位于某一條執行的指令。同步異常的另外一個通俗的表象便是,無論程序在同樣的環境下執行多少遍,每一次都能精確地重現出來。
譬如,程序流中有一條非法的指令,那么處理器執行到該非法指令便會產生非法指令異常(Illegal Instruction Exception),能被精確地定位于這一條非法指令,并且能夠被反復重現。
3.2 異步異常
異步異常,是指那些產生原因不能夠被精確定位于某條指令的異常。異步異常的另外一個通俗的表象便是,程序在同樣的環境下執行很多遍,每一次發生異常的指令PC 都可能會不一樣。
最常見的異步異常是“外部中斷”。比如,外部中斷的發生,是由外圍設備驅動的,一方面外部中斷的發生帶有偶然性,另一方面中斷請求抵達于處理器核之時,處理器的程序指令流執行到具體的哪一條指令更帶有偶然性。因此一次中斷的到來,可能會巧遇到某一條“正在執行的不幸指令”,而該指令便成了“背鍋俠”。在它的指令PC 所在之處,程序便停止執行,并轉而響應中斷去執行中斷服務程序。但是當程序重復執行時,卻很難會出現同一條指令反復“背鍋”的精確情形。
對于異步異常,根據其響應異常后的處理器狀態,又可以分為兩種:
(1)精確異步異常(Precise Asynchronous Exception):指響應異常后的處理器狀態,能夠精確反映為某一條指令的邊界,即某一條指令執行完之后的處理器狀態。
(2)非精確異步異常(Imprecise Asynchronous Exception):指響應異常后的處理器狀態,無法精確反映為某一條指令的邊界,即可能是某一條指令執行了一半然后被打斷的結果,或者是其他模糊的狀態。
3.3 常見同步異常和異步異常
常見的典型同步異常和異步異常,如下表所示,此表可以幫助讀者更加理解同步異常和異步異常的區別。
參考文檔:
- 《手把手教你設計CPU.RISC-V處理器》