IRQL_NOT_LESS_OR_EQUALとは正確には何ですか?


15

IRQL_NOT_LESS_OR_EQUALとは正確には何ですか?IRQLとは何ですか?IRQLを使用するものは何ですか?なぜそれ以下にする必要があるのですか?それ以下または等しくない原因は何ですか?なぜOSはそれ以下から回復できないのですか?IRQLはWindowsにのみ影響しますか?

このエラーはかなり一般的なようです。私は助けを求めているのではなく、説明を求めているのです。




IRQL_NOT_LESS_OR_EQUALバグチェックの値は0x0000000Aです。これは、Microsoft Windowsまたはカーネルモードドライバーが、割り込み要求レベル(IRQL)が上昇している間に無効なアドレスのページメモリにアクセスしたことを示します。IQLはカーネルの優先システムです。カーネルの一部のIRQLでは、ページファイルに保存されているデータにアクセスできません。dmpを分析し、サードパーティのコードが関係しているかどうかを確認します。そうでない場合は、メモリの問題をテストします。
magicandre1981

1
おかしなことは、メッセージに対する最も実用的な応答は、それが何を意味するかは重要ではないということです。重要なのは、そのメッセージを受け取ったときに何をすべきかということです。そのIRQL BSODは、通常「ドライバーの問題」です!だから、どのドライバを見つけて、ドライバを削除して再インストールしてみてください。しかし、それは何を言っているのかについての良い質問です...私はIRQが何であるかを知っていますが、ジェイミーの答え!
-barlop

回答:


25

それは複雑です。;)

いいえ、本当にそうです。

IRQLは「割り込み要求レベル」の略です。これは、Windows x86システムでは0〜31、x64システムでは0〜15の範囲の数値です。他のカーネルモードタスクに対するカーネルモードタスクの「重要性」を表します。

IRQLは、プロセスまたはスレッドではなく、Windowsが定義したプロセッサの状態であり、そのプロセッサが実行していることを他のタスクによって中断できるかどうかをWindowsに示します。新しいタスク(割り込みサービスルーチンなど)のIRQLがプロセッサの現在のIRQLよりも高い場合、はい、現在のタスクを中断できます。それ以外の場合はありません。マルチプロセッサシステムでは、各プロセッサに独自のIRQLがあります。これには、ハイパースレッディングによって作成された「論理プロセッサ」が含まれます。

