中斷處理 步驟

2021-07-11 05:13:39 字數 1109 閱讀 6484

一.硬體處理

我們在每條指令完成的時候,控制單元就會檢查是否發生了中斷。若不發生:繼續執行下一條指令;若發生:進行下面的硬體處理:

1.確定中斷的向量i。

2.讀idt中的第i項得到向量i的中斷描述符。

3.中斷描述符結合gdt得到得到中斷處理程式的段描述符。

4.程序的cpl與段描述符的dpl比較,若cpl優先順序比dpl的優先順序高,說明中斷的優先順序比程序優先順序低,產生異常。程序的cpl與中斷描述符的dpl比較,若cpl優先順序

比dpl的優先順序低,說明這個門不是使用者程序可以訪問的,也產生異常,正常則執行下面步驟。

5.檢查cpl是否發生變化(這個其實就是是否是從使用者態進入核心態),如果變化,則要切換棧。這個很容易弄清,因為,使用者態和核心態用的棧是不一樣的。

6.如果發生的是故障,故障要重新執行導致異常的那條指令。所以用那條指令的位址裝載cs和eip來執行那條指令。

7.將eflags、cs、和eip的值圧棧。

8.如果異常產生硬體出錯碼,則也圧棧。

9.用剛才得到的段描述符中的基址和中段描述符中的偏移位址裝載cs和eip。這個就可以開始執行相應的處理程式了。

然後進入了中斷處理程式,針對中斷和異常的處理流程是不同的,下面分開講述

二.異常處理

1.儲存暫存器的值

2.高階c函式處理異常

3.通過ret_from_exception()函式從異常處理程式退出

三.中斷處理

1.在核心棧中儲存irq和暫存器的值

2.給為irq服務的pic傳送乙個應答,並允許pic進一步發出中斷

3.執行共享這個irq的所有裝置的中斷服務例程

4.調到ret_from_intr()的位址從中斷處理程式退出

四.軟中斷處理

1.通常在硬體中斷中將可延遲的處理函式加到專門的資料結構中

2.在合適的時機,呼叫這些函式

五.中斷的退出

1.考慮返回到核心控制路徑還是使用者態

2.考慮允許搶占來進行排程

3.是否要處理掛起訊號等

Linux中斷和中斷處理

眾所周知,處理器的速度跟外圍的硬體裝置的速度往往不在乙個數量級上,因此,如果核心採取讓處理器傳送乙個請求,然後專門等待回應的辦法,顯然差強人意。既然硬體處理的這麼慢,那麼核心就應該在這期間去處理其他事務,等待硬體真正完成了請求的操作後,再回過頭來對它進行處理。輪詢 polling 可能會是一種解決辦...

Linux中斷處理之共享中斷處理初探

在看lkd 第二版 第六章 中斷和中斷處理程式 的時候,剛開始接觸到中斷線號和共享中斷線的時候半天愣是沒有想明白,原來理解的中斷和中斷和中斷處理程式就是通過中斷線號來進行關聯,硬體發生中斷,然後通過中斷線號查詢對應的中斷處理程式,最後中斷處理程式返回,此次中斷則處理完畢,沒想到冒出來個共享中斷線,呵...

中斷處理介紹

當某一中斷源需要cpu為其進行中斷服務時,就輸出中斷請求訊號,使中斷控制系統的中斷請求觸發器置位,向cpu請求中斷。系統要求中斷請求訊號一直保持到cpu對其進行中斷響應為止。cpu對系統內部中斷源提出的中斷請求必須響應,而且自動取得中斷服務子程式的入口位址,執行中斷 服務子程式。對於外部中斷,cpu...