版權歸原作者所有,如有侵權,請聯(lián)系我們

[科普中國]-硬中斷

科學百科
原創(chuàng)
科學百科為用戶提供權威科普內(nèi)容,打造知識科普陣地
收藏

中斷是一種電信號,當設備有某種事件發(fā)生時,它就會產(chǎn)生中斷,通過總線把電信號發(fā)送給中斷控制器。硬中斷是由硬件產(chǎn)生的,比如,像磁盤,網(wǎng)卡,鍵盤,時鐘等。每個設備或設備集都有它自己的IRQ(中斷請求)?;贗RQ,CPU可以將相應的請求分發(fā)到對應的硬件驅(qū)動上。

簡介在計算機系統(tǒng)中,CPU在正常運行程序時,由于程序的預先安排或內(nèi)外事件,引起CPU中斷正在運行的程序,而轉(zhuǎn)到為預先安排的事件或內(nèi)外事件服務的程序中去,這就是常稱的中斷。當由于執(zhí)行某些指令引起的中斷,如DIV指令,除數(shù)為0時產(chǎn)生的中斷為軟中斷;CPU本身也有兩條中斷請求線:非屏蔽中斷,和可屏蔽中斷線。當這兩條線上收到中斷請求信號而引起的中斷,則產(chǎn)生了硬中斷1。硬中斷是一個異步信號,或需要改變在執(zhí)行一個同步事件。硬中斷是一種在輪詢循環(huán),等待外部事件方面避免浪費處理器的寶貴時間的方式。作為一個獨立的有控制線系統(tǒng),它們可以在硬件中實現(xiàn)或被集成到存儲器子系統(tǒng)。硬中斷就是通常意義上的“中斷處理程序”,它是直接處理由硬件發(fā)過來的中斷信號的。當硬中斷收到它應當處理的中斷信號以后,就回去自己驅(qū)動的設備上去看看設備的狀態(tài)寄存器以了解發(fā)生了什么事情,并進行相應的操作。

Linux下硬中斷是可以嵌套的,但是沒有優(yōu)先級的概念,也就是說任何一個新的中斷都可以打斷正在執(zhí)行的中斷,但同種中斷除外。軟中斷不能嵌套,但相同類型的軟中斷可以在不同CPU上并行執(zhí)行。

硬中斷與軟中斷的區(qū)別軟中斷是一組靜態(tài)定義的下半部分接口,可以在所有的處理器上同時執(zhí)行,即使兩個類型相同也可以。但是一個軟中斷不會搶占另外的一個軟中斷,可以搶占軟中斷的硬中斷。

為了滿足實時系統(tǒng)的要求,中斷處理應該越快越好。編寫驅(qū)動程序的時候,一個中斷產(chǎn)生之后,內(nèi)核在中斷處理函數(shù)中可能需要完成很多工作。但是中斷處理函數(shù)的處理是關閉了中斷的。也就是說在響應中斷時,系統(tǒng)不能再次響應外部的其它中斷。這樣的后果會造成有可能丟失外部中斷。于是,Linux內(nèi)核設計出了一種架構(gòu),中斷函數(shù)需要處理的任務分為兩部分,一部分在中斷處理函數(shù)中執(zhí)行,這時系統(tǒng)關閉中斷。另外一部分在軟件中斷中執(zhí)行,這個時候開啟中斷,系統(tǒng)可以響應外部中斷。軟中斷是執(zhí)行中斷指令產(chǎn)生的,而硬中斷是由外設引發(fā)的。硬中斷的中斷號是由中斷控制器提供的,軟中斷的中斷號由指令直接指出,無需使用中斷控制器。硬中斷是可屏蔽的,軟中斷不可屏蔽。硬中斷處理程序要確保它能快速地完成任務,這樣程序執(zhí)行時才不會等待較長時間,稱為上半部。軟中斷處理硬中斷未完成的工作,是一種推后執(zhí)行的機制,屬于下半部。

類別硬中斷可以分為以下幾種:

可屏蔽中斷(maskable interrupt)。硬件中斷的一類,可通過在中斷屏蔽寄存器中設定位掩碼來關閉。

非可屏蔽中斷(non-maskable interrupt,NMI)。硬件中斷的一類,無法通過在中斷屏蔽寄存器中設定位掩碼來關閉。典型例子是時鐘中斷(一個硬件時鐘以恒定頻率—如50Hz—發(fā)出的中斷)。

處理器間中斷(interprocessor interrupt)。一種特殊的硬件中斷。由處理器發(fā)出,被其它處理器接收。僅見于多處理器系統(tǒng),以便于處理器間通信或同步。

偽中斷(spurious interrupt)。一類不希望被產(chǎn)生的硬件中斷。發(fā)生的原因有很多種,如中斷線路上電氣信號異常,或是中斷請求設備本身有問題。

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

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

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

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

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

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

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

中斷服務中斷服務是執(zhí)行中斷的主體部分,不同的中斷請求,有各自不同的中斷服務內(nèi)容,需要根據(jù)中斷源所要完成的功能,事先編寫相應的中斷服務子程序存入內(nèi)存,等待中斷請求響應后調(diào)用執(zhí)行。

恢復現(xiàn)場當中斷處理完畢后,用戶通過POP指令將保存在堆棧中的各個寄存器的內(nèi)容彈出,即恢復主程序斷點處寄存器的原值。

中斷返回在中斷服務子程序的最后要安排一條中斷返回指令IRET,執(zhí)行該指令,系統(tǒng)自動將堆棧內(nèi)保存的 IP/EIP和CS值彈出,從而恢復主程序斷點處的地址值,同時還自動恢復標志寄存器FR或EFR的內(nèi)容,使CPU轉(zhuǎn)到被中斷的程序中繼續(xù)執(zhí)行。

內(nèi)存管理處理硬件中斷的驅(qū)動程序?qū)λ蟹峙涞膬?nèi)存有嚴格的要求。所有在中斷期間要訪問的代碼和數(shù)據(jù)都必須是固定的、頁碼鎖定的和不可廢棄的。這包括中斷處理函數(shù)本身的代碼以及在中斷處理過程中要用到的驅(qū)動程序代碼段、任何動態(tài)分配的緩沖區(qū)和應用程序分配的要傳遞給驅(qū)動程序的緩沖區(qū)。

內(nèi)存要求必須是固定的。因為內(nèi)存管理器把中斷處理函數(shù)要用到的數(shù)據(jù)段移動了,在一些字節(jié)被拷貝后,硬件中斷發(fā)生,這時硬件中斷處理函數(shù)被執(zhí)行。硬件中斷處理函數(shù)會更新正在移動的數(shù)據(jù)段中的一些內(nèi)容,當處理函數(shù)結(jié)束運行之后,內(nèi)存管理器接著移動數(shù)據(jù)段,而這時的數(shù)據(jù)段已經(jīng)被處理函數(shù)更改過了。內(nèi)存管理器并不知道處理函數(shù)已經(jīng)改變了數(shù)據(jù)。而使用該數(shù)據(jù)段的應用程序就得不到希望得到的數(shù)據(jù)。

同時內(nèi)存又要求必須是頁面鎖定的。假設硬件中斷發(fā)生了,而內(nèi)存管理器是在可廢棄的代碼中,那么就會發(fā)生段不在內(nèi)存中的警告,在此種情況下就有可能發(fā)生重入 DOS 的情況,而 DOS 代碼是不可重入的,所以代碼段是不可廢棄的。

本詞條內(nèi)容貢獻者為:

王慧維 - 副研究員 - 西南大學