Co je IRQL (úroveň požadavku na přerušení) ve Windows a jak souvisí s BSOD?

Poslední aktualizace: 01/10/2025
Autor: Isaac
  • IRQL definuje priority provádění a maskuje přerušení podle úrovně, nad úrovní DISPATCH ovládá IRQL, nikoli prioritu vlákna.
  • L BSOD Chyby 0xA/0xD1 jsou obvykle způsobeny přístupy ke stránkovatelné nebo neplatné paměti při vysokém IRQL a nesprávnými adresami nebo stránkovatelným kódem.
  • Klíčové jsou WinDbg a Driver Verifier: použijte !analyze, !irql, ln, .trap, !pool, !address a prozkoumejte parametry 1, 3 a 4.
  • En ovladače, zabraňuje chybám stránky při vysokém IRQL, používá nestránkovanou paměť a spin locky; pro uživatele aktualizuje/izoluje problematické ovladače.

irq

Pokud jste někdy viděli modrou obrazovku se zprávami jako IRQL_NOT_LESS_OR_EQUAL DRIVER_IRQL_NOT_LESS_OR_EQUAL, pravděpodobně jste se setkali s konceptem, který je mimo svět ovladačů málo známý: IRQL (úroveň požadavku na přerušení). WindowsTato úroveň priority přerušení má přednost před prioritou vláken, když systém překročí určitou prahovou hodnotu, a to má přímé důsledky pro stabilitu.

V následujících řádcích najdete una kompletní průvodce a ve španělštině ze Španělska o tom, co je IRQL a jak funguje, proč se zobrazují modré obrazovky, jak diagnostikovat problém s WinDbg a co dělat, ať už jste uživatel, který se s chybou setkává, nebo vyvíjíte ovladače v režimu jádra. Pojďme se pustit do práce.

Co je IRQL (úroveň požadavku na přerušení) ve Windows?

Ve Windows, IRQL definuje prioritu technické vybavení na kterém procesor pracuje kdykoli. V rámci modelu ovladačů Windows (WDM) může být kód běžící s nízkým IRQL přerušen kódem běžícím s vyšším IRQL. Ve skutečnosti může být na jednom vícejádrovém počítači každý procesor na jiném IRQL, což komplikuje synchronizaci.

Existuje jedno klíčové pravidlo: Pokud CPU běží na IRQL nad úrovní PASSIVE_LEVEL, může být zablokováno pouze aktivitou na ještě vyšší IRQL.Toto organizuje koexistenci mezi uživatelským kódem, funkcemi jádra, odloženými volajícími (DPC) a rutinami obsluhy přerušení zařízení (ISR).

Chyba 0x0000000A
Související článek:
Chyba 0x0000000a (modrá obrazovka smrti). 6 Řešení

Úrovně a priority: PASSIVE_LEVEL, APC_LEVEL, DISPATCH_LEVEL a DIRQL

Obecně platí, Na x86 se používají hodnoty IRQL mezi 0 a 31; na x64 mezi 0 a 15.Praktický význam je stejný: IRQL 0 (PASSIVE_LEVEL) je místo, kde se provádí běžný uživatelský kód a mnoho funkcí ovladače; APC a chyby stránky Obvykle jsou mapovány na IRQL 1 (APC_LEVEL); IRQL 2 (DISPATCH_LEVEL) zahrnuje plánovač vláken a DPC. Nad DISPATCH_LEVEL jsou úrovně vyhrazené pro přerušení zařízení (známé jako DIRQL) a další interní použití, jako například HIGH_LEVEL.

V ekosystému řidičů, Mnoho běžných rutin běží na úrovni DISPATCH_LEVEL.například DPC a StartIo. Tato konstrukce zajišťuje, že zatímco jedna z nich se dotýká interních front nebo jiných sdílených zdrojů, jiná rutina na stejné úrovni ji na daném CPU nepřepne, protože pravidlo preempce povoluje přerušení pouze na vyšších úrovních.

Mezi úrovní DISPATCH_LEVEL a profilováním/vysokými úrovněmi je prostor pro hardwarová přerušení každého zařízení (DIRQL)Hodnota IRQL zařízení definuje jeho prioritu oproti ostatním zařízením. Ovladač WDM získá toto IRQL během IRP_MJ_PNP s IRP_MN_START_DEVICE. Toto IRQL zařízení není globální, pevná hodnota, ale spíše hodnota spojená s konkrétní linkou přerušení.

IRQL vs. priorita vlákna

