Mikä on IRQL (Interrupt Request Level) Windowsissa ja miten se liittyy BSOD-virheisiin?

Viimeisin päivitys: 01/10/2025
Kirjoittaja: Isaac
  • IRQL define prioridades de ejecución y enmascara interrupciones por nivel, por encima de DISPATCH manda el IRQL, no la prioridad de hilos.
  • Los BSOD 0xA/0xD1 suelen deberse a accesos a memoria paginable o inválida a IRQL alto y a direcciones o código paginable incorrectos.
  • WinDbg y Driver Verifier son claves: usa !analyze, !irql, ln, .trap, !pool, !address y examina parámetros 1, 3 y 4.
  • En kuljettajat, evita page faults a IRQL alto, usa memoria no paginada y spin locks; en usuario, actualiza/aisla drivers problemáticos.

irq

Jos olet joskus nähnyt sinisen ruudun, jossa on viestejä, kuten IRQL_NOT_LESS_OR_EQUAL o DRIVER_IRQL_NOT_LESS_OR_EQUAL, seguramente te habrás topado con un concepto poco conocido fuera del mundo de los drivers: el IRQL (Interrupt Request Level). En Windows, tämä keskeytysprioriteettitaso on etusijalla säikeiden prioriteettiin nähden, kun järjestelmä on tietyn kynnyksen yläpuolella, ja tällä on suoria seurauksia järjestelmän vakauteen.

Seuraavilla riveillä löydät u täydellinen opas ja espanjaksi Espanjasta siitä, mitä IRQL on ja miten se toimii, miksi se laukaisee sinisiä näyttöjä, miten WinDbg-ongelma diagnosoidaan ja mitä tehdä, olitpa sitten käyttäjä, joka kohtaa virheen, tai kehität ydintilan ajureita. Aloitetaanpa.

Mikä on IRQL (Interrupt Request Level) Windowsissa?

Windowsissa IRQL määrittelee prioriteetin laitteisto jossa prosessori toimii milloin tahansa. Windowsin ohjainmallissa (WDM) matalalla IRQL-arvolla suoritettava koodi voi keskeyttää korkeammalla IRQL-arvolla suoritettavan koodin. Itse asiassa yhdessä moniydintietokoneessa jokainen suoritin voi olla eri IRQL-arvolla, mikä vaikeuttaa synkronointia.

On yksi keskeinen sääntö: Kun suoritin toimii PASSIVE_LEVEL-tasoa korkeammalla IRQL-tasolla, vain vielä korkeammalla IRQL-tasolla toimiva toiminta voi estää sen toiminnan.Tämä järjestää käyttäjäkoodin, ytimen funktioiden, lykättyjen kutsujien (DPC) ja laitekeskeytyspalvelurutiinien (ISR) rinnakkaiselon.

Virhe 0x0000000A
Aiheeseen liittyvä artikkeli:
Virhe 0x0000000a (Blue Screen of Death). 6 Ratkaisut

Tasot ja prioriteetit: PASSIVE_LEVEL, APC_LEVEL, DISPATCH_LEVEL ja DIRQL

Yleensä x86:ssa käytetään IRQL-arvoja 0 ja 31 välillä; x64:ssä 0 ja 15 välillä.Käytännön merkitys on sama: IRQL 0 (PASSIVE_LEVEL) on se, missä normaali käyttäjäkoodi ja monet ajurifunktiot suoritetaan; APC ja sivuvirheet Ne on yleensä yhdistetty IRQL 1:een (APC_LEVEL); IRQL 2 (DISPATCH_LEVEL) kattaa säikeiden ajoituksen ja DPC:t. DISPATCH_LEVEL-tason yläpuolella on tasoja, jotka on varattu laitekeskeytyksille (tunnetaan nimellä DIRQL) ja muille sisäisille käyttötarkoituksille, kuten HIGH_LEVEL.

Kuljettajaekosysteemissä Monet yleiset rutiinit suoritetaan DISPATCH_LEVEL-tasollaesimerkiksi DPC ja StartIo. Tämä rakenne varmistaa, että vaikka yksi niistä koskettaa sisäisiä jonoja tai muita jaettuja resursseja, toinen samalla tasolla oleva rutiini ei syrjäytä sitä kyseisestä suorittimesta, koska ennakko-oikeussääntö sallii keskeytykset vain korkeammilla tasoilla.

