DPC和ISR的理解

風靈使發表於2018-09-04

首先來說中斷

計算機的中斷分為軟中斷和硬中斷,即IRQLDIRQL,共32個級別,從0~31級別依次提升,0~2屬於軟中斷
這裡寫圖片描述
一般執行緒執行於PASSIVE_LEVEL級別,如果不想在執行時切換到其他執行緒,可以將中端級別提升致DISPATCH_LEVEL,但執行緒在這個中端級別下執行無法使用分頁記憶體,因為無法觸發分頁中斷。可能有些記憶體地址訪問不了,藍屏。

當硬體的中斷訊號發給CPU之後,CPU會把IRQL級別提升致DIRQL,作業系統開始執行ISR(中斷服務例程)。流程大概是這個樣子
這裡寫圖片描述

但是如果ISR的程式碼過於複雜,我理解的是首先會影響系統的正常執行,PASSIVE_LEVEL級別的程式碼根本不會執行。其次影響其他硬體中斷的響應。所以這時引入了DPC執行例程。ISR會把一些不重要的程式碼,放入DPC佇列,當執行程式從DIRQL降到DISPATCH_LEVEL時,會自動執行DPC佇列裡面的程式碼。


ISR:Interrupt Service Routines (中斷服務例程

必須馬上做的事情,比如硬體中斷,響應滑鼠點選

DPC:Deferred Procedure Call Details(延遲過程呼叫

可以推遲做的事情,比如大資料拷貝,U盤拷貝電影。

APC: Asynchronous Procedure Calls(非同步過程呼叫

An asynchronous procedure call (APC) is a function that executes asynchronously in the context of a particular thread. When an APC is queued to a thread, the system issues a software interrupt. The next time the thread is scheduled, it will run the APC function. An APC generated by the system is called a kernel-mode APC. An APC generated by an application is called a user-mode APC. A thread must be in an alertable state to run a user-mode APC.

Windows中斷請求級別

IRQL Interrupts Masked Off Driver Routines
PASSIVE_LEVEL None PASSIVE_LEVEL
APC_LEVEL APC_LEVEL interrupts APC_LEVEL
DISPATCH_LEVEL DISPATCH_LEVEL ,APC_LEVEL interrupts DISPATCH_LEVEL
DIRQL All interrupts at IRQL<= DIRQL DIRQL

相關文章