中斷

中斷，又稱插斷，在計算機科學中是指處理器接收到來自硬體或軟體的訊號，提示發生了某個事件，應予以注意，這種情況就稱為中斷。通常，在接收到來自外圍硬體。總覽.中斷是用以提高計算機工作效率、增強計算機功能的一項重要技術。最初引入硬體中斷，只是出於效能上的考量。如果計算機系統沒有中斷，則處理器與外部裝置通訊時，它必須在向該裝置發出指令後進行忙等待，反覆輪詢該裝置是否完成了動作並返回結果。這就造成了大量處理器週期被浪費。引入中斷以後，當處理器發出裝置請求後就可以立即返回以處理其他任務，而當裝置完成動作後，傳送中斷訊號給處理器，後者就可以再回過頭獲取處理結果。這樣，在裝置進行處理的週期內，處理器可以執行其他一些有意義的工作，而只付出一些很小的切換所引發的時間代價。後用於CPU外部與內部緊急事件的處理、機器故障的處理、時間控制等多個方面，併產生透過軟體方式進入中斷處理的概念。在硬體實現上，中斷可以是一個包含控制線路的獨立系統，也可整合進儲存器子系統中。對於前者，在IBM個人機上，廣泛使用可程式設計中斷控制器的複用。作為另一種中斷實現的形式，即儲存器子系統實現方式，可以將中斷埠對映到儲存器的地址空間，這樣對特定儲存器地址的訪問實際上是中斷請求。中斷可分為如下幾種：硬體中斷：軟體中斷：處理器通常含有一個內部中斷遮蔽位，並允許透過軟體來設定。一旦完成設定，所有外部中斷都將被系統忽略。這個遮蔽位的存取速度顯然快於中斷控制器上的中斷遮蔽暫存器，因此可提供更快速地中斷遮蔽控制。如果一箇中斷使得機器處於一種確定狀態，則稱為精確中斷。精確中斷須保證：倘無法滿足以上條件，此中斷稱為非精確中斷。中斷儘管可以提高計算機處理效能，但過於密集的中斷請求／響應反而會影響系統性能。這類情形稱為中斷風暴。中斷的種類.狀態觸發.在依狀態觸發的中斷系統中，一個等待響應的中斷會在中斷請求線路上以特定的電位標示，如高電位。當一個裝置希望傳送中斷訊號時，它驅動中斷請求線路至相應的電位，並在CPU發出強制停止命令或處理所請求的中斷事件之前始終保持。一般而言，處理器在匯流排週期的特定時點響應中斷的輸出/ 輸入。如果在某次取樣時刻中斷尚未觸發，則在下一次取樣前，處理器都不會認為有中斷發生。可以應用這個特性，避免響應在噪音較高的線路上出現的偽中斷。中斷裝置可設計成與其他裝置共享一條狀態觸發中斷線路。中斷線路應該包含一個特定的升／降壓電阻，用於在無中斷請求時為線路電位復位。中斷裝置在請求中斷時會保持中斷線路為有效電位，而沒有請求中斷時則令該線路置空。只要有一個或以上的裝置發出中斷訊號，線路都會處於有效的電位。由於可共享線路的便利，一些應用傾向於使用該類中斷。當CPU檢測到中斷線路被斷言後，就會逐一檢查各共享裝置，直至發現請求裝置並處理之。當處理完畢後，繼續檢查中斷線路，倘中斷線路仍為有效電平則重複之前的步驟。在檢查中斷裝置的順序上也可做一定規劃，比如優先檢查那些頻繁請求中斷的裝置，以加快中斷處理，改善系統性能。此類中斷模式也有嚴重問題。只要還有任何裝置的中斷請求尚未處理，線路就會一直保持有效電平狀態，而這將導致CPU沒有機會去探查其他裝置所發生的狀態變化。推遲服務低優先順序裝置也不可行，因為這會防止對高優先順序裝置的探查。倘若線上路上有一個裝置持續傳送請求而CPU不知道怎樣對其進行服務，則這個裝置就會持久並排他地佔有中斷線路。早期的PCI標準出於上述效率層面的理由規定其周邊須使用狀態觸發中斷。邊沿觸發.在依邊沿觸發的中斷系統中，中斷裝置透過向中斷線路傳送一個脈衝來表示其中斷請求。脈衝可以為上升沿或下降沿。在傳送完脈衝後設備立即釋放中斷線路。如果這個脈衝太短，以至於I/O輪詢不足以確保知悉其存在，則有必要使用專門的硬體裝置來輔助對邊沿觸發的探查。中斷裝置可設計成與其他裝置共享一條邊沿觸發中斷線路。中斷線路應該包含一個特定的上拉／下拉電阻，用於在無中斷請求時為線路電平復位。裝置透過傳送一個脈衝作為其中斷訊號。如果多個裝置在近乎相同的時間內傳送脈衝，則會線上路上合併成一個訊號。為防止中斷丟失，CPU必須在一個脈衝之後的下一個邊沿立即觸發。收到中斷請求後CPU立即查詢各中斷裝置以定位中斷源。邊沿觸發中斷不會遭受狀態觸發中斷在共享中斷引腳時所遇到的問題。低優先順序裝置的服務可任意推遲，而CPU仍會收到高優先順序裝置的中斷請求。一個即便是頻繁發生的偽中斷也不會影響正常裝置的中斷請求。但是，邊沿觸發中斷容易丟失，特別是當中斷被有意遮蔽時。在不引入鎖存器的情況下，在遮蔽時段傳送的中斷訊號不可恢復。在早期的計算機系統中因為中斷丟失而導致處理不能繼續的情況時有發生。現代中斷硬體多包含有一個或一組中斷狀態鎖存器，用以暫存一逝而過的中斷請求。在對邊沿觸發中斷硬體進行程式設計時，應檢查這些中斷狀態暫存器以確保請求事件不會丟失。已經過時的ISA標準使用邊沿觸發中斷，但不規定其實現必須能夠共享線路。混合模式.一些系統使用狀態觸發與邊沿觸發兼顧的混合中斷模式。其硬體不但探測脈衝，也驗證中斷訊號是否保持一段時間。非可遮蔽中斷多使用混合模式。由於非可遮蔽中斷多與重要的系統異常事件相關，十分有必要確保對其中斷訊號的捕捉快速而正確。這種兩步驟探查方式能夠有效減輕錯誤中斷或遺失中斷給系統帶來的影響。訊息訊號.訊息訊號式中斷並不直接透過對特定物理線路進行斷言／傳送脈衝來通知一箇中斷。這類中斷裝置透過在某種通訊媒介來實現中斷請求。中斷訊息可以是通訊匯流排協議中專門為中斷預留的型別，也可以是一個現有的型別，如記憶體寫操作。訊息訊號式中斷在行為上與邊沿觸發中斷類似，因為它們都是傳送一個瞬間的訊號。中斷處理軟體的對此類中斷的處理方式也類似於邊沿觸發中斷：如果兩個訊息相同，則可以合併。訊息訊號中斷向量也可以共享，就如同物理線路可以被共享一般。由於中斷訊息的識別基於特定的位元碼序列而不是物理線路上的單個訊號，可以有效地透過設定不同的中斷位元碼來劃分和處理不同型別的中斷。另外，使用序列或並行匯流排都可以傳遞中斷訊息。由於無論狀態觸發還是邊沿觸發都在使用共享線路時存線上路競爭問題，而物理線路數本身也是稀缺資源，不可能被各中斷源分別獨佔，所以訊息訊號中斷是一個解決此問題的較好替代方案。訊息訊號中斷的本質差別在於其中斷請求執行在單純的物理線路之上，具有特定的邏輯含義。這種區別好比計算機網路體系中第一層的差別。使用具有邏輯含義的中斷請求，可以把諸請求區分開來，形成多條虛通路，而運行於一條物理匯流排之上。PCI Express序列匯流排標準即使用此種中斷。應用.常見應用.中斷的典型應用包括系統時鐘、磁碟輸入輸出操作、斷電訊號以及軟體自陷等。例項：8086A的中斷系統.8086A處理器是INTEL公司於20世紀70年代末推出的一款16位處理器。該處理器在中斷處理上有如下特色，這些特色也為後續INTEL處理器所共有。引腳.8086A提供兩個中斷引腳：第17引腳NMI，和第18引腳INTR。前者用於接收非可遮蔽中斷，後者則接收可遮蔽中斷。通常，INTR引腳與中斷控制器及8位資料匯流排與8259A連線，並將INTA引腳與8259A的同名引腳相連。中斷向量表.在儲存器地址空間中，規定最低的1K空間，即00000H到003FFH為中斷向量表。全表共含256箇中斷向量，每個向量的長度為4位元組，包含中斷處理程式的起始地址。共有從0到255共256箇中斷型別碼，每個中斷型別碼對應的中斷向量所在地址為該型別碼乘以4。舉例而言，如果中斷型別碼為1，則對應中斷向量所在地址為00004H；如果中斷型別碼為33，則對應中斷向量所在地址為00084H。這樣，如果已知一箇中斷型別碼，則需要透過兩次地址轉換才能到達中斷處理程式。另外應注意每一箇中斷向量所包含的地址是以低二位元組儲存偏移量，高二位元組儲存段地址的形式儲存目標地址值的。在全部256箇中斷中，前32個對應的中斷型別碼。同時，將對應此中斷之處理程式的起始地址儲存在該中斷型別碼乘4的地址位中，作為中斷向量。在INTEL後續的32位CPU中，使用中斷描述符表來代替中斷向量表。中斷描述符表的起始地址由中斷描述符表暫存器方式。中斷處理過程.在實際執行中，一旦裝置透過某引腳N向8259A發出中斷指令，後者便向8086A的INTR引腳傳送中斷訊號。8086A透過INTA引腳通知8259A中斷有效傳送給CPU。CPU得到中斷型別碼後，先進行現場保護，主要包括：現場保護完成後，CPU開始按照前述的兩步驟翻譯中斷程式入口地址。在得到中斷處理程式地址之後但呼叫中斷處理程式之前，CPU會再檢查一下NMI引腳是否有訊號，以防在剛才的處理過程中忽略了可能的NMI中斷。NMI的優先順序始終高於INTR。中斷處理程式雖然是由程式設計師編寫，但須循一定規範。作為例程，中斷處理程式應該先將各暫存器資訊壓入堆疊予以儲存，這樣才能在中斷處理程式內部使用這些暫存器。在程式結束時，應該按與壓棧保護時相反的順序彈出各暫存器的值。中斷程式的最後一句始終是IRET指令，這條指令將棧頂6個位元組分別彈出並存入IP、CS和FLAGS暫存器，完成了現場的還原。當然，如果是作業系統的中斷處理程式，則未必——通常不會——還原中斷前的狀態。這樣的中斷處理程式通常會在呼叫完暫存器儲存例程後，呼叫程序排程程式存入暫存器並返回。在中斷程式結束之後，主程式也發生了改變。相關指令.一些與中斷控制相關的指令包括：