Vad är uppskjutna proceduranrop?

Ett uppskjuten proceduranrop (DPC) är en avbrottshanteringsmekanism i Microsoft Windows-operativsystemet som drivrutiner kan hänvisa till när vissa processer körs. DPC tillåter att en uppgift aktiveras, men inte körs, från en högt prioriterad interruptbegäranivå (IRQL). Detta tillåter en förare att snabbt behandla en ISR (High-Interrupt Service Service Routine) samtidigt som den skjuter upp körningen av IRQL-koder på lägre nivå. Drivrutiner använder DPC för att schemalägga ingång / utgång (I / O). Drivrutiner är programvara som används av Windows för att kommunicera med hårdvaruenheter.

Överföringar

En enhetsdrivrutin i kärnläge hanterar konventionellt överföringen av en ljud- eller videodataström från eller till en extern enhet. Databehandlingen av enhetsdrivrutinerna är avbrottsdriven. Den externa hårdvaran genererar rutinmässigt avbrott för att begära att enhetsdrivrutinen ska överföra nästa batch av data. En enhetsdrivrutin kan inte behandla data direkt i sin avbrottsrutin. sålunda måste operativsystemet utlösa en återuppringningsrutin, vilket är DPC. Kärnläget eller systemläget och användarläget är driftsätten för din centralbehandlingsenhet. Kärnan kontrollerar alla systembehandlingsaktiviteter.

Schemaläggning

Begreppet ett uppskjuten proceduranrop existerar endast i kärnläge. Operativsystemet håller DPC: erna schemalagda av enhetsdrivrutinerna i en kö. Om ditt system behöver bearbeta avbrott kontrollerar kärnan DPC-kön och kör den första DPC om det inte finns några avbrott och inga DPC-processer körs. DPC är den högst prioriterade tråden i systemet, eftersom DPC-köbehandlingen sker innan avsändaren väljer en tråd och tilldelar detta till CPU: n. DPC har tre prioritetsnivåer: låg, medium och hög.

Processer

Varje DPC är länkad med ett systemdefinierat DPC-objekt. När en förare registrerar en DPCForslr-rutin initialiserar systemet det tidigare definierade DPC-objektet. Om mer än en DPC krävs skapar en drivrutin ytterligare DPC-objekt som kallas CustomDPC-rutiner. DPCForlsr-rutinen hanterar flera processer; den fullbordar I / O-operationen som beskrivs av inmatnings- / utmatningsförfrågan-paketen (IRP), tar bort nästa IRP, ställer in / ut-status i den mottagna IRP och processen för att slutföra begäran.

Rutiner

Normalt har en enhetsdrivrutin som har en avbrottsrutin åtminstone en DPCForIsr- eller CustomDPC-rutin för att slutföra behandlingen av avbrottsdrivna I / O-operationer. Enligt Open Systems Resources, Inc. beror den grundläggande anledningen till att en drivrutin har en enda DPCForlsr-rutin, en uppsättning CustomDPC-rutiner eller båda beror på arten av dess underliggande enhet och uppsättningen av I / O-förfrågningar den måste stödja. En förares ISR måste ringa IoRequestDPC för avbrottsdrivna I / O-operationer med DPCForlsr-rutiner. Omvänt, för överlappande operationer, avbrottsdrivna I / O-operationer som använder CustomDPC-rutiner, måste ISR ringa KeInsertQueueDPC.