特別なプール機能は、指定したプール タグを使用してメモリが割り当てられているか、指定したサイズ範囲内にある場合に、予約済みメモリ プールからメモリ割り当てを要求するように Windows を構成します。
Abbreviation |
spp |
16 進数の値 |
(なし) |
シンボリック名 |
(なし) |
行き先 |
システム全体のレジストリ エントリ (Windows Vista 以降)システム全体のレジストリ エントリ、カーネル フラグ |
プール タグの選択
特定のプール タグに対して特別なプールを要求する場合は、ドライバーまたはその他のカーネル モード プログラムで一意のプール タグが使用されていることを確認します。
また、プール タグ ( ExAllocatePoolWithTag の使用など) を作成する場合は、タグ文字を逆の順序で入力することを検討してください。 たとえば、タグが Fred の場合は、 derF (0x64657246) として入力することを検討してください。 プール タグはレジストリに格納され、デバッガーやその他のツールに逆 (下限エンディアン) 順に表示されます。 逆順に入力すると、順方向に表示されます (0x46726564)
ドライバーがすべての特別なプールを使用していると思われる場合は、コードで複数のプール タグを使用することを検討してください。 その後、ドライバーを複数回テストし、各テストの 1 つのプール タグに特別なプールを割り当てることができます。
また、システムのページ サイズより大きい 16 進数の値を持つプール タグを選択します。 カーネル モード コードの場合、PAGE_SIZE未満の値を持つプール タグを入力すると、Gflags は、サイズが対応する範囲内にあるすべての割り当てに対して特別なプールを要求し、同等のプール タグを持つ割り当ての特別なプールを要求します。 たとえば、 30 のサイズを選択した場合、サイズが 17 ~ 32 バイトのすべての割り当てと、プール タグが0x0030割り当てに特別なプールが使用されます。
割り当てサイズの選択
次のガイドラインを使用して、特別なプール機能の割り当てサイズを選択します。
x86 プロセッサを搭載したコンピューターでは、PAGE_SIZEは0x1000され、割り当てサイズの範囲の長さは 8 バイトです。 この範囲のサイズを持つすべての割り当てに対して特殊プール機能を構成するには、この範囲の最大値に 8 を加えた数値を入力します。 (この数値は常に 8 の倍数です)。次の表に、これらの値を示します。
| サイズ範囲 | この番号を入力してください |
|---|---|
1 ~ 8 バイト |
10 (10 進数 16) |
9 ~ 16 バイト |
18 (10 進数 24) |
17 ~ 24 バイト |
20 (10 進数 32) |
... |
... |
0xFE9バイトから0xFF0バイトまで |
FF8 (10 進数 4088) |
AMD x86-64 プロセッサを搭載したコンピューターでは、PAGE_SIZEは0x1000され、割り当てサイズの範囲の長さは 16 バイトです。 この範囲のサイズを持つすべての割り当てに対して特別なプール機能を構成するには、この範囲の最大値に 16 を加えた数値を入力します。 (この数値は常に 16 の倍数です)。次の表に、これらの値を示します。
| サイズ範囲 | この番号を入力してください |
|---|---|
1 ~ 16 バイト |
20 (10 進数 32) |
17 ~ 32 バイト |
30 (10 進数 48) |
33 ~ 48 バイト |
40 (10 進数 64) |
... |
... |
0xFD1バイトから0xFE0バイトまで |
FF0 (10 進数 4080) |
任意のプロセッサを搭載したコンピューターでは、アスタリスク ( * ) または0x2A (10 進数 42) を使用して、システム上のすべてのメモリ割り当てに対して特別なプール機能を構成できます。
コメント
[グローバル フラグ] ダイアログ ボックスで特別なプール機能を構成する方法については、「 特別なプールの構成」を参照してください。 コマンド ラインでの特別なプール機能の構成については、「 GFlags コマンド」を参照してください。 例については、「 例 14: 特殊プールの構成」を参照してください。
Gflags の特別なプール機能は、指定したプール タグを使用してメモリが割り当てられているか、指定したサイズ範囲内にある場合に、予約済みメモリ プールからメモリ割り当てを要求するように Windows に指示します。 特定のドライバーによるすべての割り当ての特別なプールを要求するには、ドライバー検証ツールを使用します。 詳細については、Windows ドライバー キット (WDK) の「ドライバー検証ツール」セクションの「特別なプール」トピックを参照してください。
Gflags とドライバー検証ツールの特別なプール機能は、割り当てられたメモリ領域を超えて書き込む、既に解放されているメモリを参照するなど、カーネル プールの使用でエラーの原因を検出して特定するのに役立ちます。
すべての特別なプール要求が満たされるわけではありません。 特殊プールからの各割り当てでは、1 ページの非ページング物理メモリと 2 ページの仮想アドレス空間が使用されます。 特殊プールが使い果たされた場合、特殊プールが再び使用可能になるまで、標準プールからメモリーが割り振られます。 標準プールから特別なプール要求が入力されると、要求元関数は成功状態を返します。 特別なプールから入力されなかった場合でも、割り当てが成功したため、エラーは返されません。
特別なプールのサイズは、システム上の物理メモリの量に応じて増加します。理想的には、これは少なくとも 1 ギガバイト (GB) である必要があります。 x86 マシンでは、仮想 (物理領域に加えて) が消費されるため、特殊なプールを使用する場合は 、/3 GB ブート オプションを使用しないでください。 また、ページ ファイルの最小/最大数量を 2 ~ 3 倍に増やすこともお勧めします。
割り当て前のメモリへの参照 ("アンダーラン") または割り当て ("オーバーラン") を超えるメモリへの参照を検出するように、メモリ割り当てを調整するように特別なプール機能を構成することもできます。 この機能は、すべてのバージョンの Windows の [グローバル フラグ] ダイアログ ボックスでのみ使用できます。 詳細については、「 オーバーランとアンダーランの検出」を参照してください。
Windows Vista 以降のバージョンの Windows では、特別なプール機能を、再起動を必要とするレジストリ設定として構成できますが、変更するまで有効なままです。または、再起動を必要としないが、Windows を再起動またはシャットダウンするまで有効なカーネル フラグ設定として構成できます。 以前のバージョンの Windows では、特殊プールはレジストリ設定としてのみ使用できます。
Windows Vista 以降のバージョンの Windows では、[グローバル フラグ] ダイアログ ボックスまたはコマンド ラインを使用して、特別なプール機能を構成できます。 以前のバージョンの Windows では、この機能は [グローバル フラグ] ダイアログ ボックスでのみ使用できます。