次の方法で共有


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 バイト未満の割り当てが正常に要求されると、呼び出し元は要求された 長さにのみアクセスできます。 PAGE_SIZE バイトの整数倍数以上を要求する割り当てが成功すると、最後に割り当てられたページの残りのバイトは呼び出し元にアクセスできなくなります。

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

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

要件

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

こちらもご覧ください

DMA_ADAPTER

DMA_OPERATIONS

FreeCommonBuffer

IoGetDmaAdapter