Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Ovladače fyzických zařízení, která generují přerušení, musí mít alespoň jednu rutinu služby přerušení (ISR). ISR musí udělat, co je vhodné pro zařízení, aby odstranilo přerušení, případně včetně zastavení zařízení, aby nepřerušovalo. Pak by měl provést pouze to, co je nezbytné k uložení stavu, a zařadit DPC do fronty, aby se I/O operace dokončila s nižší prioritou (IRQL) než tou, při které se ISR provádí.
ISR ovladače se spouští v kontextu přerušení na systémem přiřazené určité úrovni DIRQL, jak je specifikováno parametrem SynchronizeIrql pro IoConnectInterruptEx.
IsRs jsou přerušitelné. Kdykoli může jiný přístroj s vyšším systémem přiřazeným DIRQL přerušit činnost, nebo může dojít k přerušení systému s vysokým IRQL.
Než systém zavolá ISR, získá spinový zámek přerušení, takže ISR nemůže být současně spuštěn na jiných procesorech. Po návratu ISR systém uvolní zámek otáčení.
Vzhledem k tomu, že ISR běží na relativně vysoké úrovni IRQL, která maskuje přerušení s ekvivalentním nebo nižším irQL na aktuálním procesoru, měl by vrátit kontrolu co nejrychleji. Kromě toho spuštění ISR v DIRQL omezuje sadu rutin podpory, které může ISR volat. Další informace naleznete v tématu Správa priorit hardwaru.
IsR obvykle provádí následující obecné kroky:
Pokud zařízení, které způsobilo přerušení, není podporováno isR, isR okamžitě vrátí HODNOTU FALSE.
V opačném případě ISR v případě potřeby vymaže přerušení, uloží nezbytný kontext zařízení a zařadí DPC do fronty pro dokončení vstupně-výstupní operace na nižší úrovni IRQL. Další informace najdete v tématu Objekty DPC a DPCs. ISR pak musí vrátit PRAVDA.
Konkrétně v ovladačích, které nepřekrývají vstupně-výstupní operace zařízení, by měl ISR provést následující:
Určete, zda je přerušení nechtěné. Pokud ano, okamžitě vraťte hodnotu FALSE, aby se ISR zařízení, které přerušilo, zavolalo bez prodlení. V opačném případě pokračujte ve zpracování přerušení.
Pokud je to nutné, zabraňte zařízení ve vyrušování.
Shromážděte jakékoli kontextové informace, které rutina DpcForIsr (nebo CustomDpc) bude pro aktuální operaci potřebovat dokončit vstupně-výstupní zpracování.
Uložte tento kontext do oblasti přístupné rutině DpcForIsr nebo CustomDpc , obvykle v rozšíření zařízení objektu cílového zařízení, pro které zpracování aktuálního V/V požadavku způsobil přerušení.
Pokud se ovladač překrývá s operacemi vstupně-výstupními, musí informace o kontextu obsahovat počet nevyřízených požadavků, které musí rutina DPC dokončit, spolu s veškerým kontextem, který rutina DPC potřebuje k dokončení každého požadavku. Pokud je isR volána ke zpracování dalšího přerušení před spuštěním DPC, nesmí přepsat uložený kontext pro požadavek, který ještě nebyl dokončen DPC.
Pokud má ovladač rutinu DpcForIsr , zavolejte IoRequestDpc s ukazateli na aktuální IRP, objekt cílového zařízení a uložený kontext. IoRequestDpc zařadí rutinu DpcForIsr do front, jakmile irQL klesne pod DISPATCH_LEVEL na procesoru.
Pokud má ovladač rutinu CustomDpc , zavolejte KeInsertQueueDpc s ukazatelem na objekt DPC (přidružený k rutině CustomDpc ) a ukazatele na jakýkoli uložený kontext, customDpc rutina bude muset dokončit operaci. ISR obvykle předává ukazatele také na aktuální IRP a objekt cílového zařízení. Rutina CustomDpc se spustí, jakmile irQL klesne pod DISPATCH_LEVEL na procesoru.
Vrátí hodnotu TRUE , která označuje, že jeho zařízení vygenerovalo přerušení.
Obecně platí, že ISR neprovádí skutečné zpracování vstupně-výstupních operací, aby uspokojilo IRP. Místo toho zastaví zařízení, aby nepřerušovalo, nastaví potřebné informace o stavu a přidá do fronty ovladače DpcForIsr nebo CustomDpc, aby provedlo jakékoli I/O zpracování potřebné pro splnění aktuální žádosti, která způsobila přerušení zařízení.
ISR musí běžet na DIRQL po co nejkratší možnou dobu. Podle tohoto návodu zvýšíte propustnost vstupně-výstupních operací pro každé zařízení v počítači, protože spuštění v DIRQL maskuje všechna přerušení, ke kterým systém přiřadil menší nebo rovnou hodnotu IRQL.
SynchronizeIrql přerušovacích objektů ovladače, specifikovaných při volání IoConnectInterrupt, určuje DIRQL, na kterém se provádí ISR ovladače. Další informace najdete v tématu Synchronizace přístupu k datům zařízení.