DISPATCH_LEVEL-tason ja profilointi-/korkeiden tasojen välissä on tilaa kunkin laitteen laitteistokeskeytykset (DIRQL)Laitteen IRQL määrittää sen prioriteetin muihin laitteisiin nähden. WDM-ajuri saa tämän IRQL:n IRP_MJ_PNP:n aikana IRP_MN_START_DEVICE:n kanssa. Tämä laitteen IRQL ei ole globaali, kiinteä arvo, vaan tiettyyn keskeytyslinjaan liittyvä arvo.

IRQL vs. säikeiden prioriteetti

On suositeltavaa olla sekoittamatta käsitteitä: Säikeiden prioriteetti määrittää, milloin ajoitusohjelma suorittaa ennakoivan operaation ja mikä säie suoritetaan.; IRQL-taso ohjaa suoritettavien toimintojen tyyppiä ja mitkä keskeytykset peitetään. DISPATCH_LEVEL-tason yläpuolella säikeiden vaihtoa ei tapahdu: IRQL-taso ohjaa, ei säikeiden prioriteetti.

  Valve Fremont: Vuodetut tiedot ja tärkeimmät vihjeet

IRQL ja sivutus: Mitä sinun ei pitäisi tehdä

IRQL:n nostamisen välitön vaikutus on, että järjestelmä ei pysty käsittelemään sivuvirheitäKultainen sääntö: DISPATCH_LEVEL-tasolla tai sitä korkeammalla suoritettava koodi ei voi aiheuttaa sivuvirheitä. Käytännössä tämä tarkoittaa, että kyseiset rutiinit ja niiden koskettamat tiedot on sijaittava sivuttamattomassa muistissaLisäksi tietyt ytimen apuohjelmat rajoittavat niiden käyttöä IRQL:n perusteella: esimerkiksi KeWaitForSingleObject DISPATCH_LEVEL-funktiota voidaan kutsua vain, jos et ole estämässä (aikakatkaisu on nolla), ja jos aikakatkaisu on muu kuin nolla, sinun on oltava DISPATCH_LEVEL-arvon alapuolella.

IRQL:n implisiittinen ja eksplisiittinen hallinta

Useimmiten järjestelmä itse käynnistää rutiinisi oikealla IRQL-kohdalla mitä heidän pitäisi tehdä. IRP-ohjelmien lähetysrutiinit toimivat PASSIVE_LEVEL-tasolla (ne voivat estää tai kutsua mitä tahansa auttajaa), StartIo ja DPC toimivat DISPATCH_LEVEL-tasolla jaettujen jonojen suojaamiseksi, ja ISR-rutiinit toimivat DIRQL-tasolla.

Jos sinun on hallittava sitä eksplisiittisesti, Voit nostaa ja laskea IRQL-arvoa KeRaiseIrql y KeLowerIrqlOn olemassa hyvin käytetty pikavalinta: KeRaiseIrqlToDpcLevel() palauttaa edellisen IRQL-arvon ja jättää arvon DISPATCH_LEVEL-tasolle. Tärkeää: Älä koskaan laske IRQL-arvoa sen arvon alapuolelle, jolla se oli järjestelmän kutsuessa sinua; synkronoinnin rikkominen voi avata erittäin vakavia kilpailuikkunoita.

IRQL:ään liittyvät sinisen ruudun virheet: IRQL_NOT_LESS_OR_EQUAL ja DRIVER_IRQL_NOT_LESS_OR_EQUAL

irql

Kaksi näihin ongelmiin liittyvää klassista virheenkorjaustarkistusta ovat IRQL_NOT_LESS_OR_EQUAL (0xA) y DRIVER_IRQL_NOT_LESS_OR_EQUAL (0xD1)Molemmat osoittavat yrityksen käyttää sivutettavaa (tai virheellistä) osoitetta liian korkealla IRQL-arvolla. Tämä johtuu yleensä siitä, että ajurit käyttävät virheellisiä osoitteita, poistavat viittauksia virheellisiin osoittimiin tai suorittavat sivutettavaa koodia sopimattomilla tasoilla.

