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 は次の処理を行います。
- プロセッサとデバイスの両方から到達できるメモリを割り当てます。 このメモリは、デバイスに連続して表示されます。
- システムで必要な場合は、バッファーをマップするためのマップ レジスタを割り当てます。
- 必要に応じてマップ レジスタを読み込むなど、デバイスの変換を設定します。
ドライバーが複数のページの共通バッファー領域を必要とするが、ページが連続している必要がない場合、ドライバーは 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) |