次の方法で共有


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

AllocateCommonBufferEx ルーチンは、共通バッファーにメモリを割り当て、このメモリをマップして、プロセッサと DMA 操作を実行するデバイスの両方からアクセスできるようにします。

構文

PALLOCATE_COMMON_BUFFER_EX PallocateCommonBufferEx;

PVOID PallocateCommonBufferEx(
  [in]           PDMA_ADAPTER DmaAdapter,
  [in, optional] PPHYSICAL_ADDRESS MaximumAddress,
  [in]           ULONG Length,
  [out]          PPHYSICAL_ADDRESS LogicalAddress,
  [in]           BOOLEAN CacheEnabled,
  [in]           NODE_REQUIREMENT PreferredNode
)
{...}

パラメーター

[in] DmaAdapter

DMA_ADAPTER 構造体へのポインター。 この構造体は、ドライバーのバス マスター DMA デバイスまたはシステム DMA チャネルを表すアダプター オブジェクトです。 呼び出し元は、IoGetDmaAdapter ルーチンへの以前の呼び出しからこのポインターを取得しました。

[in, optional] MaximumAddress

共通バッファーの最大論理アドレスを含む変数へのポインター。 このパラメーターは、このアドレスより下のメモリからバッファーを割り当てる必要があることを示します。 このパラメーターは省略可能であり、最大アドレスがないことを示すために NULL として指定できます。

[in] Length

DMA 操作に割り当てられる共通バッファーのサイズ (バイト単位)。

[out] LogicalAddress

このルーチンが、デバイスが共通バッファーへのアクセスに使用できる論理アドレスを書き込む変数へのポインター。 DMA デバイスでは、mmGetPhysicalAddressなどのルーチンによって返される物理アドレスの代わりに、この論理アドレスを使用する必要があります。

[in] CacheEnabled

ルーチンで、割り当てる共通バッファー内のキャッシュされたメモリを有効または無効にする必要があるかどうか。 TRUE の場合、キャッシュが有効になります。 FALSE の場合は無効になります。 ハードウェア プラットフォームで DMA 操作にキャッシュの一貫性が強制されない場合は、FALSE を渡します。 ARM または ARM 64 ベースのプロセッサ ターゲット コンピューターでのこのパラメーターについては、「解説」を参照してください。

[in] PreferredNode

メモリの割り当て元となる優先 NUMA ノード。 N がマルチプロセッサ システム内の NUMA ノードの数である場合、PreferredNode は 0 から N ~ 1 の範囲の数値になります。 1 プロセッサ システムまたは NUMA 以外のマルチプロセッサ システムの場合は、PreferredNode 0 に設定します。

戻り値

AllocateCommonBufferEx は、共通バッファーに割り当てられたメモリの仮想アドレスを返します。 バッファーを割り当てることができない場合は、NULL が返されます。

備考

AllocateCommonBufferEx は、名前で直接呼び出すことができるシステム ルーチンではありません。 このルーチンは、DMA_OPERATIONS 構造体で返されるアドレスからのポインターによってのみ呼び出すことができます。 ドライバーは、DeviceDescription パラメーターの Version メンバーをDEVICE_DESCRIPTION_VERSION3に設定して、IoGetDmaAdapter を呼び出すことによって、このルーチンのアドレスを取得します。 IoGetDmaAdapter が NULL 返す場合、このルーチンはプラットフォームでは使用できません。

AllocateCommonBufferEx は、AllocateCommonBuffer ルーチンの拡張バージョンです。 次の一覧は、拡張バージョンでのみ使用できる機能をまとめたものです。

  • 呼び出し元は、割り当てる共通バッファーの最大論理アドレスを指定できます。

  • 呼び出し元は、共通バッファーを割り当てる優先 NUMA ノードを指定できます。

ARM または ARM 64 ベースのプロセッサを搭載したコンピューターでは、システム ACPI のキャッシュ設定は、ドライバーによって渡される CacheEnabled パラメーター値よりも優先順位が高くなります。 ACPI _CCA メソッドが、デバイスがキャッシュコヒーレントではないことを示している場合、ドライバーがキャッシュされたメモリを割り当てて、キャッシュされたメモリを CacheEnabled TRUE に設定した場合でも、オペレーティング システムはキャッシュを無効にします。

ARM または ARM 64 ベースのプロセッサを搭載したコンピューターでは、オペレーティング システムは、キャッシュされていない共通バッファーをデバイス メモリとして割り当てます。 バッファーの詳細については、ARMv7 アーキテクチャ リファレンス マニュアルの A3.5.1 および A3.5.6 のセクションを参照してください。

プロセッサは、デバイス メモリへの不適切なアクセスを許可しません。 ドライバーは、自然に配置された操作を使用して、常に共通バッファーからデータにアクセスする必要があります。 ほとんどのカーネル ルーチンは、入力パラメーターとしてデバイス メモリを受け入れていません。 たとえば、ネットワーク ドライバーは、デバイス メモリ NdisMIndicateReceiveNetBufferListsに渡すことはできません。 ドライバーが DMA 共通バッファーからカーネル ルーチンにデータを渡す必要がある場合は、CacheEnabled TRUE に設定されたバッファーを割り当てるか、キャッシュされていない共通バッファーから一時的なプール割り当てにデータをコピーします。

共通バッファーを使用する DMA 操作の詳細については、次のトピックを参照してください。

共通バッファー を使用した

Common-Buffer Bus-Master DMA の使用の

Common-Buffer システム DMA の使用の

必要条件

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

関連項目

AllocateCommonBuffer

DMA_ADAPTER

DMA_OPERATIONS

IoGetDmaAdapter

MmGetPhysicalAddress