カーネル スタックの使用

カーネル モード スタックのサイズは、約 3 ページに制限されています。 そのため、内部ルーチンにデータを渡すとき、ドライバーはカーネル スタック上に大量のデータを渡すことができません。

カーネル モード スタック領域が不足しないようにするには、次の設計ガイドラインを使用します。

  • 各ルーチンがカーネル スタック上のデータを渡す場合は、内部ドライバー ルーチン間で深い入れ子になった呼び出しを行わないでください。

  • 再帰ルーチンを持つドライバーを設計する場合は、発生する可能性がある再帰呼び出しの数を制限してください。

つまり、ドライバーの呼び出しツリー構造は比較的フラットである必要があります。 IoGetStackLimitsIoGetRemainingStackSize ルーチンを呼び出して、使用可能なカーネル スタック領域を特定するか、 KeExpandKernelStackAndCallout を呼び出して拡張することができます。 カーネル モード スタックのサイズは、ハードウェア プラットフォームやオペレーティング システムのバージョンによって異なる場合があることに注意してください。

カーネル スタック領域が不足すると、致命的なシステム エラーが発生します。 したがって、ドライバーはカーネル スタック 領域を使い果たすより、 システム領域メモリ を割り当てる方が適しています。 ただし、非ページ プールも限られたシステム リソースです。

通常、カーネル モード スタックはメモリ内に存在しますが、スレッドがユーザー モードを指定する待機状態になると、ページ アウトされることがあります。 現在のスレッドのカーネル スタック ページングを一時的に無効にする方法については、 「 KeSetKernelStackSwapEnable 」を参照してください。 パフォーマンス上の理由から、カーネル スタックのページングをグローバルに無効にすることはお勧めしませんが、デバッグ セッション中に無効にする場合は、「 カーネル スタックのページングを無効にする」を参照してください。

カーネル スタックはページ アウトされる可能性があるため、スタック ベースのバッファー (つまりローカル変数) を DMA または DISPATCH_LEVEL 以上で実行されるルーチンに渡すことに注意してください。