次の方法で共有


PALLOCATE_COMMON_BUFFER コールバック関数 (wdm.h)

AllocateCommonBuffer ルーチンはメモリを割り当て、DMA 操作のためにプロセッサとデバイスの両方から同時にアクセスできるようにメモリをマップします。

構文

PALLOCATE_COMMON_BUFFER PallocateCommonBuffer;

PVOID PallocateCommonBuffer(
  [in]  PDMA_ADAPTER DmaAdapter,
  [in]  ULONG Length,
  [out] PPHYSICAL_ADDRESS LogicalAddress,
  [in]  BOOLEAN CacheEnabled
)
{...}

パラメーター

[in] DmaAdapter

バス マスター アダプターまたは DMA コントローラー 表す IoGetDmaAdapter によって返される DMA_ADAPTER 構造体へのポインター。

[in] Length

割り当てるメモリのバイト数を指定します。

[out] LogicalAddress

割り当てられたバッファーへのアクセスにデバイスが使用できる論理アドレスを受け取る変数へのポインター。 システムはプラットフォーム固有のメモリ制限を考慮に入れる可能性があるため、mmGetPhysicalAddress 呼び出す代わりに、このアドレスを使用します。

[in] CacheEnabled

割り当てられたメモリをキャッシュできるかどうかを指定します。

このパラメーターは無視されます。 オペレーティング システムは、割り当てられる共通バッファーでキャッシュされたメモリを有効にするかどうかを決定します。 この決定は、プロセッサ アーキテクチャとデバイス バスに基づいています。

x86 ベース、x64 ベース、および Itanium ベースのプロセッサを搭載したコンピューターでは、キャッシュされたメモリが有効になります。 デバイスによって実行されるすべての DMA 操作は、関連する CPU キャッシュと一貫性があり、そのメモリをキャッシュしている可能性があることを前提としています。 ドライバーでキャッシュを無効にする必要がある場合は、代わりに AllocateCommonBufferEx 呼び出します。

ARM または ARM 64 ベースのプロセッサを搭載したコンピューターでは、オペレーティング システムはすべてのデバイスに対してキャッシュされたメモリを自動的に有効にしません。 システムは、各デバイスの ACPI_CCA 方法に依存して、デバイスがキャッシュコヒーレントであるかどうかを判断します。

戻り値

AllocateCommonBuffer は、割り当てられた範囲のベース仮想アドレスを返します。 バッファーを割り当てることができない場合は、null 返します。

備考

AllocateCommonBuffer は、名前で直接呼び出すことができるシステム ルーチンではありません。 このルーチンは、DMA_OPERATIONS 構造体で返されたアドレスからのポインターによってのみ呼び出されます。 ドライバーは、IoGetDmaAdapterを呼び出すことによって、このルーチンのアドレスを取得します。

AllocateCommonBuffer は、バス マスター DMA デバイスの制御構造のように、デバイスとプロセッサがシステム メモリを介して継続的に通信する DMA をサポートします。

AllocateCommonBuffer では、ドライバーがシステム DMA コントローラーの自動初期化モードを使用する下位デバイスもサポートされます。

AllocateCommonBuffer は、次の処理を行います。

  • プロセッサとデバイスの両方から到達できるメモリを割り当てます。 このメモリは、デバイスに連続して表示されます。
  • システムで必要な場合は、バッファーをマップするマップ レジスタを割り当てます。
  • 必要に応じてマップ レジスタを読み込むなど、デバイスの変換を設定します。
常駐システム メモリを経済的に使用するには、ドライバーは、デバイスごとにこれらのバッファーのできるだけ少ないを割り当てる必要があります。 AllocateCommonBuffer は、要求された 長さに関係なく、少なくとも 1 ページのメモリを割り当てます。 PAGE_SIZE バイト未満の要求が正常に割り当てられた後、呼び出し元は要求された Lengthにのみアクセスできます。 PAGE_SIZE バイトの整数倍数以上を要求する割り当てが成功すると、最後に割り当てられたページの残りのバイトは呼び出し元にアクセスできなくなります。

ドライバーが一般的なバッファー領域のいくつかのページを必要とするが、ページが連続している必要がない場合、ドライバーは、1 つの大きな要求ではなく、AllocateCommonBuffer するいくつかの 1 ページ要求を行う必要があります。 この方法では、連続するメモリが節約されます。

ドライバーは通常、PnP IRP_MN_START_DEVICE 要求への応答中に、デバイスの起動時の一部として、AllocateCommonBuffer を呼び出します。 起動後、1 ページの要求のみが成功する可能性があります (ある場合)。

必要条件

要件 価値
サポートされる最小クライアント Windows 2000 以降で使用できます。
ターゲット プラットフォーム デスクトップ
ヘッダー wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
IRQL PASSIVE_LEVEL
DDI コンプライアンス規則 する IrqlDispatch(wdm)

関連項目

DMA_ADAPTER

DMA_OPERATIONS

FreeCommonBuffer する

IoGetDmaAdapter