Je vhodné nezaměňovat pojmy: Priorita vlákna určuje, kdy plánovač předběžně provede a které vlákno se spustí.; IRQL řídí, jaký typ aktivity lze provést a která přerušení jsou maskována. Nad úrovní DISPATCH_LEVEL nedochází k přepínání vláken: řídí ho IRQL, nikoli priorita vláken.

  Valve Fremont: Uniklé specifikace a klíčové indicie

IRQL a stránkování: Co byste neměli dělat

Okamžitým důsledkem zvýšení IRQL je, že systém nelze zpracovat chyby stránkyZlaté pravidlo: kód běžící na úrovni DISPATCH_LEVEL nebo vyšší nemůže způsobit chyby stránky. V praxi to znamená, že tyto rutiny a data, kterých se dotýkají musí se nacházet v nestránkované pamětiKromě toho některé pomocné programy jádra omezují své použití na základě IRQL: například KeWaitForSingleObject Funkce DISPATCH_LEVEL může být volána pouze v případě, že neblokujete (nulový časový limit), a pro nenulové časové limity musíte být pod úrovní DISPATCH_LEVEL.

Implicitní a explicitní kontrola IRQL

Většinou, Systém sám vyvolá vaše rutiny při správném IRQL co by měly dělat. Dispatch rutiny pro IRP běží na PASSIVE_LEVEL (mohou blokovat nebo volat libovolného pomocníka), StartIo a DPC běží na DISPATCH_LEVEL pro ochranu sdílených front a ISR běží na DIRQL.

Pokud to potřebujete explicitně ovládat, IRQL můžete zvýšit a snížit pomocí KeRaiseIrql y KeLowerIrqlExistuje velmi používaná zkratka: KeRaiseIrqlToDpcLevel() vrátí předchozí IRQL a ponechá vás na úrovni DISPATCH_LEVEL. Důležité: Nikdy nesnižujte IRQL pod hodnotu, na které byl v okamžiku, kdy vás systém volal; narušení této synchronizace může otevřít velmi vážná okna souboje.

Chyby modré obrazovky související s IRQL: IRQL_NOT_LESS_OR_EQUAL a DRIVER_IRQL_NOT_LESS_OR_EQUAL

IRQL

Dvě klasické kontroly chyb spojené s těmito problémy jsou IRQL_NOT_LESS_OR_EQUAL (0xA) y DRIVER_IRQL_NOT_LESS_OR_EQUAL (0xD1)Oba hlásí pokus o přístup k stránkovatelné (nebo neplatné) adrese s příliš vysokým IRQL. To je obvykle způsobeno ovladači používajícími nesprávné adresy, dereferencováním chybných ukazatelů nebo spouštěním stránkovatelného kódu na nevhodných úrovních.

V konkrétním případě DRIVER_IRQL_NOT_LESS_OR_EQUAL (0x000000D1), parametry jsou velmi informativní: 1) adresa odkazované paměti; 2) IRQL v daném okamžiku; 3) typ přístupu (0 čtení, 1 zápis, 2/8 provedení); 4) adresa instrukce, která odkazovala na paměť. S debuggerem můžete použít ln na parametru 4 pro vypsat nejbližší symbol a zjistit, jaká funkce běžela.

Časté příčiny, které je třeba mít na paměti

Kromě specifického kódu existují i ​​opakující se vzory. Dereferencování neplatného ukazatele na úroveň DISPATCH_LEVEL nebo vyšší To je jistý recept na katastrofu. Přístup ke stránkovatelným datům na této úrovni nebo spuštění stránkovatelného kódu (např. funkce označené jako stránkovatelná) také spustí kontrolu chyb.

Mezi další běžné případy patří volání funkce v jiném ovladači, který již byl stažen (visící ukazatel funkce) nebo nepřímo vyvolaný prostřednictvím neplatného ukazatele funkce. Pokud je systém schopen modul identifikovat, často se jeho název zobrazí na modré obrazovce a je také uložen v KiBugCheckDriver, přístupný s dx KiBugCheckDriver z WinDbg.

Praktický detail: Ve většině D1/A není skutečným problémem samotné IRQL., ale spíše odkazovaná paměťová adresa. Proto jsou parametry 1, 3 a 4 klíčové pro zaměření diagnózy.

Diagnostika pomocí WinDbg: Užitečné příkazy a čtení parametrů

Abychom mohli na těchto případech pracovat, WinDbg je klíčový nástroja pokud BSOD zmiňuje ntoskrnl.exe Tyto informace poskytují mnoho vodítek k určení, zda je chyba v subsystému jádra. Začněte tím, že !analyze -v abyste získali shrnutí kontroly chyb, zásobník a, pokud budete mít štěstí, i příslušný modul. Pokud výpis obsahuje rámec pro zachycení, .trap vás uvede do kontextu selhání CPU.

