理解 Linux 系統(tǒng)中斷
中斷Interrupt,在 wikipedia 的定義為:“在計算機科學中是指處理器接收到來自硬件或軟件的信號,提示發(fā)生了某個事件,應(yīng)予以注意,這種情況就稱為中斷”。
從 wikipedia 定義中可以明確,中斷信號可以來自于:
-
外圍硬件的異步信號 -
軟件的同步信號
CPU 接收到信號后,CPU會打斷當前的工作并保存現(xiàn)場,然后CPU會根據(jù)中斷信號找到一對應(yīng)的處理程序來執(zhí)行,處理完畢后再根據(jù)處理結(jié)果決定是否需要繼續(xù)執(zhí)行原來任務(wù)。
-
中斷解決了什么問題?
中斷一開始的設(shè)計初衷是為了避免CPU與外部設(shè)備通信時的忙等待。
眾所周知,CPU的運算速度遠超與存儲設(shè)備、外部硬件的操作速度,例如當CPU下發(fā)讀取數(shù)據(jù)的指令給硬盤設(shè)備后,在硬盤準備數(shù)據(jù)的期間,CPU需要進行忙等待,反復(fù)輪詢硬盤設(shè)備是否已經(jīng)完成動作并返回結(jié)果,這就導(dǎo)致了大量的CPU周期被浪費。
有了中斷技術(shù)后,CPU給硬盤設(shè)備發(fā)生指令后,無需等待硬盤完成操作,可以立即返回以處理其他任務(wù),待硬盤完成動作后,發(fā)送中斷信號給CPU,CPU根據(jù)中斷信號接著回來處理結(jié)果即可。
后來中斷技術(shù)也被用于 CPU外部與內(nèi)部的緊急事件的處理、機器故障的處理、時間控制等多個方面,并產(chǎn)生了通過軟件方式進行中斷處理的概念。
-
中斷信號的類型
中斷信號通常有以下幾種:
-
硬件中斷
硬件中斷的信號是異步的,即CPU也不知道 硬件中斷信號 什么時候會產(chǎn)生,它由外部硬件設(shè)備觸發(fā)。硬件中斷還可以被細分為:
-
可屏蔽中斷
硬件中斷的一類,可通過在中斷屏蔽寄存器中設(shè)定位掩碼來關(guān)閉。 -
非可屏蔽中斷
CPU必須處理的中斷,無法通過在中斷屏蔽寄存器中設(shè)定位掩碼來關(guān)閉。典型例子是時鐘中斷(一個硬件時鐘以恒定頻率—如50Hz—發(fā)出的中斷)。 -
處理器間中斷
一種特殊的硬件中斷。由處理器發(fā)出,被其它處理器接收。僅見于多處理器系統(tǒng),以便于處理器間通信或同步。 -
偽中斷
一類不希望被產(chǎn)生的硬件中斷。發(fā)生的原因有很多種,如中斷線路上電氣信號異常,或是中斷請求設(shè)備本身有問題。
-
-
軟件中斷
軟件中斷,本質(zhì)是一條CPU指令,用以自陷一個中斷,因此軟件中斷的信號是同步的。
軟件中斷也被稱為異常, 通常是由 程序錯誤 或者 必須內(nèi)核處理的異常條件 產(chǎn)生。異??梢苑譃椋?/p>-
陷阱:有意的異常,例如系統(tǒng)調(diào)用 -
故障: 潛在可恢復(fù)的錯誤 -
中止: 不可恢復(fù)的錯誤
-
-
中斷系統(tǒng)的設(shè)計和實例
作為一個程序員,硬件實現(xiàn)原理的確超出我的技術(shù)范疇,在這里只能說有興趣了解的可以看下wikipedia:
這里面介紹了關(guān)于中斷系統(tǒng)在設(shè)計層面,外部設(shè)備如何觸發(fā)中斷請求,CPU如何獲得中斷信號和尋找和執(zhí)行中斷處理程序等。
并簡單介紹了CPU引腳、中斷向量表等。
中斷處理程序
中斷處理程序,顧名思義,CPU收到中斷信號后,所需要執(zhí)行的對應(yīng)處理程序。
硬件中斷和軟件中斷的處理程序區(qū)別:
- 硬件中斷的處理程序是由設(shè)備的驅(qū)動程序提供的,而軟件中斷的處理程序是由操作系統(tǒng)內(nèi)核提供的。
- 硬件中斷的處理程序是用于被內(nèi)核調(diào)用來響應(yīng)中斷的,運行在被稱為
中斷上下文的特殊上下文中(偶爾也被稱為原子上下文),該上下文中執(zhí)行的代碼不可阻塞。由于
硬件中斷信號隨時都可能發(fā)生,需要保證中斷處理程序能快速執(zhí)行,且能快速恢復(fù)中斷代碼的執(zhí)行,一般將中斷處理的過程切成兩部分:
上半部
上半部就是中斷處理程序,是一系列需要CPU立即執(zhí)行的工作,在這里只做嚴格時限的工作,如對接收的中斷進行應(yīng)答或復(fù)位硬件。
下半部
下半部則是允許稍后完成的工作。我們以網(wǎng)卡為例,當網(wǎng)卡接收到來自網(wǎng)絡(luò)的數(shù)據(jù)包時,需要通知內(nèi)核數(shù)據(jù)包到了,網(wǎng)卡需要立即完成這件事,從而優(yōu)化網(wǎng)絡(luò)的吞吐量和傳輸周期,避免超時。因此網(wǎng)卡立即發(fā)出中斷,內(nèi)核通過執(zhí)行網(wǎng)卡注冊的中斷處理程序來應(yīng)答。中斷開始執(zhí)行,通知硬件,拷貝最新的網(wǎng)絡(luò)數(shù)據(jù)包到內(nèi)存,然后再去讀取網(wǎng)卡更多的數(shù)據(jù)包。這些重要且急迫,又與硬件相關(guān)的工作都由上半部來完成。內(nèi)核通常需要快速的拷貝網(wǎng)絡(luò)數(shù)據(jù)包到系統(tǒng)內(nèi)存,因為網(wǎng)卡上接收網(wǎng)絡(luò)數(shù)據(jù)包的緩存大小固定,而且相比系統(tǒng)內(nèi)存也要小得多。所以如果拷貝的動作延遲了,必然會導(dǎo)致緩存溢出,進入的網(wǎng)絡(luò)包占滿了網(wǎng)卡的緩存,后續(xù)到來的網(wǎng)絡(luò)包只能被丟棄。當網(wǎng)絡(luò)數(shù)據(jù)包被拷貝到系統(tǒng)內(nèi)存后,中斷的任務(wù)就完成了,此時它將控制權(quán)還給系統(tǒng)被中斷前原先運行的程序,處理和操作數(shù)據(jù)包的工作都在隨后的下半部來完成。