定義
錯誤中斷處理是指處理機調用相關的中斷處理程式處理當前錯誤。計算機中錯誤有多種,如除零、地址越界等等。在這些錯誤中,有些錯誤違反了處理器架構中的保護措施,稱為 一般保護錯誤( General protection fault, GPF),是在英特爾x86和AMDx86-64架構和其它架構中的一種錯誤(或者一種中斷),指正在運行的程式(核心或用戶態程式)違反處理器架構中的保護措施的情況。
根據錯誤中斷時 CPU 的活動軌跡。還可進一步把錯誤中斷分為外中斷和內中斷。所謂外中斷,是指由於外部設備事件所引起的中斷,如通常的磁碟中斷、印表機中斷等;而內中斷則是指由於 CPU 內部事件所引起的中斷,如程式出錯(非法指令、地址越界)、電源故障等。內中斷(trap)也被譯為“捕獲”或“陷入” 。通常,陷入是由於執行了現行指令所引起的;而中斷則是由於系統中某事件引起的,該事件與現行指令無關。由於系統調用引起的中斷屬於內中斷,因此把由於系統調用引起中斷的指令稱為陷入指令。
處理過程
喚醒被阻塞的驅動(程式)進程
當中斷處理程式開始執行時,首先去喚醒處於阻塞狀態的驅動(程式)進程。如果是採用了信號量機制,則可通過執行 signal 操作,將處於阻塞狀態的驅動(程式)進程喚醒;在採用信號機制時,將傳送一信號給阻塞進程。
保護被中斷進程的 CPU 環境
![錯誤中斷處理](/img/2/4d5/wZwpmL2QjN4gTO1ATNxYjN1UTM1QDN5MjM5ADMwAjMwUzLwUzL1IzLt92YucmbvRWdo5Cd0FmLwE2LvoDc0RHa.jpg)
通常由硬體自動將處理機狀態字 PSW 和程式計數器(PC)中的內容,保存在中斷保留區(棧)中,然後把被中斷進程的 CPU 現場信息(即包括所有的 CPU 暫存器,如通用暫存器、段暫存器等內容)都壓入中斷棧中,因為在中
斷處理時可能會用到這些暫存器。圖1給出了一個簡單的保護中斷現場的示意圖。該程式是指令在 N 位置時被中斷的,程式計數器中的內容為 N+1,所有暫存器的內容都被保留在棧中。
轉入相應的設備處理程式
由處理機對各箇中斷源進行測試, 以確定引起本次中斷的 I/O 設備, 並傳送一應答信號給發出中斷請求的進程,使之消除該中斷請求信號,然後將相應的設備中斷處理程式的入口地址裝入到程式計數器中,使處理機轉向中斷處理程式。
中斷處理
對於不同的設備,有不同的中斷處理程式。該程式首先從設備控制器中讀出設備狀態,以判別本次中斷是正常完成中斷,還是異常結束中斷。若是前者,中斷程式便進行結束處理;若還有命令,可再向控制器傳送新的命令,進行新一輪的數據傳送。若是異常結束中斷,則根據發生異常的原因做相應的處理。
恢復被中斷進程的現場
![錯誤中斷處理](/img/f/ed9/wZwpmLzYDO5EjM0YTMxYjN1UTM1QDN5MjM5ADMwAjMwUzL2EzLxEzLt92YucmbvRWdo5Cd0FmLzE2LvoDc0RHa.jpg)
當中斷處理完成以後,便可將保存在中斷棧中的被中斷進程的現場信息取出,並裝入到相應的暫存器中, 其中包括該程式下一次要執行的指令的地址 N+1、 處理機狀態字 PSW,以及各通用暫存器和段暫存器的內容。這樣,當處理機再執行本程式時,便從 N+1 處開始,最終返回到被中斷的程式。
I/O 操作完成後,驅動程式必須檢查本次 I/O 操作中是否發生了錯誤,並向上層軟體報告,最終向調用者報告本次 I/O 的執行情況。除了上述的第 4 步外,其它各步驟對所有 I/O設備都是相同的,因而對於某種作業系統,例如 UNIX 系統,是把這些共同的部分集中起來,形成中斷總控程式。每當要進行中斷處理時,都要首先進入中斷總控程式。而對於第 4 步,則對不同設備須採用不同的設備中斷處理程式繼續執行。圖2給出了中斷處理流程。
中斷
計算機科學中,中斷(Interrupt)是指處理器接收到來自硬體或軟體的信號,提示發生了某個事件,應該被注意,這種情況就稱為中斷。通常,在接收到來自外圍硬體(相對於中央處理器和記憶體)的異步信號,或來自軟體的同步信號之後,處理器將會進行相應的硬體/軟體處理。發出這樣的信號稱為進行中斷請求(interrupt request,IRQ)。硬體中斷導致處理器通過一個運行信息切換(context switch)來保存執行狀態(以程式計數器和程式狀態字等暫存器信息為主);軟體中斷則通常作為CPU指令集中的一個指令,以可程式的方式直接指示這種運行信息切換,並將處理導向一段中斷處理代碼。中斷在計算機多任務處理,尤其是即時系統中尤為有用。這樣的系統,包括運行於其上的作業系統,也被稱為“中斷驅動的”(interrupt-driven)。
硬體中斷(Hardware Interrupt)
可禁止中斷(maskable interrupt)。硬體中斷的一類,可通過在中斷禁止暫存器中設定位掩碼來關閉。
非可禁止中斷(non-maskable interrupt,NMI)。硬體中斷的一類,無法通過在中斷禁止暫存器中設定位掩碼來關閉。典型例子是時鐘中斷(一個硬體時鐘以恆定頻率—如50Hz—發出的中斷)。
處理器間中斷(interprocessor interrupt)。一種特殊的硬體中斷。由處理器發出,被其它處理器接收。僅見於多處理器系統,以便於處理器間通信或同步。
偽中斷(spurious interrupt)。一類不希望被產生的硬體中斷。發生的原因有很多種,如中斷線路上電氣信號異常,或是中斷請求設備本身有問題。
軟體中斷(Software Interrupt)
軟體中斷。是一條CPU指令,用以自陷一個中斷。由於軟中斷指令通常要運行一個切換CPU至核心態(Kernel Mode/Ring 0)的子例程,它常被用作實現系統調用(System call)。
處理器通常含有一個內部中斷禁止位,並允許通過軟體來設定。一旦被設定,所有外部中斷都將被系統忽略。這個禁止位的訪問速度顯然快於中斷控制器上的中斷禁止暫存器,因此可提供更快速地中斷禁止控制。
如果一個中斷使得機器處於一種確定狀態,則稱為精確中斷(precise interrupt)。精確中斷須保證:
程式計數器的值被保存在已知位置。
程式計數器所指向的指令之前的所有指令已被執行完畢。
程式計數器所指向的指令之後的所有指令不可被執行。如果中斷信號到來後而轉入處理前發生了任何針對暫存器/記憶體的更改,都必須予以還原。
程式計數器所指向的指令地執行狀態已知。
倘無法滿足以上條件,此中斷被稱作非精確中斷(imprecise interrupt)。
中斷儘管可以提高計算機處理性能,但過於密集的中斷請求/回響反而會影響系統性能。這類情形被稱作中斷風暴(interrupt storm)。