ISR 中斷服務例程

2021-08-01 16:31:12 字數 864 閱讀 9084

當硬體裝置的中斷訊號發生後, irql會提公升至相應的dirql級別, 作業系統會呼叫相應的中斷服務例程. 如何在驅動程式中寫中斷處理程式呢?當硬體啟動的時候,會有乙個irp_mn_start_device包傳送給驅動程式, 在這個包中包含中斷資訊, 驅動程式呼叫ioconnectinterrupt()函式將該中斷註冊, 這樣windows核心就可以收到這個中斷,並呼叫驅動中的對應的中斷處理函式.

每乙個硬體中斷都具有乙個dirql, 所有的irql都比軟體的irql高. 自旋鎖的dispatch_level也要在dirql這下, 所以在有硬體中斷參與的情況下,自旋鎖已經起不到同步的作用了.startio, 派遣函式隨時都可能被中斷處理程式打斷. 為了防止這種事情發生, windows提供了kesynchronizeexecution()函式來提公升程式的irql級別.

dpc例程

為什麼需要dpc? 因為dirql的中斷優先順序特別高, 一旦它執行起來了, 其他的軟體級別的**根本得不到機會執行, 一些級別低的硬體中斷也得不到機會執行, 比如滑鼠和鍵盤可能都得不到響應.這種狀態不好.所以我們windows提供給我們一種方法來解決這個問題,即將非常重要的**放在isr裡面執行, 不是特別重要的**轉到dpc裡面去執行, dpc是執行在dispatch_level級別的, 這樣的話,至少鍵盤和滑鼠可以有機會響應了.

要使用dpc例程, 首先要初始化dpc物件,  keinitializedpc()負責這個初始化工作. 在driverentry()或adddevice()進行這個初始化操作。

最後在中斷處理程式裡面呼叫dpc例程:

bool interrupt(interrupt , context) 

iorequestdpc(device, device->currentirp, null);

中斷服務例程 學習

裝置觸發中斷後進入的例程 當進入中斷服務例程後,irql會提公升到裝置對應的irql級別 傳統pc用2片 中斷控制器8259a 晶元級聯 16個中斷訊號源 0 15 多個裝置可以共享乙個中斷號 新的pc使用新的中斷控制器,將中斷訊號擴充套件到24個 windows 將中斷的概念繼續擰擴充套件 32個...

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 ...

zedboard中斷例程學習

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