中斷通常被定義為一個打斷CPU晶元指令執行的事件,該事件對應到對應到CPU晶元內部或者外部的電路產生的電子信號。

中斷信號可以被劃分為同步中斷和非同步中斷:

  1. 同步中斷,該類型中斷由CPU的控制單元在執行指令的時候產生,並且是在當前指令執行完畢下一個指令執行之前產生。
  2. 非同步中斷,該類型中斷由其他硬體設備在任意的時間產生,並且遵循CPU的時鐘信號傳遞給CPU。

對於Intel的CPU而言,它將同步中斷稱作異常,而將非同步中斷稱作中斷。

通常中斷(即非同步中斷)由時鐘定時器或者其他I/O設備產生,如鍵盤接收到敲擊某個按鍵的信號後產生的中斷信號。而異常(即同步中斷)則通常由於編程錯誤或者由CPU檢測到異常條件需要內核進行處理而產生,如熟悉的Page Fault Exception,異常可以由程序通過int或者sysenter指令主動產生。

對於Intel x86 CPU而言,它將中斷和異常進行了如下歸類:

  1. 中斷,即非同步中斷,中斷信息隨著CPU的時鐘信號傳遞到CPU內部。
    1. 可屏蔽中斷,所有由I/O設備產生的IRQ請求都被歸為可屏蔽中斷。一個可屏蔽中斷可以有兩種狀態,屏蔽或者不屏蔽,當一個中斷被屏蔽時,該中斷信號將被對應的控制單元所忽略。
    2. 不可屏蔽中斷,即控制單元無法忽略該類型的中斷信號,CPU肯定會接收到該類型的中斷,一般對應到一些緊要的事件,比如硬體錯誤。
  2. 異常,即同步中斷,中斷信號在CPU執行完某個指令後產生並接收到。
    1. 處理器檢測到的異常,即當CPU執行指令的時候檢測到硬體上存在一些異常條件的時候就會產生該信號。這種類型的異常根據產生時在內核堆棧中保存的EIP寄存器的值(即異常恢復後CPU重新執行的位置)進行細分:
      1. Faults,該異常可以被內核正確糾正,並且糾正後重新執行引起該異常的指令時不會造成程序的中斷或者功能的異常。這時候保存到EIP寄存器的值是引起異常的指令的地址,故異常恢復的時候會重新執行該指令,如Page Fault Exception,當訪問的內存地址沒有被映射到物理內存時,產生異常,內核分配新的物理內存頁並建立映射關係,然後異常處理完畢後,CPU重新訪問該地址,即可訪問到正確的物理內存。
      2. Traps,該異常發生時,內核堆棧EIP寄存器保存的地址指向引起該異常的指令的下一條指令,即當該異常處理返回後會繼續程序的執行,而不是重新執行引起異常的指令。x86 CPU的硬體虛擬化功能就是利用陷入(Traps)再模擬的方法,當CPU執行虛擬機指令的時候,如果執行的是敏感指令,就會觸發Traps類型的異常,讓VMM(Virtual Machine Monitor)對該敏感指令進行模擬,然後繼續恢復虛擬機的運行。
      3. Aborts,當發生嚴重的錯誤時,CPU已經無法保證內核堆棧中EIP寄存器存放的值是引起該異常的指令的地址。該異常用於彙報嚴重的錯誤,如硬體錯誤或者是內存的不一致性。該異常信號讓CPU切換到相應的abort exception handler,該處理函數由於無法確認錯誤,只能結束當前進程。
    2. 編程產生的異常,該異常由程序主動執行int或者int3之類的指令產生。CPU像處理Traps一樣處理這些程序主動產生的異常,該類異常通常被稱為軟體中斷(software interrupt)。這類異常主要有兩種用途:實現系統調用和通知某個debugger特定的事件發生。

這些異常或中斷由0~255的數字唯一標識,也就是經常說的中斷向量號。對於不可屏蔽中斷和異常來說,相應的中斷向量號是固定的,而可屏蔽中斷對應的中斷向量號則可以通過設置中斷控制器來更改。


推薦閱讀:
相關文章