Erityistapauksessa DRIVER_IRQL_NOT_LESS_OR_EQUAL (0x000000D1), parametrit ovat erittäin informatiivisia: 1) viitatun muistin osoite; 2) senhetkinen IRQL; 3) käyttötapa (0 luku, 1 kirjoitus, 2/8 suoritus); 4) muistiin viitanneen käskyn osoite. Virheenjäljittäjällä voit käyttää ln parametrilla 4 listaa lähin symboli ja tiedä, mikä funktio oli käynnissä.

Yleisiä syitä, jotka kannattaa pitää mielessä

Tarkan koodin lisäksi on toistuvia kuvioita. Virheellisen osoittimen viittauksen poistaminen tasolle DISPATCH_LEVEL tai korkeammalle Tämä on varma resepti katastrofiin. Sivutettavan datan käyttäminen tällä tasolla tai sivutettavan koodin (esim. sivutettavaksi merkityn funktion) suorittaminen käynnistää myös virheenkorjaustarkistuksen.

Muita yleisiä tapauksia ovat mm. kutsu funktiota toisessa, jo ladatussa ajurissa (roikkuva funktioosoitin) tai epäsuorasti virheellisen funktioosoittimen kautta. Usein, jos järjestelmä pystyy tunnistamaan moduulin, näet sen nimen itse sinisellä ruudulla, ja se tallennetaan myös KiBugCheckDriver, saavutettavissa dx KiBugCheckDriver WinDbg:ltä.

Käytännön yksityiskohta: Useimmissa D1/A-tasoissa todellinen ongelma ei ole itse IRQL, vaan pikemminkin viitattu muistiosoite. Siksi parametrit 1, 3 ja 4 ovat ratkaisevan tärkeitä diagnoosin tarkentamisen kannalta.

Diagnostiikka WinDbg:llä: Hyödyllisiä komentoja ja parametrien lukemista

Työskennelläksesi näiden tapausten parissa, WinDbg on avaintyökalu, ja jos BSOD mainitsee ntoskrnl.exe Nämä tiedot antavat paljon suuntaa siihen, onko vika ytimen alijärjestelmässä. Aloita !analyze -v saadaksesi yhteenvedon virheenkorjaustarkistuksesta, pinosta ja, jos olet onnekas, kyseessä olevasta moduulista. Jos vedos sisältää sieppauskehyksen, .trap asettaa sinut vikaantuneen suorittimen kontekstiin.

Los komennot kasasta kuten k, kb, kc, kd, kp, kP, kv Ne näyttävät sinulle eri tasoisia jälkijäljityksen yksityiskohtia. ln parametrissa 4 voit ohittaa muistiin viitanneeseen käskyyn ja hanki lähellä oleva symboli. Ja jos epäilet, että prioriteettitaso on käynnissä ennen keskeytystä, !irql näyttää kohdeprosessorin tallennetun IRQL-arvon (esim. DISPATCH_LEVEL).

  Kuinka hallita Android-näyttöäsi SCRCPY:llä Windowsissa

Parametrin 1 suunnan analysoimiseksi !pool Se kertoo, kuuluuko se sivutettuun pooliin; !address y !pte syventy kyseisen alueen muistikartoitukseen. Voit käyttää muistin näyttökomennot tarkastaakseen sisällön, johon yritettiin päästä käsiksi. Lopuksi u, ub, uu voit purkaa parametrin 4 osoitteen ympärille.

Älä unohda lm t n ladattujen moduulien listaamiseksi y !memusage muistin yleisen tilan osalta. Jos KiBugCheckDriver on jotakin, dx KiBugCheckDriver Se palauttaa Unicode-moduulin nimen: tyypillisessä esimerkissä virheenkorjaustarkistuksessa mukana olleeksi ajuriksi nähtiin ”Wdf01000.sys”.

Järjestelmätyökalut: Ohjainvahvistin, Tapahtumienvalvonta ja Diagnostiikka

El Kuljettajan varmentaja Tutkii ajureiden toimintaa reaaliajassa ja pakottaa virheitä havaitessaan virheellistä resurssien (kuten poolin) käyttöä, aiheuttaen poikkeuksen koodin ongelmallisen alueen eristämiseksi. Se käynnistetään verifier alkaen komentokehote ja on suositeltavaa valita mahdollisimman pieni joukko ajureita, jotta vältetään liiallinen lisäys.

