中斷和異常的區別
1、異常:
是指CPU內部出現的中斷,即在CPU執行特定指令時出現的非法情況。同時異常也稱為同步中斷,因此只有在一條指令執行后才會發出中斷,不可能在指令執行期間發生異常。
產生的原因:
- 程序的錯誤產生的,編程異常通常叫做軟中斷(eg:除數為0)
- 內核必須處理的異常條件產生的(eg:缺頁)
產生的目的:
Linux利用異常來達到兩個截然不同的目的:
- 給進程發送一個信號以通報一個反常情況
- 管理硬件資源
對於第一種情況,例如,如果進程執行了一個被0除的操作,CPU則會產生一個“除法錯誤”異常,並由相應的異常處理程序向當前進程發送一個SIGFPE信號。當前進程接收到這個信號后,就要采取若干必要的步驟,或者從錯誤中恢復,或者終止執行(如果這個信號沒有相應的信號處理程序)。
對於第二種情況,內核使用兩種異常來有效地管理硬件資源,相應的處理程序也就更復雜。在這種情況下,異常並不表示一種錯誤情況:
- 用“設備不可用”異常來推遲裝載浮點寄存器。
- 用“缺頁”異常推遲把新頁框分配給進程。
異常又分為故障和陷阱。
產生都不使用中斷控制器,中斷號由指令直接給出。不能被屏蔽。
異常沒有自己的進程上下文,會用到當前進程的進程上下文。
在CPU執行一個異常處理程序時,就不再響應其他異常和中斷請求服務。如果此時發生了一個異常,CPU不能去響應它,又不能把它的信息丟失該怎么辦呢?這是就用到了堆棧,把所有的信息壓入棧。等當前異常處理后,才從堆棧中取出信息再響應剛才的異常。
X86處理處理器中大約有20種異常。Linux內核必須為每種異常提供一個專門的異常處理程序。
2、中斷:
也稱為異步中斷。因此它是由其他硬件設備依照CPU時鍾信號隨機產生,即意味着中斷能在指令之間發生。
中斷主要是響應外部硬件設備的。
產生通過中斷控制器,中斷號是由中斷控制器提供的(NMI硬中斷中斷號系統指定為02H)。中斷又分為外部可屏蔽中斷(INTR)和外部非屏蔽中斷(NMI)。
- 所用I0設備產生的中斷請求均引起可屏蔽中斷。
- 硬件故障引起的故障則產生非屏蔽中斷。
中斷使用自己的中斷上下文,原來的進程上下文保持不變,而且可以返回中斷之前所作的事件。
在CPU執行一個異常處理程序時,就不再響應其他異常和中斷請求服務.如果此時產生多個非屏蔽中斷時,CPU的處理方法跟異常處理方法一樣,使用堆棧。