Was genau ist IRQL NICHT WENIGER ODER GLEICH?

Was genau ist IRQL_NOT_LESS_OR_EQUAL? Was ist IRQL? Welche Dinge verwenden IRQL? Warum muss es weniger oder gleich sein? Was würde dazu führen, dass es nicht weniger oder gleich ist? Warum kann sich das Betriebssystem nicht davon erholen, dass es nicht weniger oder gleich ist? Betrifft IRQL nur Windows?

Dieser Fehler scheint ziemlich häufig zu sein. Ich bitte nicht um Hilfe, ich bitte um eine Erklärung.

Author: Aaron Franke, 2018-04-03

1 answers

Es ist kompliziert. ;)

Nein, wirklich, das ist es.

IRQL steht für "Interrupt Request Level". Es ist eine Zahl, die von 0 bis 31 auf Windows x86-Systemen und 0 bis 15 auf x64-Systemen reicht. Es stellt die "Wichtigkeit" einer Kernelmodus-Task relativ zu anderen Kernelmodus-Tasks dar.

IRQL ist ein von Windows definierter Status des Prozessors-nicht eines Prozesses oder Threads -, der Windows angibt, ob das, was dieser Prozessor tut, von anderen unterbrochen werden kann Aufgaben. Wenn eine neue Aufgabe (z. B. eine Interrupt-Service-Routine) eine höhere IRQL als die aktuelle IRQL des Prozessors aufweist, kann sie die aktuelle Aufgabe unterbrechen. Auf einem Multiprozessorsystem hat jeder Prozessor seinen eigenen IRQL. Dazu gehören die durch Hyperthreading erstellten" logischen Prozessoren".

(Ich verwende das Wort "Wichtigkeit" anstelle von "Priorität", da sich "Priorität" in Windows auf Thread-Prioritäten bezieht und IRQLs etwas anderes sind. Im Gegensatz zu Thread-Prioritäten, Kernel-Aufgaben bei die gleichen IRQL sind nicht zeitlich geschnitten, und IRQLs unterliegen keinem automatischen Boost und Decay. )

(Ich sollte auch erwähnen, dass der Begriff "Kernelaufgabe" hier nicht offiziell ist. Windows nennt diese Dinge nicht wirklich "Kernelaufgaben", es handelt sich nicht um verwaltete Objekte, wie z. B. Prozesse und Threads, und es gibt keine Beziehung zu x86 - "Task-Gates" oder zu irgendetwas, das in "Task-Manager"angezeigt wird. Wie ich (und andere) den Begriff hier verwende, deckt" kernel mode task "wirklich" alles mit einem definierten Anfang und Ende dies muss im Kernel-Modus bei IRQL 2 oder höher erfolgen."Eine Interrupt-Service-Routine ist ein Beispiel für eine "Kernel-Modus-Aufgabe"; so ist eine DPC-Routine. Ein anderes Beispiel kann jedoch Code in einem Kernel-Modus-Thread sein. Solche Threads beginnen bei IRQL 0, aber wenn ein Teil des Codes zu IRQL 2 oder höher aufruft, etwas tut und dann zu seinem vorherigen IRQL zurückkehrt, ist der High-IRQL Teil des Codes ein Beispiel dafür, was ich hier eine "Kernel-Aufgabe" nenne. )

Performance Monitor zeigt die Zeit an IRQL 2 als "% DPC time "und Zeit bei IRQL > 2 als" % interrupt time", unabhängig davon, ob die Zeit tatsächlich in einer DPC-Routine oder ISR verbracht wurde oder das Ergebnis der Erhöhung von IRQL von einem niedrigeren Wert war. Jeder ist eine Teilmenge dessen, was PerfMon als "% privilegierte Zeit" anzeigt - was als "kernel mode time"hätte bezeichnet werden sollen.

Sobald eine Kernelaufgabe bei IRQL 2 oder höher gestartet wird, wird sie abgeschlossen, bevor alles andere bei auf demselben Prozessor gestartet wird. Es kann sein unterbrochen durch eine höhere IRQL-Aufgabe (die wiederum durch eine noch höhere IRQL-Aufgabe usw. unterbrochen werden könnte).), aber wenn die übergeordneten Aufgaben abgeschlossen sind, kehrt die Steuerung zu der Aufgabe zurück, die sie beendet hat.

