複製鏈接
請複製以下鏈接發送給好友

硬中斷

鎖定
中斷是一種電信號,當設備有某種事件發生時,它就會產生中斷,通過總線把電信號發送給中斷控制器。硬中斷是由硬件產生的,比如,像磁盤,網卡,鍵盤,時鐘等。每個設備或設備集都有它自己的IRQ(中斷請求)。基於IRQ,CPU可以將相應的請求分發到對應的硬件驅動上。
中文名
硬中斷
外文名
hardware interruptRequest
學    科
計算機組成原理
產    生
由硬件產生的
來    源
磁盤,網卡,鍵盤,時鐘
特    點
直接中斷CPU

硬中斷簡介

在計算機系統中,CPU在正常運行程序時,由於程序的預先安排或內外事件,引起CPU中斷正在運行的程序,而轉到為預先安排的事件或內外事件服務的程序中去,這就是常稱的中斷。當由於執行某些指令引起的中斷,如DIV指令,除數為0時產生的中斷為軟中斷;CPU本身也有兩條中斷請求線:非屏蔽中斷,和可屏蔽中斷線。當這兩條線上收到中斷請求信號而引起的中斷,則產生了硬中斷 [1]  。硬中斷是一個異步信號,或需要改變在執行一個同步事件。硬中斷是一種在輪詢循環,等待外部事件方面避免浪費處理器的寶貴時間的方式。作為一個獨立的有控制線系統,它們可以在硬件中實現或被集成到存儲器子系統。硬中斷就是通常意義上的“中斷處理程序”,它是直接處理由硬件發過來的中斷信號的。當硬中斷收到它應當處理的中斷信號以後,就回去自己驅動的設備上去看看設備的狀態寄存器以瞭解發生了什麼事情,並進行相應的操作。
Linux下硬中斷是可以嵌套的,但是沒有優先級的概念,也就是説任何一個新的中斷都可以打斷正在執行的中斷,但同種中斷除外。軟中斷不能嵌套,但相同類型的軟中斷可以在不同CPU上並行執行。

硬中斷硬中斷與軟中斷的區別

軟中斷是一組靜態定義的下半部分接口,可以在所有的處理器上同時執行,即使兩個類型相同也可以。但是一個軟中斷不會搶佔另外的一個軟中斷,可以搶佔軟中斷的硬中斷。
為了滿足實時系統的要求,中斷處理應該越快越好。編寫驅動程序的時候,一箇中斷產生之後,內核在中斷處理函數中可能需要完成很多工作。但是中斷處理函數的處理是關閉了中斷的。也就是説在響應中斷時,系統不能再次響應外部的其它中斷。這樣的後果會造成有可能丟失外部中斷。於是,Linux內核設計出了一種架構,中斷函數需要處理的任務分為兩部分,一部分在中斷處理函數中執行,這時系統關閉中斷。另外一部分在軟件中斷中執行,這個時候開啓中斷,系統可以響應外部中斷。軟中斷是執行中斷指令產生的,而硬中斷是由外設引發的。硬中斷的中斷號是由中斷控制器提供的,軟中斷的中斷號由指令直接指出,無需使用中斷控制器。硬中斷是可屏蔽的,軟中斷不可屏蔽。硬中斷處理程序要確保它能快速地完成任務,這樣程序執行時才不會等待較長時間,稱為上半部。軟中斷處理硬中斷未完成的工作,是一種推後執行的機制,屬於下半部。

硬中斷類別

硬中斷可以分為以下幾種:
可屏蔽中斷(maskable interrupt)。硬件中斷的一類,可通過在中斷屏蔽寄存器中設定位掩碼來關閉。
非可屏蔽中斷(non-maskable interrupt,NMI)。硬件中斷的一類,無法通過在中斷屏蔽寄存器中設定位掩碼來關閉。典型例子是時鐘中斷(一個硬件時鐘以恆定頻率—如50Hz—發出的中斷)。
處理器間中斷(interprocessor interrupt)。一種特殊的硬件中斷。由處理器發出,被其它處理器接收。僅見於多處理器系統,以便於處理器間通信或同步。
偽中斷(spurious interrupt)。一類不希望被產生的硬件中斷。發生的原因有很多種,如中斷線路上電氣信號異常,或是中斷請求設備本身有問題。

硬中斷中斷處理過程

