次の方法で共有


特別なプール

特別なプール機能は、メモリが特別なプール タグを使用して割り当てられているか、指定されたサイズ範囲内である場合に、予約されたメモリ プールからのメモリ割り当てを要求するように 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 では、この機能は [グローバル フラグ] ダイアログ ボックスでのみ使用できます。