linux中什么是中斷

linux中,中斷是硬件在需要的時候向CPU發出信號,CPU暫時停止正在進行的工作,來處理硬件請求的一種機制。當硬件忙碌的時候,CPU很可能會做許多無用功(每次輪詢都是跳過不處理);所以為了提高CPU和外圍硬件(硬盤,鍵盤,鼠標等等)之間協同工作的性能,引入了中斷的機制。

linux中什么是中斷

本教程操作環境:linux7.3系統、Dell G3電腦。

1、中斷 定義

中斷是硬件在需要的時候向CPU發出信號,CPU暫時停止正在進行的工作,來處理硬件請求的一種機制。

具體說:
中斷是指在CPU正常運行期間,由于內外部事件或由程序預先安排的事件引起的CPU暫時停止正在運行的程序,轉而為該內部或外部事件或預先安排的事件服務的程序中去,服務完畢后再返回去繼續運行被暫時中斷的程序。

1.1 背景(為什么需要中斷)

1.沒有中斷的話,CPU和外圍設備之間協同工作/通信可能只有輪詢這個方法:CPU定期檢查硬件狀態,需要處理時就處理,否則就跳過。
2.處理器的速度跟外圍的硬件設備不在一個數量級上,因此提供一種機制讓硬件在需要的時候向內核發出信號。

輪詢的缺點/引入中斷機制:
當硬件忙碌的時候,CPU很可能會做許多無用功(每次輪詢都是跳過不處理)。
所以,為了提高CPU和外圍硬件(硬盤,鍵盤,鼠標等等)之間協同工作的性能,引入了中斷的機制。

1.2 中斷和信號

中斷: 硬件/進程發,內核收 信號:內核發,進程收,或者進程發進程收

1.3 中斷處理過程(參考CSAPP書籍)

中斷是異步發生的,是來自處理器外部的I/O設備的信號的結果  1. 硬件中斷不是由任何一條專門的指令造成的,從這個意義上來說它是異步的 2. 硬件中斷的異常處理程序常常被稱為中斷處理程序(interrupt handler)

下圖概述了一個中斷的處理。
圖8.5
linux中什么是中斷

I/O設備,例如絡適配器、磁盤控制器和定時器芯片,通過向處理器芯片上的一個管腳發信號,并將異常號放到系統總線上,來觸發中斷,這個異常號標識了引起中斷的設備。
在當前指令完成執行之前,處理器注意到中斷管腳的電壓變高了,就從系統總線讀取異常號,然后調用適當的中斷處理程序。當處理程序返回時,它就將控制返回給下一條指令(也就是,如果沒有發生中斷,在控制流中會在當前指令之后的那條指令)。結果是程序繼續執行,就好像沒有發生過中斷一樣。

剩下的異常類型(陷阱、故障和終止)是同步發生的,是執行當前指令的結果 我們把這類指令叫做故障指令(faulting instruction)

1.4 中斷本質及處理機制/流程

中斷本質是一種特殊的電信號

linux中什么是中斷

處理過程:
中斷由硬件設備生成,并直接送入中斷控制器(簡單的電子芯片)的輸入引腳中,中斷控制器采用復用技術將多路中斷管線只通過一個和處理器相連接的管線與處理器通信。處理器一經檢測到此信號,便中斷自己的當前工作轉而處理中斷。硬件設備生成中斷的時候并不考慮與處理器的時鐘同步,即中斷隨時可以產生,因此內核隨時可能因為新到來的中斷而被打斷。

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視頻教程

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享