IRQL ist in erster Linie ein Serialisierungsmechanismus. (Viele sagen "Synchronisation", aber ich bevorzuge dieses Wort, da es das Ergebnis genauer beschreibt.) Sein Zweck ist es, sicherzustellen, dass mehrere Aufgaben auf derselben CPU auf bestimmte gemeinsam genutzte Ressourcen zugreifen-meist gemeinsam genutzte Datenstrukturen in der OS Kernel Space-dürfen sich nicht gegenseitig auf eine Weise unterbrechen, die diese Strukturen beschädigen könnte.

Zum Beispiel sind viele Daten im Windows-Kernel, insbesondere die Speicherverwaltungsdaten und die vom Thread-Scheduler verwendeten Daten, bei IRQL 2 "serialisiert". Das bedeutet, dass jede Aufgabe, die solche Daten ändern möchte, bei IRQL 2 ausgeführt werden muss. Wenn eine Aufgabe mit höherem IRQL versucht, solche Daten zu schreiben, kann dies zu einer Beschädigung führen, da sie möglicherweise unterbrach eine IRQL 2-Aufgabe, die sich möglicherweise mitten in einem Lese-Schreib-Schreib-Zyklus für dieselben Daten befindet. Höhere IRQL-Aufgaben dürfen das also einfach nicht tun.

Höhere IRQL-Tasks sind meistens die Interrupt-Service-Routinen von Gerätetreibern, da die Interrupts aller Geräte bei IRQL > 2 auftreten. Dazu gehört der Interrupt vom Timer-Chip auf dem Motherboard, der die Zeitmessung und die zeitgesteuerte Aktivität im Betriebssystem steuert. Sein IRQL ist über dem aller "gewöhnlichen" Hardware-Geräte.

IRQLs 2 und höher werden für Kernel-Tasks verwendet, die nicht durch Hardware - Interrupts ausgelöst werden, bei denen jedoch keine normale Thread - Planung-einschließlich Warten-erfolgen kann. Sobald sich ein Prozessor bei IRQL 2 oder höher befindet, können auf diesem Prozessor keine Thread-Kontextwechsel mehr stattfinden, bis IRQL unter 2 fällt.

Der Benutzermodus-Code ist immer bei IRQL 0. Kernel-Modus-Code kann an jedem IRQL von 0 bis was auch immer die max ist laufen. IRQL 1 ist ein Sonderfall; es ist nur Kernel-Modus, hat aber keine Auswirkungen auf scheduling, und ist wirklich mehr ein Zustand eines Threads als des Prozessors - es wird beispielsweise während Thread-Kontextwechseln gespeichert und wiederhergestellt.

Um verschiedene Serialisierungsgarantien aufrechtzuerhalten, sind die meisten Ausnahmen (z. B. durch Null dividieren oder Speicherzugriffsverletzungen wie Seitenfehler) bei IRQL 2 oder höher einfach nicht handhabbar. (IRQL 2 btw wird allgemein als "Dispatch Level" oder "DPC Level"bezeichnet.)

Und jetzt können wir endlich diesen Bugcheck-Code erklären!

Die der häufige Fall von IRQL_NOT_LESS_OR_EQUAL ist auf einen Seitenfehler (Versuch, auf eine "nicht residente" virtuelle Adresse zuzugreifen) oder eine Speicherzugriffsverletzung (Versuch, auf eine schreibgeschützte Seite zu schreiben oder auf eine Seite zuzugreifen, die überhaupt nicht definiert ist) zurückzuführen, die bei IRQL 2 oder höher auftritt.

Wenn solche Ausnahmen bei IRQL 0 oder 1 ausgelöst werden, können sie entweder vom System bereitgestellten Code (wie dem Seitenfehlerhandler) oder von einem vom Entwickler bereitgestellten Ausnahmebehandler "behandelt" werden. Die meisten Ausnahmen können jedoch nicht sein überhaupt behandelt, wenn sie bei IRQL 2 oder höher aufgetreten sind.

So... der Bugcheck-Code bedeutet " Eine Ausnahme eines Typs, der nur bei IRQL 0 oder 1 behandelt werden kann, ist aufgetreten, als IRQL bei 2 oder höher war."d.h." nicht kleiner oder gleich 1". Seltsame Formulierung, aber da ist es.

Es gibt ein paar andere Dinge, die diesen Bugcheck auslösen können, und der Wert, den der IRQL nicht kleiner oder gleich ist, ist nicht immer 1, aber sie treten nur selten auf. WinDBG-Dokumentation listet Sie auf.

 35
Author: Jamie Hanrahan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-10-01 16:12:00