中斷服務例程 學習

2021-06-18 11:22:32 字數 1814 閱讀 5701

裝置觸發中斷後進入的例程

當進入中斷服務例程後,irql會提公升到裝置對應的irql級別

傳統pc用2片 中斷控制器8259a 晶元級聯-》16個中斷訊號源 0-15  多個裝置可以共享乙個中斷號

新的pc使用新的中斷控制器,將中斷訊號擴充套件到24個

windows 將中斷的概念繼續擰擴充套件   32個中斷級別 irql

0-2 級別 passive_level 到  dispatch_level 軟中斷

3-31 硬體中斷  

0-31 級別逐次公升高

一般執行緒在0 界別,負責排程執行緒的核心**執行再1 級別

ddk把硬體中斷稱為 dirql

中斷服務例程 isr

發生硬體裝置的中斷訊號後,dirql級別下,系統呼叫相應的isr

驅動程式使用isr 

1)首先 獲得 中斷物件  (interrupt的資料結構) ddk驅動和 wdm驅動不同  以後學習

2)ioconnectinterrupt 將中斷物件和isr 聯絡起來,這樣中斷訊號來臨時就會進入 isr處理

isr執行再dirql級別

為了不讓isr打斷執行,秩序將irql提公升至相應的dirql即可

與isr 函式同步的函式

boolean 

kesynchronizeexecution( //synchronize 是同步的意思

in pkinterrupt interrupt, //中斷指標 isr與這個物件關聯著

in pksynchronize_routine synchronizeroutine, //將當前irql提公升至 中斷物件相應的dirql,並執行這個例程

in pvoid synchronizecontext //上面這個例程的引數

);

當執行到這個函式時,isr不會打斷  它  提供的例程,需要將同步**放入 它提供的例程

dpc例程

和 中斷 服務例程配合使用

中斷服務例程處於很高的irql,會打斷正常執行的執行緒

dpc例程執行再相對較低的  dispatch_level級別,

因此一般將不緊急處理的**放在dpc例程中,

緊急的**放在中斷服務例程中

延遲過程呼叫例程dpc

執行再1 上級別,除了isr 其他例程不會打斷

一般  isr執行時間不宜長

isr**盡量少

不重要的響應**   從isr -》dpc例程中

dpcforisr

使用dpc例程

1)初始化dpc物件   keinitializedpc  (一般在driverentry  +  adddevice 中初始化)

keinitializedpc(&dpx->dpc, dpcforisr,(pvoid)context);

void 

keinitializedpc(

in prkdpc dpc, //需要初始化的dpc物件指標

in pkdeferred_routine deferredroutine, //dpc關聯的dpc例程

in pvoid deferredcontext //傳入dpc例程的引數

);

isr中執行簡單的處理,不重要的放入dpc例程

ISR 中斷服務例程

當硬體裝置的中斷訊號發生後,irql會提公升至相應的dirql級別,作業系統會呼叫相應的中斷服務例程.如何在驅動程式中寫中斷處理程式呢?當硬體啟動的時候,會有乙個irp mn start device包傳送給驅動程式,在這個包中包含中斷資訊,驅動程式呼叫ioconnectinterrupt 函式將該...

zedboard中斷例程學習

參考資料ug1165 ug585 1 通過ug1165實現如下例子 2 文件ug585中關於arm9的中斷描述 理解為 cpu通過gic管理中斷,中斷來自3類 軟體中斷sgi 私有外設中斷ppi 共享外設中斷spi.各個cpu分別支援16 5 60個sgi ppi spi.gic承上啟下的管理中斷。...

DOS中斷例程應用

程式設計 在螢幕的5行12列顯示字串 wlcome to masm assume cs code data segment db welcome to masm data ends code segment start mov ah,2 呼叫第10號中斷例程的2號子程式,功能為設定游標位置 mov ...