《深入理解Linux內核》讀書筆記-第四章-中斷和異常(1)

 

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


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

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

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

Intel微處理器手冊中,把同步和異步中斷分別稱爲異常(exception)和中斷(interrupt)。


中斷是由間隔定時器和IO設備產生的,而異常是由程序的錯誤產生的,或者是由內核必須處理的異常條件產生的。

 

 

中斷信號的作用:

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


中斷處理與進程切換有一個明顯的差異:由中斷或異常處理程序所執行的代碼不是一個進程,更確切的說,它是一個內核控制路徑,代表中斷髮生時正在運行的進程執行。作爲一個內核控制路徑,中斷處理程序比一個進程要輕,中斷的上下文很少,建立矇昧無知中止中斷處理所需要的時間很少。


中斷處理是由內核執行的最敏感的任務之一,因爲它必須滿足以下約束:

當內核正打算去完成一些別的事情時,中斷隨時會到來。因此,內核的目標就是讓中斷儘可能快的處理完,盡其所能把更多的處理向後推遲。內核響應中斷後需要進行的操作分爲兩部分:關鍵而緊急的部分,內核立即執行; 其餘推遲的部分,內核隨後執行。

因爲中斷隨時會到來,所以內核可能正在處理其中一箇中斷時,另一箇中斷又發生了。因此,中斷處理程序必須編寫成使相應的內核控制路徑能以嵌套的方式執行。當最後一個內核控制路徑終止時,內核必須能恢復被中斷進程的執行,或者,如果中斷信號已導致了重新調度,內核能切換到另外的進程。

儘管內核在處理前一箇中斷時可以接受一個新的中斷,但在內核代碼中還是存在一些臨界區,在臨界區中,中斷必須被禁止。必須儘可能地限制這樣的臨界區,因爲,根據以前的要求,內核,尤其是中斷處理程序,應該在大部分時間內以開中斷的方式運行。


中斷和異常:

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

中斷:

可屏蔽中斷(maskable interrupt):一個屏蔽的中斷只要還是屏蔽的,控制單元就忽略它。

非屏蔽中斷(nonmaskable interrupt):非屏蔽中斷總是由CPU辨認。

異常:

處理器探測異常(processor-detected exception):當CPU執行指令時探測到一個反常條件所產生的異常,可分爲三組:

故障(fault):通常可以糾正,一旦糾正,程序就可以不失連貫的情況下重新開始。

陷阱(trap):主要用於調試程序。在陷阱指令執行後立即報告,內核把控制權返回給程序後就可以繼續它的執行而不失連貫性。

異常中止(abort):發生一個嚴重錯誤,控制單元出了問題,不能在eip寄存器中保存引起異常的指令所在的確切位置。異常中止用於報告嚴重的錯誤,如硬件故障等。由控制單元發送的這個中斷信號是緊急信號,用來把控制權切換到相應的異常中止處理程序,這個異常中止處理程序除了強制受影響的進程終止外,沒有別的選擇。

編程異常(programmed exception): 在編程者發出請求時發生。控制單元把編程異常作爲陷阱來處理,編程異常通常也叫做軟中斷(software interrrupt)。這樣的異常有兩個用途:執行系統調用及給調試程序通報一個特定的事件。

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



 

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