中斷和異常.md

中斷和異常的定義

中斷(interrupt)指在程序執行過程中遇到急需處理的事件時,暫時中止現行程序在 CPU 上的運行,轉而執行響應的事件處理程序,待處理完成後再返回斷點或調度其他程序。cpu對事件的響應.

中斷和異常不同人的視角不同,有的統稱為中斷有的統稱為異常,還有分別稱呼的,這個並不重要.因為它背後的思想是一致的,隻不過是看待它的視角不同進行人為劃分,後續會說明異常和中斷區別.

為什麼需要中斷/異常機制,目的是什麼

一下特性是中斷和異常分別提供的:

  • 支持cpu和設備之間的並行
  • 實時交互的需要(即刻響應)
  • 優先級支持(對更緊急任務的支持)
  • 故障報警與處理
  • 保護性操作需要,防止破壞
  • 並行和進程操作/交互的需要(時間片)

中斷和異常的區別

從發生源角度和處理方式角度劃分為瞭中斷和異常. 但是他們處理問題的方式和思路本質是一樣的.

中斷指I/O設備發出,也成為外中斷.外部事件,正在運行的程序所不期望的異常是正在執行的指令引發的,cpu執行指令本身出現問題=>響應錯誤/異常處理程序,執行系統調用(通過trap)

中斷解決cpu和設備間並行操作;異常解決cpu執行指令時出現的問題處理(算數溢出/地址越界…)

外中斷,也是中斷,異步中斷,是指來自處理器之外的中斷信號,包括時鐘中斷、鍵盤中斷、它機中斷和外部設備中斷。外中斷又分可屏蔽中斷和不可屏蔽中斷,各個中斷具有不同的優先級,表示事件的緊急程度,在處理高一級中斷時往往會部分或全部屏蔽低級中斷。因最開始的中斷僅針對外中斷,因此外中斷也直接稱作中斷。

內中斷,又稱異常,同步中斷,是指來自處理器內部的中斷信號,通常是由於在程序執行過程中,發現與當前指令關聯的、不正常的或錯誤的事件。內中斷不能被屏蔽,一旦出現必須立即予以響應並進行處理,隻是處理程序運行過程中可以選擇是否屏蔽其它中斷或屏蔽哪些中斷。 內中斷可細分為:* 訪管中斷,由系統程序執行訪管指令引起,可以看做機器指令的一種擴充;* 硬件故障中斷,如:電源失效、奇偶校驗錯誤,總線超時;* 程序性中斷,如:非法操作、地址越界、頁面故障、調試指令、除數為0和浮點溢出等。

中斷由外部的中斷控制器進行觸發和響應.異常由cpu內部的中斷處理器電路控制.

中斷和異常的區別 圖

屏幕快照 2021-01-06 12.01.05.png

關於它們的區別有兩點是需要註意的:平常所說的屏蔽中斷是不包括異常的,即異常不會因為CPU的IF位被清(關中斷,指令:cli)而受影響,比如缺頁異常,即使關瞭中斷也會觸發CPU的處理,回答瞭我上面紅色部分疑問。通常說的int 80h這種系統調用使用的中斷方式實際上硬件上是理解為異常處理的,因此也不會被屏蔽掉,這也很好理解,int 80h這種中斷方式是程序裡主動觸發的,對於CPU來說屬於同步事件,因此也就屬於異常的范疇。

為什麼中斷處理過程中不能被阻塞,而異常處理過程卻可以?

這是一個從解決問題考慮的設計思路問題,中斷是外部設備發出, 你沒辦法決定是否可以忽略,所以隻能立刻響應, 至於做不做事是可以決定的.異常所提供的服務本就是當前進程所需要的,故而當進程需要阻塞的時候,便會在異常處理程序中設置阻塞。所以它是你自己可控的你可以決定它是否可以阻塞.

中斷/異常分類

圖1

Scannable Document on Jan 6, 2021 at 9_18_46 AM.png

按中斷源進行分類:發出中斷請求的設備稱為中斷源。按中斷源的不同,中斷可分為內中斷:即程序運行錯誤引起的中斷外中斷:即由外部設備、接口卡引起的中斷軟件中斷:由寫在程序中的語句引起的中斷程序的執行,稱為軟件中斷

允許/禁止(開/關)中斷: CPU通過指令限制某些設備發出中斷請求,稱為屏蔽中斷。從CPU要不要接收中斷即能不能限制某些中斷發生的角度 ,中斷可分為可屏蔽中斷 :可被CPU通過指令限制某些設備發出中斷請求的中斷, 那是不是意味著進中斷時disable整個中斷,其實disable的都是可屏蔽中斷?不可屏蔽中斷:不允許屏蔽的中斷如電源掉電