微機系統中,對於外部中斷,中斷請求信號是由外部設備產生,並施加到CPU的NMI或INTR引腳上,CPU通過不斷地檢測NMI和INTR引腳信號來識 別是否有中斷請求發生。對於內部中斷,中斷請求方式不需要外部施加信號激發,而是通過內部中斷控制邏輯去調用。無論是外部中斷還是內部中斷,中斷處理過程 都要經歷以下步驟:請求中斷→響應中斷→關閉中斷→保留斷點→中斷源識別→保護現場→中斷服務子程序→恢復現場→中斷返回。

硬中斷請求中斷

當某一中斷源需要CPU為其進行中斷服務時,就輸出中斷請求信號,使中斷控制系統的中斷請求觸發器置位,向CPU請求中斷。系統要求中斷請求信號一直保持到CPU對其進行中斷響應為止。

硬中斷中斷響應

CPU對系統內部中斷源提出的中斷請求必須響應,而且自動取得中斷服務子程序的入口地址,執行中斷 服務子程序。對於外部中斷,CPU在執行當前指令的最後一個時鐘週期去查詢INTR引腳,若查詢到中斷請求信號有效,同時在系統開中斷(即IF=1)的情 況下,CPU向發出中斷請求的外設回送一個低電平有效的中斷應答信號,作為對中斷請求INTR的應答,系統自動進入中斷響應週期。

硬中斷關閉中斷

CPU響應中斷後,輸出中斷響應信號,自動將狀態標誌寄存器FR或EFR的內容壓入堆棧保護起來,然後將FR或EFR中的中斷標誌位IF與陷阱標誌位TF清零,從而自動關閉外部硬件中斷。因為CPU剛進入中斷時要保護現場,主要涉及堆棧操作,此時不能再響應中斷,否則將造成系統混亂。

硬中斷保護斷點

保護斷點就是將CS和IP/EIP的當前內容壓入堆棧保存,以便中斷處理完畢後能返回被中斷的原程序繼續執行,這一過程也是由CPU自動完成。

硬中斷中斷源識別

當系統中有多個中斷源時,一旦有中斷請求,CPU必須確定是哪一個中斷源提出的中斷請求,並由中斷控制器給出中斷服務子程序的入口地址,裝入CS與IP/EIP兩個寄存器。CPU轉入相應的中斷服務子程序開始執行。

硬中斷保護現場

主程序和中斷服務子程序都要使用CPU內部寄存器等資源,為使中斷處理程序不破壞主程序中寄存器的內容,應先將斷點處各寄存器的內容壓入堆棧保護起來,再進入的中斷處理。現場保護是由用户使用PUSH指令來實現的。

硬中斷中斷服務

中斷服務是執行中斷的主體部分,不同的中斷請求,有各自不同的中斷服務內容,需要根據中斷源所要完成的功能,事先編寫相應的中斷服務子程序存入內存,等待中斷請求響應後調用執行。

硬中斷恢復現場

當中斷處理完畢後,用户通過POP指令將保存在堆棧中的各個寄存器的內容彈出,即恢復主程序斷點處寄存器的原值。

硬中斷中斷返回

在中斷服務子程序的最後要安排一條中斷返回指令IRET,執行該指令,系統自動將堆棧內保存的 IP/EIP和CS值彈出,從而恢復主程序斷點處的地址值,同時還自動恢復標誌寄存器FR或EFR的內容,使CPU轉到被中斷的程序中繼續執行。

硬中斷內存管理

處理硬件中斷的驅動程序對所有分配的內存有嚴格的要求。所有在中斷期間要訪問的代碼和數據都必須是固定的、頁碼鎖定的和不可廢棄的。這包括中斷處理函數本身的代碼以及在中斷處理過程中要用到的驅動程序代碼段、任何動態分配的緩衝區和應用程序分配的要傳遞給驅動程序的緩衝區。
內存要求必須是固定的。因為內存管理器把中斷處理函數要用到的數據段移動了,在一些字節被拷貝後,硬件中斷髮生,這時硬件中斷處理函數被執行。硬件中斷處理函數會更新正在移動的數據段中的一些內容,當處理函數結束運行之後,內存管理器接着移動數據段,而這時的數據段已經被處理函數更改過了。內存管理器並不知道處理函數已經改變了數據。而使用該數據段的應用程序就得不到希望得到的數據。
同時內存又要求必須是頁面鎖定的。假設硬件中斷髮生了,而內存管理器是在可廢棄的代碼中,那麼就會發生段不在內存中的警告,在此種情況下就有可能發生重入 DOS 的情況,而 DOS 代碼是不可重入的,所以代碼段是不可廢棄的。
參考資料
  • 1.    魏光杏,尹汪宏.用Turbo C對計算機硬中斷的實現[J].安徽電子信息職業技術學院學報,2003(01):54-56.