裝置觸發中斷後進入的例程
當進入中斷服務例程後,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 ...