可屏蔽中斷,I/O設備發出的所有中斷請求(IRQ)都產生可屏蔽中斷,一個屏蔽的中斷隻要還是屏蔽的,控制單元就可以忽略它。非屏蔽中斷,有一些危險的事件才能引起非屏蔽中斷,例如硬件故障,非屏蔽中斷總是由CPU辨認。

中斷/異常工作機制

硬件軟件同時支持才能完成.由硬件捕獲響應,軟件識別類型然後處理.每個中斷/異常都有個號碼,由硬件設計者或者操作系統設計者定義

大致流程:硬件捕獲中斷(某個針腳高電壓)->根據內容按規矩編碼(中斷碼)->寫入中斷寄存器cpu執行指令周期的最後時刻掃描中斷寄存器->暫停當前程序->保護現場->根據中斷碼去中斷向量表查詢->找到地址及相關狀態參數->執行中斷程序->恢復

中斷/異常的軟硬件支持結構

os:操作系統設計時,提前設置中斷/異常處理程序和向量表設計和實現中斷處理程序設計處理程序的向量表運行時響應中斷

中斷碼: 中斷硬件對中斷內容按規則編碼,送入程序狀態字寄存器(PSW)的相應位 中斷向量表: 硬件查的表 映射中斷處理程序 中斷向量: 它是內存單元 存儲處理程序入口地址,程序運行所需的處理機狀態字

硬件:中斷寄存器:保存中斷信號cpu響應:在指令執行周期最後時刻掃描中斷寄存器,看是否有判斷是否允許中斷

硬件的工作:(捕獲/響應)* 捕獲中斷源請求* 響應* 控制權交給特定處理程序軟件的工作:(處理)* 識別中斷/異常類型* 完成處理(軟件本身為處理程序)

實施/保護模式

在X86中,分為實模式和保護模式,實模式通常是CPU啟動到BIOS再到操作系統啟動前的這段時間,操作啟動初始化完成進入到保護模式。

補充知識

常見異常:

  • 算數溢出
  • 除零
  • 取數奇偶校驗錯
  • trap指令(system call)
  • 硬件改變cpu執行流程
  • 地址越界
  • 頁錯誤/故障
  • 保護性異常(寫僅讀內存)
  • 斷點指令

常見中斷:

  • I/O中斷
  • 時鐘中斷
  • 硬件故障

圖2

中斷允許觸發器:在CPU內部設置一個中斷允許觸發器,隻有該觸發器置“1”,才允許中斷;置“0”,不允許中斷。

指令系統中,開中斷指令,使中斷觸發器置“1” 關中斷指令,使中斷觸發器置“0”

中斷優先級:為瞭管理眾多的中斷請求,需要按每個(類)中斷處理的急迫程度,對中斷進行分級管理,稱其為中斷優先級。在有多個中斷請求時,總是響應與處理優先級高的設備的中斷請求。

中斷嵌套:當CPU正在處理優先級較低的一個中斷,又來瞭優先級更高的一個中斷請求,則CPU先停止低優先級的中斷處理過程,去響應優先級更高的中斷請求,在優先級更高的中斷處理完成之後,再繼續處理低優先級的中斷,這種情況稱為中斷嵌套。

中斷又可以分為可屏蔽中斷和非可屏蔽中斷,中斷屏蔽是指 禁止 CPU 響應或禁止中斷產生。前者是指 CPU 暫時不響應中斷,等中斷開放瞭被屏蔽的中斷才能被響應,防止同級或高級的中斷影響。後者是中斷的事件發生時直接不允許提出中斷請求也不能通知 CPU。

多重中斷有幾種處理方法,一種是串行處理,CPU 響應中斷的時候屏蔽其它部分或所有中斷;第二種是即時處理,運行中斷的過程中,如果出現程序性中斷(異常),一般情況表明此時中斷處理程序有異常,應對其進行立即響應;第三種是嵌套處理,對於有些必須處理的高優先級的中斷事件,采用屏蔽的方法不妥,因此允許某些中斷處理程序時依然能夠響應中斷。操作系統必須預先規定每類中斷的優先級,中斷嵌套一般不會超過 3 重,過多嵌套會增加系統不必要的開銷。

系統調用

系統調用使用trap實現, 是用戶態到內核態的唯一入口(調用操作系統接口使用特權指令)特殊指令:是trap/訪管指令,調用不同系統接口的統一入口,根據號和參數區分流程:通過trap一發異常-> 用戶態切換到內核態->傳參執行

用戶參數如何傳入內核

三種方式:

  1. trap指令自帶參數(數量有限)
  2. 通用寄存器,通用方案,寄存器個數有限
  3. 內存中專門對戰區

參考

http://www.yaoyanhuo.com/blog/interrupt/

赞(0)