中斷和異常概念詳解

1.中斷和異常的概念

中斷(interrupt)通常被定義爲一個事件,該事件改變處理器執行的指令順序。這樣的事件與CPU芯片內外部硬件電路產生的電信號相對應。

 

中斷通常分爲同步(synchronous)中斷和異步(asynchronous)中斷:

  • 同步中斷是當指令執行時由CPU控制單元產生的,之所以稱爲同步,是因爲只有在一條指令終止執行後CPU纔會發出中斷。

  • 異步中斷是由其他硬件設備依照CPU時鐘信號隨機產生的。

 

在Intel微處理器手冊中,把同步和異步中斷分別稱爲異常exception)和中斷interrupt)。我們也採用這種分類,當然有時我們也用術語“中斷信號”指這兩種類型。

 

中斷是由間隔定時器和I/O設備產生的,例如,用戶的一次按鍵會引起一箇中斷。

 

異常是由程序的錯誤產生的,或是由內核必須處理的異常條件產生的。第一種情況下,內核通過發送一個每個Unix程序員都熟悉的信號來處理異常。第二種情況下,內核執行恢復異常所需要的所有步驟,例如缺頁,或對內核服務的一個請求(通過一條 int 或 sysenter 指令)。

 

2.中斷信號的作用

顧名思義,中斷信號提供了一種特殊的方式,使處理器轉而去運行正常控制流之外的代碼。當一箇中斷信號達到時,CPU必須停止它當前正在做的事情,並且切換到一個新的活動。爲了做到這一點,就要在內核態堆棧保存程序計數器的當前值(即eip和cs寄存器的內容),並把與中斷類型相關的一個地址放進程序計數器。

 

有些事情會使你想起在前一章描述的上下文切換,這發生在內核用一個進程替換另一個進程時。但是,中斷處理與進程切換有一個明顯的差異:由中斷或異常處理程序執行的代碼不是一個進程。更確切地說,它是一個內核控制路徑,代表中斷髮生時正在運行的進程執行。作爲一個內核控制路徑,中斷處理程序比一個進程要“輕”(light)(中斷的上下文很少,建立或終止中斷處理需要的時間很少)。

 

3.中斷和異常

Intel文檔把中斷和異常分爲以下幾類:

(1)中斷:

  • 可屏蔽中斷(maskable interrupt

  • 非屏蔽中斷(nonmaskable interrupt

 

(2)異常:

  • 處理器探測異常(processor-detected exception

    當CPU執行指令探測到一個反常條件所產生的異常。可以進一步分爲三組,這取決於CPU控制單元產生異常時保存在內核態堆棧eip寄存器中的值。

    故障(fault):通常可以糾正;

    陷阱(trap):在陷阱指令執行後立刻報告;

    異常終止(abort):發生了一個嚴重的錯誤;

  • 編程異常

    在編程者發出請求時發生。編程異常通常也叫做軟中斷(software interrupt),這樣的異常由兩種常用的用途:執行系統調用及給調試程序通報一個特定的事件。

     

 

每個中斷和異常是由0~255之間的一個數來標識。Intel把這個8位的無符號整數叫做一個向量(vector)。非屏蔽中斷的向量和異常的向量是固定的,而可屏蔽中斷的向量可以通過對中斷控制器的編程來改變。

 

注:內容來自《深入理解LINUX內核》

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章