Jos et näe itseäsi WinDbg:n kanssa, soveltaa perustoimenpiteitäTarkista Tapahtumienvalvonnan järjestelmälokista tiettyyn laitteeseen/ohjaimeen viittaavat virheet; päivitä tai poista käytöstä sinisen ruudun mainitsema ohjain; tarkista laitteiston yhteensopivuus Windows-versiosi kanssa; ja käytä Windowsin muistidiagnostiikkaa, jos epäilet RAM-muistia. Nämä toimenpiteet, vaikkakin yksinkertaisia, ne ratkaisevat suuren määrän tapauksia.

Tosielämän tapauksia: Kun BSODit näyttävät satunnaisilta

Käyttäjä, jolla on Windows 10 Pro (AMD Ryzen 5 3400G -suoritin, GPU NVIDIA GeForce GTX 1660 Ti ja Gigabyte B450 AORUS PRO WIFI -näytönohjain, 16 Gt RAM-muistia) ilmeni ajoittain "IRQL_LESS_OR_NOT_EQUAL"-näyttöjä. Olin jo päivittänyt tärkeät ajurit (verkko, näytönohjain), asentanut kaikki Windows-päivitykset ja suorittanut muistityökalun, eikä mitään ongelmia havaittu.

Tällaisissa tilanteissa Seuraava vaihe on analysoida vedoksia WinDbg:llä ja etsi säännönmukaisuuksia: prosesseja, jotka liittyvät putoamiseen (esimerkiksi explorer.exe), graafiset käyttöliittymämoduulit (win32kfull.sys) ja funktioita, kuten xxxProcessNotifyWinEvent ilmestyvät pinoon. Vaikka tämä moduuli on Windows, laukaiseva tekijä on usein kolmannen osapuolen ohjain (grafiikka-, syöttö-, peitto- tai kaappauskortit), joka käyttää muistia sopimattomalla IRQL-arvolla, ja vika ilmenee win32k.

Käytännön suositus tässä on poista päällekkäisohjelmisto väliaikaisesti käytöstä (kaappaus, GPU OSD), aggressiiviset oheislaitteiden ajurit (hiiret/näppäimistöt makroilla) ja näytönohjainten beta-versiot, ja rajaa sitä. Ajurin tarkistimen käyttäminen epäiltyihin kohteisiin voi auttaa rajaamaan ongelmaa selkeämmän ratkaisun avulla.

Hyvin yleinen verkkokaava: ndis.sys ei ole aina syyllinen

Toinen tyypillinen tapaus: kuvakaappaus tiedostolla ndis.sys (Windowsin verkkokerros). Oikealla tietokoneella järjestelmä kaatuisi välittömästi käynnistyksen yhteydessä. Käytännön ratkaisu oli käynnistää Windows Vikasietotila ilman verkkotoimintoja, avaa Laitehallinta ja poista sovittimet käytöstä kohdassa ”Verkkosovittimet” ongelman eristämiseksi.

Tuossa joukkueessa oli Realtek PCIe GBE -perheen ohjain ja Atheros AR5007GDeaktivoimalla molemmat havaittiin, että todellinen syy oli athrx.sys (Atheros), vaikka sininen ruutu mainittiinkin ndis.sysKaatopaikka vahvisti tämän: pino kulki läpi ndis!NdisFreeTimerObject mutta syyllinen moduuli oli athrx.sysViimeinen korjaus oli poista laite ja asenna päivitetyt viralliset ajurit Atheros-valmistajan verkkosivuilta. Opetus: BSOD:ssa mainittu moduuli saattaa olla osa kyseistä alijärjestelmää, ei lähde.

  Arduino IDE:n asentaminen Windows 11:een askel askeleelta

Tyypillinen tukivastaus ja nopeat vaiheet käyttäjille

Aidossa tukikeskustelussa teknikko vastasi: "Pahoittelen häiriötä. Kyseessä voi olla ajuri-, muisti- tai virustorjuntaongelma. Päivitä ajurit ja jos ongelma jatkuu, suorita muistidiagnostiikka."Tämä on perusasia, mutta pätevä neuvo; jos virheitä kuitenkin esiintyy, on hyvä jatkaa tarkemmalla ja vedosanalyysillä.

