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