(Windowsの「優先度」はスレッドの優先度を指し、IRQLは何か異なるため、「優先度」ではなく「重要度」という言葉を使用します。自動ブーストおよびディケイの対象。

(ここで「カーネルタスク」という用語は公式ではありません。Windowsはこれらのことを「カーネルタスク」とは呼ばず、プロセスやスレッドなどの管理対象オブジェクトではなく、x86の「タスクゲート」または「タスクマネージャ」に示されているもの。ここで「カーネルモードタスク」という用語を使用しているため、「カーネルモードタスク」は「IRQL 2のカーネルモードまたは割り込みサービスルーチンは「カーネルモードタスク」の一例です。DPCルーチンも同様です。しかし、別の例はカーネルモードスレッドのコードです。そのようなスレッドはIRQL 0から始まりますが、コードの一部である場合上げるIRQL 2以上で何かをしてから以前のIRQLに戻ります。コードのIRQLの高い部分は、ここで「カーネルタスク」と呼んでいるものの一例です。)

パフォーマンスモニターは、実際に時間がDPCルーチンまたはISRで費やされたか、IRQLを上げた結果であるかに関係なく、IRQL 2で費やされた時間を「%DPC時間」として、IRQL> 2で費やされた時間を「%割り込み時間」として示しますより低い値。それぞれは、PerfMonが「%特権時間」として表示するもののサブセットです-「カーネルモード時間」とラベル付けする必要があります。

カーネルタスクがIRQL 2以上で開始されると、同じプロセッサで同じ IRQLの他の何かが開始される前に完了するまで実行されます。より高いIRQLタスクによって中断される可能性があります(さらに高いIRQLタスクなどによって中断される可能性があります)が、高いIRQLタスクが完了すると、制御は中断したタスクに戻ります。

IRQLは、主にシリアル化メカニズムです。(多くの場合、「同期」と言いますが、結果をより正確に説明するため、この言葉を好みます。)その目的は、特定の共有リソース(主にOSカーネルスペースの共有データ構造)にアクセスする同じCPU上の複数のタスクを保証することを支援することです-それらの構造を破壊する可能性のある方法で互いに割り合うことは許可されていません。

たとえば、Windowsカーネル内の大量のデータ、特にメモリ管理データとスレッドスケジューラで使用されるデータは、IRQL 2で「シリアル化」されます。つまり、そのようなデータを変更するタスクは、そうするとき、IRQL 2。より高いIRQLタスクがそのようなデータを書き込もうとすると、同じデータの読み取り-変更-書き込みサイクルの途中にあるIRQL 2タスクを中断した可能性があるため、破損を引き起こす可能性があります。そのため、IRQLの高いタスクではそれが許可されません。

IRQL> 2ですべてのデバイスの割り込みが発生するため、IRQLの高いタスクは主にデバイスドライバーの割り込みサービスルーチンです。これには、OSの計時および時間駆動型アクティビティを駆動するマザーボードのタイマーチップからの割り込みが含まれます。そのIRQLは、すべての「通常の」ハードウェアデバイスのIRQLを上回っています。

IRQL 2以降は、ハードウェア割り込みによってトリガーされないが、通常のスレッドスケジューリング(待機を含む)が発生しないカーネルタスクに使用されます。したがって、プロセッサがIRQL 2以上になると、IRQLが2未満になるまで、そのプロセッサでスレッドコンテキストの切り替えは発生しません。

ユーザーモードコードは常にIRQL 0です。カーネルモードコードは、0から最大値までの任意のIRQLで実行できます。IRQL 1は特殊なケースです。これはカーネルモードのみですが、スケジューリングには影響がなく、実際にはプロセッサよりもスレッドの状態です。たとえば、スレッドコンテキストの切り替え中に保存および復元されます。

さまざまなシリアル化の保証を維持するために、ほとんどの例外(ゼロ除算のようなもの、またはページフォールトのようなメモリアクセス違反)は、IRQL 2以降では処理できません。(IRQL 2 btwは一般に「ディスパッチレベル」または「DPCレベル」と呼ばれます。)

そして、ついにこのバグチェックコードを説明できます!

IRQL_NOT_LESS_OR_EQUALの最も一般的なケースは、ページフォールト(「常駐しない」仮想アドレスへのアクセスの試み)、またはメモリアクセス違反(読み取り専用ページへの書き込み、または定義されていないページへのアクセス)が原因です。まったく)、それはIRQL 2以上で発生します。

このような例外がIRQL 0または1で発生した場合、システム提供のコード(ページフォールトハンドラーなど)または開発者が提供する例外ハンドラーによって「処理」できます。ただし、IRQL 2以上で発生した場合、ほとんどの例外はまったく処理できません。

バグチェックコードは、「IRQLが2以上のときにIRQL 0または1でしか処理できないタイプの例外が発生した」ことを意味します。すなわち、「1以下」です。奇妙な言い回しですが、そこにあります。

このバグチェックをトリガーできるものは他にもいくつかあり、IRQLがそれ以下ではない値は常に1とは限りませんが、まれにしか発生しません。WinDBGのドキュメントにそれらがリストされています。


素晴らしい答え。2を超えるIRQLで実行される既知のものを知っていますか?
スコットチェンバレン

1
おそらくデバイスドライバー。
ローレンス

1
@LawrenceCはい。すべてのハードウェア割り込みは、IRQL> 2である
ジェイミー・ハンラハン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.