Ei-teknisille käyttäjille kohtuullinen protokolla olisi: 1) Tarkista järjestelmätapahtumat, 2) Päivitä tärkeimmät ajurit (piirisarja/verkko/näytönohjain), 3) Tarkista RAM-muisti integroidulla työkalulla, 4) testi tavaratila 5) puhdistaa ilman kolmannen osapuolen ohjelmistoja, jotka lisäävät koukkuja ytimeen/käyttöliittymään, ja 6) käyttää Verifieria kolmannen osapuolen ajureilla, jos mikään ei ole selvää.

Parhaat käytännöt ajurikehittäjille

Jos olet kehittämässä ja törmäät D1/A:han, tarkista, että käynnissä olevaa rutiinia ei ole merkitty sivutettavaksi Älä kutsu sivutettavia funktioita, kun suoritat DISPATCH_LEVEL-tasoa tai sitä korkeampaa tasoa. Tämä sisältää viittausten välttämisen sivutettujen osien tietoihin ja DDK:ssa kuvattujen ytimen apuohjelmien IRQL-rajoitusten noudattamisen.

Jaettujen tietojen synkronoimiseksi käytä sääntöä "käytä jaettuja tietoja aina samalla korkealla IRQL-arvolla" ja käytä spin-lukkoja tarvittaessa. Moniprosessoreissa pelkkä IRQL ei takaa eri suorittimien välistä poissulkemista; spin-lukot nostavat IRQL:n (DISPATCH_LEVEL-tasolle) ja koordinoivat pääsyä ytimien välillä. Jos sinun on toimittava herkkien laitteistorekistereiden kanssa, KeSynchronizeExecution auttaa sinua suorittamaan kriittiset osiot oikealla DIRQL-arvolla.

Kun suunnitelma edellyttää IRQL:n nostamista, Yhdysvallat KeRaiseIrqlToDpcLevel DISPATCH_LEVEL-tasolle tai KeRaiseIrql huolellisesti, tallentamalla edellisen IRQL:n ja palauttamalla sen täsmälleen KeLowerIrqlMene syötetyn IRQL:n alapuolelle, vaikka vain hetkeksi, Kyseessä on vakava synkronointivirhe.

Suhde keskeytyksiin ja laitteistoon

IRQL on mekanismi, jolla Windows käskyt keskeyttävät prioriteetit ja tietyt sisäiset tehtävätArkkitehtuuritasolla se liittyy käsitteisiin kuten "Keskeytys", "Keskeytyskäsittelijä" tai "Keskeytyksen prioriteettitaso" ja klassisilla alustoilla myös Ohjelmoitava keskeytysohjain (PIC)Muissa järjestelmissä prioriteettiohjaus ilmaistaan ​​​​mekanismien, kuten spl en unixYleinen ajatus on sama: kuka voi keskeyttää ketä.

Edistyneet virheenkorjausvinkit

Kaatopaikoilla, joihin pino osoittaa win32kfull!xxxProcessNotifyWinEvent virheenkorjauksella 0xA/0xD1, tarkista konteksti .process y .thread (jos saatavilla), tarkastele prosesseja, kuten explorer.exe en !process 0 1 ja tarkista päällekkäisyydet ja graafisen käyttöliittymän vuorovaikutusajurit. Usein ongelma Se on kolmannen osapuolen turmelema muisti, joka ilmestyy tuolle reitille.

Muista tarkistaa IRQL !irqlja kontrasti: jos olet DISPATCH_LEVEL (2) -tasolla ja parametri 3 osoittaa luku-/kirjoitus-/suoritustilaa sivutettavalla sivulla sinulla on jo vihje siitä, miksi se on pudonnut. Ylitä vihje ln parametrissa 4 tietyn funktion saamiseksi.

ymmärtää Mikä on IRQL? ja miten se sopii ytimen suoritukseen, auttaa erottamaan kohinan signaaleista. Jos olet käyttäjä, keskity siihen ajurit ja laitteisto (Verifier, tapahtumat ja testit oletuksena). Jos kehität, noudata tarkasti IRQL:n, sivuttamattoman muistin ja spin lock -synkronoinnin sääntöjä. Oikeilla työkaluilla (WinDbg, Verifier) ​​​​ja parametrien (1, 3 ja 4) huolellisella lukemisella, Nämä virheenkorjaustarkistukset eivät ole enää mysteeri ja niistä tulee ongelmia, joihin voidaan puuttua metodisesti.