L příkazy hromady jako k, kb, kc, kd, kp, kP, kv Ukazují vám různé úrovně detailů zpětného trasování. S ln u parametru 4 můžete přeskočit k instrukci, která odkazovala na paměť a získat blízký symbol. A pokud máte podezření, že úroveň priority běží před přerušením, !irql zobrazuje uložené IRQL pro cílový procesor (např. DISPATCH_LEVEL).

  Jak ovládat obrazovku Androidu pomocí SCRCPY ve Windows

Pro analýzu směru parametru 1, !pool Řekne vám, zda patří do stránkovaného fondu; !address y !pte ponořte se do mapování paměti v dané oblasti. Můžete použít příkazy pro zobrazení paměti prozkoumat obsah, ke kterému se pokoušeli získat přístup. Nakonec, u, ub, uu umožňují rozebrat kolem adresy parametru 4.

Nezapomeňte lm t n zobrazit seznam načtených modulů y !memusage pro obecný stav paměti. Pokud KiBugCheckDriver má něco, dx KiBugCheckDriver Vrátí název modulu Unicode: v typickém příkladu byl během kontroly chyb jako ovladač použitý k nalezení souboru „Wdf01000.sys“.

Systémové nástroje: Ověřovač ovladačů, Prohlížeč událostí a Diagnostika

El Ověřovač ovladačů Zkoumá chování ovladačů v reálném čase a vynucuje chyby, když detekuje nesprávné využití zdrojů (například fondu), čímž vyvolá výjimku pro izolaci problematické oblasti kódu. Spouští se pomocí verifier z příkazový řádek a je vhodné vybrat co nejmenší sadu ovladačů, aby se zabránilo přílišnému přidávání režijních nákladů.

Pokud se s WinDbg nevidíte, uplatnit základní opatřeníZkontrolujte v Prohlížeči událostí systémový protokol, zda neobsahuje chyby odkazující na konkrétní zařízení/ovladač; aktualizujte nebo deaktivujte ovladač uvedený v modré obrazovce; ověřte kompatibilitu hardwaru s vaší verzí systému Windows; a pokud máte podezření na paměť RAM, použijte Diagnostiku paměti systému Windows. Tyto akce, ačkoli jsou jednoduché, řeší velké množství případů.

Případy z reálného života: Když se BSOD zdají být náhodné

Uživatel s Windows 10 Pro (procesor AMD Ryzen 5 3400G, GPU NVIDIA GeForce GTX 1660 Ti a základní deska Gigabyte B450 AORUS PRO s Wi-Fi, 16 GB RAM) se občas objevovaly chyby „IRQL_LESS_OR_NOT_EQUAL“. Již jsem aktualizoval základní ovladače (síť, grafika), nainstaloval všechny aktualizace systému Windows a spustil nástroj pro paměť, to vše bez zjištění jakýchkoli problémů.

V takových scénářích, Dalším krokem je analýza výpisů pomocí WinDbg. a hledejte vzorce: procesy, které se odehrávají při jeho pádu (například explorer.exe), moduly grafického rozhraní (win32kfull.sys) a funkce jako například xxxProcessNotifyWinEvent objevující se v zásobníku. Přestože se jedná o modul pro Windows, spouštěčem je často ovladač třetí strany (grafika, vstupní, překryvná, digitalizační karty), který používá paměť s nevhodnou hodnotou IRQL a chyba vzniká uvnitř win32k.

Praktické doporučení zde zní dočasně deaktivovat software pro překrytí (zachycení, OSD GPU), agresivní ovladače softwarových periferií (myši/klávesnice s makry) a beta verze grafických ovladačů a zúžit jeho okruh. Použití nástroje Driver Verifier u podezřelých může pomoci zúžit problém s přehlednějším výběrem.

Velmi častý síťový vzorec: ndis.sys není vždy viníkem

Další typický případ: snímek obrazovky s ndis.sys (síťová vrstva Windows). Na reálném počítači by systém havaroval okamžitě po spuštění. Praktickým řešením bylo spustit systém Nouzový režim bez síťových funkcí otevřete Správce zařízení a v části „Síťové adaptéry“ zakažte adaptéry, abyste problém izolovali.

V tom týmu byl Řadič Realtek PCIe GBE Family a grafická karta Atheros AR5007GDeaktivací obou bylo zjištěno, že skutečnou příčinou byla athrx.sys (Atheros), ačkoli se na modré obrazovce zmínilo ndis.sysVýpis to potvrdil: zásobník prošel ndis!NdisFreeTimerObject ale vinným modulem byl athrx.sysPoslední korekce byla odinstalujte zařízení a nainstalujte aktualizované oficiální ovladače Z webových stránek výrobce Atheros. Ponaučení: Modul uvedený v BSOD může být součástí postiženého subsystému, nikoli jeho zdrojem.

  Jak krok za krokem nainstalovat Arduino IDE na Windows 11

