Linux 中斷
- 1. 中斷 定義
-
- 1.1 背景(為什麼需要中斷)
- 1.2 中斷和信号
- 1.3 中斷本質及處理機制/流程
- 2. 中斷類型(分類)
-
- 2.1 同步中斷(異常/内部中斷)
-
- 2.1.1 同步中斷舉例:缺頁中斷
- 2.2 異步中斷(中斷/外部中斷)
-
- 2.2.1 異步中斷舉例:網卡的工作原理
- 2.3 中斷與異常的差別
- 3 中斷請求實作:上下半部機制
-
- 3.1 背景
- 3.2 上半部:
- 3.3 下半部:
- 3.4 上下半部劃分原則
- 3.5 舉例子: 用網卡來解釋一下這兩半。
- 4 斷請求線/中斷号
- 5 中斷上下文
1. 中斷 定義
中斷是硬體在需要的時候向CPU發出信号,CPU暫時停止正在進行的工作,來處理硬體請求的一種機制。
具體說;
中斷是指在CPU正常運作期間,由于内外部事件或由程式預先安排的事件引起的CPU暫時停止正在運作的程式,轉而為該内部或外部事件或預先安排的事件服務的程式中去,服務完畢後再傳回去繼續運作被暫時中斷的程式。
1.1 背景(為什麼需要中斷)
1.沒有中斷的話,CPU和外圍裝置之間協同工作/通信可能隻有輪詢這個方法:CPU定期檢查硬體狀态,需要處理時就處理,否則就跳過。
2.處理器的速度跟外圍的硬體裝置不在一個數量級上,是以提供一種機制讓硬體在需要的時候向核心發出信号。
輪詢的缺點/引入中斷機制:
當硬體忙碌的時候,CPU很可能會做許多無用功(每次輪詢都是跳過不處理)。
是以,為了提高CPU和外圍硬體(硬碟,鍵盤,滑鼠等等)之間協同工作的性能,引入了中斷的機制。
1.2 中斷和信号
中斷: 硬體/程序發,核心收
信号:核心發,程序收
1.3 中斷本質及處理機制/流程
中斷本質是一種特殊的電信号
處理過程:
中斷由硬體裝置生成,并直接送入中斷控制器(簡單的電子晶片)的輸入引腳中,中斷控制器采用複用技術将多路中斷管線隻通過一個和處理器相連接配接的管線與處理器通信。處理器一經檢測到此信号,便中斷自己的目前工作轉而進行中斷。硬體裝置生成中斷的時候并不考慮與處理器的時鐘同步,即中斷随時可以産生,是以核心随時可能因為新到來的中斷而被打斷。
2. 中斷類型(分類)
Linux中通常分為外部中斷(又叫硬體中斷)和内部中斷(又叫異常)。
2.1 同步中斷(異常/内部中斷)
同步中斷(異常/内部中斷):同步中斷由CPU本身産生,又稱為内部中斷或異常
2.1.1 同步中斷舉例:缺頁中斷
CPU在執行一條指令時,如果發現他要通路的頁(虛拟位址的頁)沒有在實體記憶體中,那麼停止該指令的執行,并産生一個頁不存在的異常
一個可執行檔案可能很大,放在磁盤上,一次隻将其中一部分讀進記憶體(cpu局部性原理),
當他要通路剩餘内容時,會産生缺頁中斷,這時候再去從磁盤上換進來
2.2 異步中斷(中斷/外部中斷)
異步中斷(中斷/外部中斷):異步中斷是由外部硬體裝置産生,又稱為外部中斷或中斷
2.2.1 異步中斷舉例:網卡的工作原理
當網卡接受到資料包時,通知核心,觸發中斷,所謂的上半部就是,及時讀取資料包到記憶體,防止因為延遲導緻丢失,這是很急迫的工作。
讀到記憶體後,對這些資料的處理不再緊迫,此時核心可以去執行中斷前運作的程式,而對網絡資料包的處理則交給下半部處理。
2.3 中斷與異常的差別
異常與中斷不同,中斷是由硬體引起的;
異常則發生在程式設計失誤而導緻錯誤指令,或者在執行期間出現特殊情況必須要靠核心來處理的時候(比如缺頁)。它在産生時必須考慮與處理器時鐘同步,是以異常也稱同步中斷。
3 中斷請求實作:上下半部機制
3.1 背景
中斷處理程式運作需要快速執行(因為不可阻塞),同時要能完成盡可能多的工作,這裡存在沖突。
是以把中斷處理切分為兩個部分,上半部分(top half)接收到一個中斷後立即執行,但是隻做有嚴格時限的工作,例如對接收到的中斷進行應答或複位硬體。能夠被允許稍後完成的工作會推遲到下半部分(bottom half)去,此後在合适的時機下半部分會被中斷執行,Linux提供了實作下半部分的各種機制。
優點:這種設計可以使系統處于中斷屏蔽狀态的時間盡可能的短,以此來提高系統的響應能力。
3.2 上半部:
中斷處理程式是上半部——接受中斷,他就立即開始執行,但隻有做嚴格時限的工作。
上半部簡單快速,執行時禁止一些或者全部中斷。
工作内容:處理緊急功能,取寄存器狀态。
3.3 下半部:
能夠被允許稍後完成的工作會推遲到下半部去,此後,在合适的時機,下半部執行
工作内容:完成中斷事件絕大多數任務。
下半部稍後執行,而且執行期間可以響應所有的中斷。
下半部的實作有軟中斷實作, tasklet 實作和工作隊列實作。
3.4 上下半部劃分原則
1) 如果一個任務對時間非常敏感,将其放在中斷處理程式中執行;
2) 如果一個任務和硬體有關,将其放在中斷處理程式中執行;
3) 如果一個任務要保證不被其他中斷打斷,将其放在中斷處理程式中執行;
4) 其他所有任務,考慮放置在下半部執行
3.5 舉例子: 用網卡來解釋一下這兩半。
當網卡接受到資料包時,通知核心,觸發中斷,所謂的上半部就是,及時讀取資料包到記憶體,防止因為延遲導緻丢失,這是很急迫的工作。
讀到記憶體後,對這些資料的處理不再緊迫,此時核心可以去執行中斷前運作的程式,而對網絡資料包的處理則交給下半部處理。
4 斷請求線/中斷号
中斷對應着一個中斷号,核心通過這個中斷号查找相應的中斷服務程式。
每個中斷都通過一個唯一的數字标志,這樣作業系統才能夠給不同的中斷提供對應的中斷處理程式。
這些中斷值即中斷請求線,例如IRQ 0是時鐘中斷、IRQ 1是鍵盤中斷。對于連接配接在PCI總線上的裝置而言,中斷請求線是動态配置設定的。
5 中斷上下文
中斷服務程式不在程序上下文中執行,而是在一個與所有程序都無關的、專門的中斷上下文中運作,以此保證中斷服務程式能夠在第一時間響應和進行中斷請求,然後快速地退出。
處理器在任何指定時間點上的活動必然屬于以下三種情況之一:
運作于使用者空間,執行使用者程序;
運作于核心空間,處于程序上下文,代表某個特定的程序執行;
(CPU空閑時,核心執行空程序)
運作于核心空間,處于中斷上下文,與任何程序無關,處理某個特定的中斷;
詳細請參考:
Linux:上下文,程序上下文和中斷上下文概念
https://blog.csdn.net/lqy971966/article/details/119103989
參考:
https://www.cnblogs.com/wang_yb/archive/2013/04/19/3030345.html
https://blog.csdn.net/windeal3203/article/details/44588205
https://blog.csdn.net/zhoutaopower/article/details/86506725