更好的參考:CPU的内部的中斷
學習中斷是為了了解信号,因為信号即軟中斷。
中斷不是輪詢!比如最常見的在UART通信過程中(收發資料),有兩種方式,一種是中斷,一種是輪詢。如果中斷是輪詢,這兩者就沒差別了。但是中斷(内部中斷或者外部中斷)和作業系統的處理時序,系統的定時器,CPU的架構密切相關的,每個中斷(硬體中斷)都會對應到CPU硬體的一個PIN腳上。在硬體(CPU)各PIN腳初始化的時候對其進行設定(Enable/Disable,中斷優先級)。每個CPU都有自己的中斷向量表,每一個中斷向量對應的是一個位址(中斷處理程式)。當中斷發生時(突發事件,這裡隻說硬體中斷),對應PIN腳上會發生電平變化(高電平有效還是低電平有效),通知系統優先處理(你自己的中斷處理程式),跳到對應的中斷向量(位址)上去,從特定位址開始執行相應的中斷處理程式。
中斷發生時,比如外部中斷,會通過8259晶片給CPU 一個電信号, 并将中斷号放入到指定的寄存器, cpu 執行完目前指令之後會檢查是否有中斷發生,如果發現CPU中斷引腳出現高位電平,則擷取對于寄存器的中斷号, 并根據該中斷号查詢中斷向量表擷取中斷服務位址(中斷向量表的入口是體系結構定死的+0000 入口位址+中斷号 就可以擷取中斷服務入口位址),然後開始執行中斷服務程式。
一、什麼是CPU中斷?
使用計算機的過程中,經常會遇到這麼一種情景:
1. 你正在看電影
2. 你的朋友發來一條QQ資訊
3. 你一邊回複朋友的資訊,一邊繼續看電影
這個過程中,一切是那麼的順其自然。但理論上來說,播放電影的時候,CPU正在一絲不苟的執行着一條又一條的指令,它是如何在維持電影播放的情況下,及時接收并響應你的鍵盤輸入資訊呢?
這就是CPU中斷技術在起作用。
CPU中斷技術的定義如下:
- 計算機處于執行期間
- 系統内發生了非尋常或非預期的急需處理事件
- CPU暫時中斷目前正在執行的程式而轉去執行相應的事件處理程式
- 處理完畢後傳回原來被中斷處繼續執行
在這裡,“非尋常或非預期的事件”指的就是你回複朋友的QQ時,用鍵盤鍵入資訊。為了及時響應你鍵入的資訊,CPU将正在執行的任務“播放電影”暫時中斷,處理完你鍵入的資訊後,繼續執行“播放電影”的任務。由于這個“中斷目前任務->響應鍵盤輸入->繼續目前任務”的執行周期非常短(一般都是微秒級),是以一般人感覺不出來。
舉個現實中的例子:
你正在看書,突然你的朋友打來電話,于是你放下書本去接電話,電話打完接着看書。
電話響->放下書本->接電話->繼續看書這一個過程,就類似于CPU中斷的處理過程。
二、CPU中斷的作用
早期的CPU處理外設的事件(比如接收鍵盤輸入),往往采用“輪詢”的方式。即CPU像個查崗的一樣輪番對外設順序通路,比如它先看看鍵盤有沒被按下,有的話就處理,沒的話繼續往下看滑鼠有沒有移動,再看看列印機……這種方式使CPU的執行效率很低,且CPU與外設不能同時工作(因為要等待CPU來“巡查”)。
中斷模式時就是說CPU不主動通路這些裝置,隻管處理自己的任務。如果有裝置要與CPU聯系,或要CPU處理一些事情,它會給CPU發一個中斷請求信号。這時CPU就會放下正在進行的工作而去處理這個外設的請求。處理完中斷後,CPU傳回去繼續執行中斷以前的工作。
中斷模式的作用和優點在于:
1. 可以使CPU和外設同時工作,使系統可以及時地響應外部事件。
2. 可允許多個外設同時工作,大大提高了CPU的使用率,也提高了資料輸入、輸出的速度。
3. 可以使CPU及時處理各種軟硬體故障(比如計算機在運作過程中,出現了難以預料的情況或一些故障,如電源掉電、存儲出錯、運算溢出等等。計算機可以利用中斷系統自行處理,而不必停機或報告從業人員。)
三、CPU中斷的類型
在計算機系統中,根據中斷源的不同,通常将中斷分為兩大類:
1. 硬體中斷
2. 軟體中斷
硬體中斷
硬體中斷又稱外部中斷,主要分為兩種:可屏蔽中斷、非屏蔽中斷。
可屏蔽中斷:
1. 常由計算機的外設或一些接口功能産生,如鍵盤、列印機、串行口等
2. 這種類型的中斷可以在CPU要處理其它緊急操作時,被軟體屏蔽或忽略
非屏蔽中斷:
1. 由意外事件導緻,如電源斷電、記憶體校驗錯誤等
2. 對于這種類型的中斷事件,無法通過軟體進行屏蔽,CPU必須無條件響應
在x86架構的處理器中,CPU的中斷控制器由兩根引腳(INTR和NMI)接收外部中斷請求信号。其中:
1. INTR接收可屏蔽中斷請求
2. NMI接收非屏蔽中斷請求
典型事例:
1. 典型的可屏蔽中斷的例子是列印機中斷,CPU對列印機中斷請求的響應可以快一些,也可以慢一些,因為讓列印機稍等待一會也是完全合理的。
2. 典型的非屏蔽中斷的例子是電源斷電,一旦出現此中斷請求,必須立即無條件地響應,否則進行其他任何工作都是沒有意義的。
軟體中斷
軟體中斷又稱内部中斷,是指在程式中調用INTR中斷指令引起的中斷。比如winAPI中,keybd_event和mouse_event兩個函數,就是用來模拟鍵盤和滑鼠的輸入(這個僅為筆者本人的猜測)。
四、CPU中斷的過程
中斷請求
中斷請求是由中斷源向CPU發出中斷請求信号。外部裝置發出中斷請求信号要具備以下兩個條件:
1. 外部裝置的工作已經告一段落。例如輸入裝置隻有在啟動後,将要輸入的資料送到接口電路的資料寄存器(即準備好要輸入的資料)之後,才可以向CPU發出中斷請求。
2. 系統允許該外設發出中斷請求。如果系統不允許該外設發出中斷請求,可以将這個外設的請求屏蔽。當這個外設中斷請求被屏蔽,雖然這個外設準備工作已經完成,也不能發出中斷請求。
中斷響應、處理和傳回
當滿足了中斷的條件後,CPU就會響應中斷,轉入中斷程式處理。具體的工作過程如下:
1. 關閉中斷信号接收器
2. 儲存現場(context)
3. 給出中斷入口,轉入相應的中斷服務程式
4. 處理完成,傳回并恢複現場(context)
5. 開啟中斷信号接收器
中斷排隊和中斷判優
1. 中斷申請是随機的,有時會出現多個中斷源同時提出中斷申請。
2. CPU每次隻能響應一個中斷源的請求。
3. CPU不可能對所有中斷請求一視同仁,它會根據各中斷源工作性質的輕重緩急,預先安排一個優先級順序。當多個中斷源同時申請中斷時,即按此優先級順序進行排隊,等候CPU處理。
了解了CPU中斷處理的過程,就不難了解下面一種常見的情景:
正在拷貝檔案時,往某個文本框輸入資訊,這個文本框會出現短暫的假死,鍵盤輸入的資料不能及時顯示在文本框中,需要等一會兒才能逐漸顯示出來。
這是因為該中斷操作(往文本框輸入資訊)在中斷隊列的優先級比較低,或者CPU認為正在處理的操作(拷貝檔案)進行挂起的代價太大,是以隻有等到CPU到了一個挂起代價較低的點,才會挂起目前操作,處理本次中斷資訊。
五、多核CPU對中斷的處理
多核CPU的中斷處理和單核有很大不同。多核的各處理器核心之間需要通過中斷方式進行通信,是以CPU晶片内部既有各處理器核心的本地中斷控制器,又有負責仲裁各核之間中斷配置設定的全局中斷控制器。
現今的多核處理器在中斷處理和中斷控制方面主要使用的是APIC(Advanced Programmable Interrupt Controllers),即進階程式設計中斷控制器。它是基于中斷控制器兩個基礎功能單元——本地單元以及I/O單元的分布式體系結構。在多核系統中,多個本地和I/O APIC單元能夠作為一個整體通過APIC總線互相操作。
APIC的功能有:
1. 接受來自處理器中斷引腳的内部或外部I/O APIC的中斷,然後将這些中斷發送給處理器核心進行處理
2. 在多核處理器系統中,接收和發送核内中斷消息
對于外部裝置發出的中斷請求,由全局中斷控制器接收請求并決定交給CPU的哪一個核心處理。也可針對APIC程式設計,讓所有的中斷都被一個固定的CPU處理。
摘自:
https://www.zhihu.com/question/21440586?sort=created
http://www.cnblogs.com/funeral/archive/2013/03/06/2945485.html