Typická odpověď podpory a rychlé kroky pro uživatele

Během upřímné výměny podpory technik odpověděl: „Omlouvám se za nepříjemnosti. Může se jednat o problém s ovladačem, pamětí nebo antivirem. Aktualizujte prosím ovladače a pokud problém přetrvává, spusťte diagnostiku paměti.“Toto je základní, ale platná rada; pokud však chyby přetrvávají, je vhodné pokračovat s verifikací a analýzou výpisu.

Pro netechnické uživatele by byl rozumný protokol: 1) Zkontrolujte systémové události, 2) Aktualizujte klíčové ovladače (čipová sada/síť/grafika), 3) Zkontrolujte RAM s integrovaným nástrojem, 4) otestujte bota vyčistit bez softwaru třetích stran, který vkládá hooky do jádra/GUI, a 5) použít Verifier na ovladačích třetích stran, pokud nic není jasné.

Nejlepší postupy pro vývojáře ovladačů

Pokud vyvíjíte a narazíte na D1/A, zkontrolujte, zda spuštěná rutina není označena jako stránkovatelná Nevolejte stránkovatelné funkce, pokud jsou spuštěny na úrovni DISPATCH_LEVEL nebo vyšší. To zahrnuje vyhýbání se odkazům na data ve stránkovaných sekcích a respektování omezení IRQL pro pomocné programy jádra popsaných v DDK.

Chcete-li synchronizovat sdílená data, použijte pravidlo „vždy přistupovat ke sdíleným datům se stejnou vysokou hodnotou IRQL“ a v případě potřeby používejte spin locky. U multiprocesorů samotné IRQL nezaručuje vyloučení mezi různými CPU; spin locky zvyšují IRQL (na úroveň DISPATCH_LEVEL) a koordinují přístup mezi jádry. Pokud potřebujete pracovat s citlivými hardwarovými registry, KeSynchronizeExecution pomáhá spustit kritické sekce na správné DIRQL.

Pokud plán vyžaduje zvýšení IRQL, Spojené státy americké KeRaiseIrqlToDpcLevel pro DISPATCH_LEVEL nebo KeRaiseIrql opatrně, uložení předchozího IRQL a jeho obnovení přesně s KeLowerIrqlKlesněte pod vstupní IRQL, byť jen na okamžik, Je to vážná chyba synchronizace.

Vztah k přerušením a hardwaru

IRQL je mechanismus, kterým systém Windows příkazy narušují priority a určité interní úkolyNa architektonické úrovni souvisí s koncepty jako „Přerušení“, „Obsluha přerušení“ nebo „Úroveň priority přerušení“ a na klasických platformách s… Programovatelný řadič přerušení (PIC)V jiných systémech je řízení priorit vyjádřeno mechanismy, jako je spl en Unix; obecná myšlenka je stejná: kdo může koho vyrušit.

Tipy pro pokročilé ladění

V dumpech, kde zásobník ukazuje na win32kfull!xxxProcessNotifyWinEvent s kontrolou chyb 0xA/0xD1, zkontrolujte kontext pomocí .process y .thread (pokud je k dispozici), podívejte se na procesy jako explorer.exe en !process 0 1 a zkontrolujte překryvy a ovladače interakce s grafickým uživatelským rozhraním. Problém je často Je to paměť poškozená třetí stranou, která se na této trase objeví..

Nezapomeňte zkontrolovat IRQL pomocí !irqla kontrast: Pokud jste na úrovni DISPATCH_LEVEL (2) a parametr 3 indikuje čtení/zápis/spuštění Na stránkovatelné stránce už máte indicii, proč se stránka ztratila. Tuto indicii proškrtněte ln v parametru 4 pro získání specifické funkce.

Rozumět Co je to IRQL? a jak to zapadá do běhu jádra, pomáhá oddělit šum od signálů. Pokud jste uživatel, zaměřte se na ovladače a hardware (s Verifierem, událostmi a testy ve výchozím nastavení). Pokud vyvíjíte, striktně dodržujte pravidla pro IRQL, nestránkovanou paměť a synchronizaci se spin locky. Se správnými nástroji (WinDbg, Verifier) ​​a pečlivým čtením parametrů (1, 3 a 4), Tyto kontroly chyb již nejsou záhadou. a stávají se problémy, které lze metodicky řešit.