Linux中斷機制

2021-08-08 08:15:43 字數 1851 閱讀 4334

中斷(interrupt)被定義為乙個事件,該事件改變處理器執行的指令順序,這樣的事件與cpu晶元內外部硬體電路產生的電訊號相對應。中斷通常分為同步(synchronous)中斷和非同步(asynchronous)中斷。

同步中斷指的是當指令執行時由cpu控制單元產生的,之所以稱為同步,是因為只有在一條指令終止執行後cpu才會發出中斷

非同步中斷是由其他硬體裝置依照cpu時鐘訊號隨機產生的。

在intel處理器中,同步中斷被稱為異常,非同步中斷被稱為中斷。

當cpu執行指令時探測到乙個異常,會產生乙個處理器探測異常(processor-detected exception),可以進一步區分,這取決於cpu控制單元產生異常時儲存在核心堆疊eip暫存器的值。

故障(fault),通常可以糾正,一旦糾正,程式就可以重新開始,儲存在eip暫存器中的值是引起故障的指令位址

陷阱(trap)在陷阱指令執行後立即報告,核心把控制權煩給程式後就可以繼續它的執行而不失連續性。儲存在eip中的值是乙個隨後要執行的指令位址陷阱的主要作用是為了除錯程式

異常中止(abort),發生乙個嚴重的錯誤,控制單元出了問題,不能在eip暫存器中儲存引起異常的指令所在的確切位置。異常中止用於報告嚴重的錯誤,例如硬體故障或系統表中無效的值或者不一致的值。這種異常會強制中止程序。

程式設計異常(programmed exception),在程式設計者發出的請求時傳送,是由int或int3指令觸發的。

非遮蔽中斷,有一些危險的事件才能引起非遮蔽中斷,例如硬體故障,非遮蔽中斷總是由cpu辨認。

可遮蔽中斷,i/o裝置發出的所有中斷請求(irq)都產生可遮蔽中斷,乙個遮蔽的中斷只要還是遮蔽的,控制單元就可以忽略它。

idtr 中斷描述符表暫存器,通過idtr找到中斷描述符表。

每個表項有8個位元組組成。裡面有段選擇符和偏移等資訊。

段選擇符呢就要找全域性描述符表(gdt)和區域性描述符表(ldt),gdt和ldt有段的資訊。分別用gdtr和ldtr找到它們。

中斷描述符裡每個表項叫做門描述符,型別分別為任務門、中斷門、陷阱門和系統門

1. 任務們:linux 並沒有採用任務門來進行任務切換。

2. 中斷門:當控制權通過中斷門進入中斷處理程式時,處理器清 if 標誌,即關中斷。避免巢狀中斷的發生。dpl=0

3. 陷阱門:控制權通過陷阱門進入處理程式時 維持 if 標誌位不變,也就是說,不關中斷。dpl=0

4. 系統門:這是 linux 核心特別設定的,用來讓使用者態的程序訪問 intel 的陷阱門,因此,門描述 符的 dpl 為 3。通過系統門來啟用 4 個 linux 異常處理程式,它們的向量是 3、4、5 及 128, 也就是說,在使用者態下,可以使用 int3、into、bound 及 int0x80 四條彙編指令

補充:

任務暫存器tr

tr用於定址乙個特殊的任務狀態段(task state segment,tss)。tss中包含著當前執行任務的重要資訊。

tr暫存器用於存放當前任務tss段的16位段選擇符、32位基位址、16位段長度和描述符屬性值。它引用gdt表中的乙個tss型別的描述符。

指令ltr和str分別用於載入和儲存tr暫存器的段選擇符部分。

當使用ltr指令把選擇符載入進任務暫存器時,tss描述符中的段基位址、段限長度以及描述符屬性會被自動載入到任務暫存器中。當執行任務切換時,處理器會把新任務的tss的段選擇符和段描述符自動載入進任務暫存器tr中。

深入剖析Linux中斷機制 中斷概述

1 中斷概述 1.1 為什麼需要中斷?等到硬體真正完成了請求的操作之後,再回過頭來對它進行處理。想要實現這種功能,輪詢 polling 可能會是一種解決辦法 可以讓核心定期對裝置的狀態進行查詢,然後做出相應的處理。不過這種方法很可能會讓核心做不少無用功,因為無論硬體裝置是正在忙碌著完成任務還是已經大...

LINUX中斷機制與訊號

在學習apue時學習訊號程式設計,很多地方不是理解,便查閱了網路上的相關資料,最常見的一句話就是 訊號是中斷機制的一種模擬 既然提到了中斷,那就首先了解了一下中斷的具體分類以及實現,最後再找出中斷和訊號的區別。l 中 斷 也稱硬體中斷 定義 中斷是由其他硬體裝置依照cpu 時鐘週期訊號隨機產生的。分...

linux軟體中斷 tasklet機制

注意 軟體中斷不是軟中斷。軟體中斷不依賴於底層架構,類似於訊號機制 而軟中斷依賴於底層架構,採用特殊的指令產生,系統呼叫就是採用的軟中斷,arm架構下使用swi指令產生軟中斷。本文只是對tasklet作乙個粗淺的解釋,不對之處敬請指正!本節我們先來說一下為什麼要引入軟體中斷?一般來說,一次中斷服務的...