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內核》