次の方法で共有


NdisMAllocateSharedMemory 関数 (ndis.h)

注意

ARM および ARM64 プロセッサの場合、NDIS ドライバー ライターは、NDIS 散布図/収集 DMA の代わりに WDF DMA または WDM DMA を使用することを強くお勧めします。

WDF DMA の詳細については、「KMDF ドライバーでの DMA 操作の処理」を参照してください。

WDM DMA の詳細については、ドライバーの入力/出力の管理の の DMA 関連の子トピックを参照してください。

NdisMAllocateSharedMemory は、ホスト システムと DMA NIC の両方からメモリ範囲に同時にアクセスできるように、ホスト メモリ範囲を割り当ててマップします。

構文

void NdisMAllocateSharedMemory(
  [in]  NDIS_HANDLE            MiniportAdapterHandle,
  [in]  ULONG                  Length,
  [in]  BOOLEAN                Cached,
  [out] PVOID                  *VirtualAddress,
  [out] PNDIS_PHYSICAL_ADDRESS PhysicalAddress
);

パラメーター

[in] MiniportAdapterHandle

ミニポートInitializeEx するハンドル入力を指定します。

[in] Length

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

[in] Cached

このパラメーターは無視されます (キャッシュされたメモリは常に x86 および x64 システムで使用されます)。

[out] VirtualAddress

この関数がミニポート ドライバーで使用する割り当ての基本仮想アドレスを返す呼び出し元が指定した変数へのポインター。 NdisMAllocateSharedMemory 呼び出し元を満たすことができない場合は、メモリが割り当てられていないことを示 NULL を返します。

[out] PhysicalAddress

呼び出し元が指定した変数へのポインター。この関数は、VirtualAddressで返されたアドレスに対応する、NIC で使用するのに適した物理アドレスを返すか、または NULL 返します。

戻り値

何一つ

備考

ミニポート ドライバーは、既に NdisMRegisterScatterGatherDma 呼び出しているか、NdisMRegisterDmaChannel して、NdisMAllocateSharedMemory を呼び出す前に、散布図/収集 DMA チャネル初期化する必要があります。
 
Microsoft Windows Server 2003、Windows XP Service Pack 1、およびそれ以降のバージョンの Windows では、バス マスター DMA NIC と下位 DMA NIC の両方が NdisMAllocateSharedMemory 呼び出すことができます。 以前のリリースでは、バス マスター DMA NIC のみが ndisMAllocateSharedMemory 呼び出すことを許可しています。 これらの以前のリリースでは、ミニポートInitializeEx が、NDISMSetMiniportAttributes 呼び出されたときに NIC がバス マスターであることを指定しなかった場合、NdisMAllocateSharedMemory 割り当てを試みずに制御を返します。

NdisMAllocateSharedMemory は、ドライバーが共有メモリ ブロックにアクセスするために使用するマップされた仮想アドレス範囲と、NIC が使用する NDIS_PHYSICAL_ADDRESS型の範囲の両方を提供します。 PhysicalAddress 返される値は、システムによって 2 倍にマップできます。 つまり、physicalAddress Length の値によって記述される "物理" アドレス範囲は、可能なすべてのプラットフォームでの割り当てに対してホスト物理アドレスと一致しないマップされた論理アドレスの範囲にすることができます。

NdisMAllocateSharedMemory は、ミニポートInitializeEx からのみ呼び出すことができます。 要求する割り当ての大きさは、NIC の機能と機能を知っているドライバー ライターが、次のパフォーマンスとサイズのジレンマのトレードオフを決定する方法によって異なります。

  • ネットワーク トラフィックが多い期間に、ミニポート ドライバーは、デバイスアクセス可能なデータ バッファーの共有メモリ領域で実行が少ない場合、高い I/O スループットを維持できません。

    たとえば、ミニポート ドライバーは、このようなバッファーが NIC に受信の洪水が発生したときにバインドされたプロトコル ドライバーから返されるよりも高速に共有メモリ内の受信バッファーを示す可能性があります。 未処理の受信バッファーによって共有メモリ領域がすべて消費される場合、ミニポート ドライバーは、受信バッファーに使用できる共有メモリ領域があるまで、NIC の受信割り込みを無効にする必要があります。

  • 一方、Length を使用して NdisMAllocateSharedMemory を呼び出すと、ドライバーのイメージが大きくなり、そのリソース使用量が非常に高い I/O 要求のまれな期間を除き、非常に不経済になります。 さらに、NdisMAllocateSharedMemory 、十分なシステム メモリが利用できない場合は、ドライバーにこのような大きなブロックが与えられない可能性があり、ドライバーの初期化に失敗する必要があります。
を提供するミニポート ドライバー ミニポートSharedMemoryAllocateComplete 関数は、上記のパフォーマンスとサイズのジレンマを解決する上でかなり柔軟性があります。 ミニポートInitializeEx は、ドライバーが ミニポートSharedMemoryAllocateComplete 関数を持っている場合、NIC を介したネットワーク転送操作の中程度の需要のために、NdisMAllocateSharedMemory を持つ十分な共有メモリのみを割り当てる必要があります。 このようなミニポート ドライバーを呼び出すことができます。NdisMAllocateSharedMemoryAsyncEx 、NIC の転送要求が大きい期間に共有メモリを割り当てるために動的に されます。 転送の需要が高い場合、このようなドライバーは、割り当てられた追加のメモリ 解放する NdisMFreeSharedMemory を呼び出します。 NdisMAllocateSharedMemoryAsyncEx 呼び出し、ミニポートSharedMemoryAllocateComplete エクスポートできるのは、バス マスター DMA NIC のみであることに注意してください。 この機能は、下位 DMA NIC ではサポートされていません。

NdisMAllocateSharedMemory NdisMAllocateSharedMemoryAsyncEx は、仮想アドレスを使用するドライバーと NIC の間で共有されるホスト メモリを割り当てるために呼び出すことができる唯一の NdisXxx 関数です。これは、対応する論理アドレスを使用します。

ミニポート ドライバーは、DMA 中にキャッシュ ラインの破棄を防ぐために、ホスト データ キャッシュ ライン境界の不可欠な共有キャッシュ メモリから割り当てるバッファーを配置する必要があります。 キャッシュ ラインの破棄により、ドライバーのデータ整合性の問題が発生したり、データ整合性を維持するために過剰なデータ キャッシュ フラッシュが必要になり、ドライバー (およびシステム) の I/O パフォーマンスが低下したりする可能性があります。 ミニポートInitializeEx は、NdisMGetDmaAlignment を呼び出して、ドライバーが割り当てられた共有メモリの範囲内で設定するデバイスアクセス可能バッファーの現在のプラットフォームの配置境界を決定できます。

ミニポート ドライバーは、割り当てることができる共有メモリの量に制限を設定する必要があります。 この制限はドライバー固有であり、ドライバーがバッファーを使い果たさないように十分に高くする必要があります。 過剰に高い制限を設定しないでください。これにより、共有メモリが無駄に消費され、システムのパフォーマンスが低下する可能性があります。

ミニポートInitializeEx は、NdisMAllocateSharedMemory を呼び出す前に NdisSystemProcessorCount 呼び出す場合もあります。これは、ドライバー ライターがマルチプロセッサ コンピューターに大きな共有メモリ ブロックを割り当てる場合に、SMP マシンがワークステーションよりも NIC のネットワーク転送要求が高いネットワーク サーバーである可能性が高いことを前提とします。

NdisMAllocateSharedMemory への呼び出しが失敗した場合、ミニポートInitializeEx 小さい割り当てを要求して再度呼び出すことができます。 ただし、ミニポートInitializeEx NIC に十分な共有メモリを割り当てることができない場合は、既に割り当てられているすべてのリソースを解放し、初期化に失敗する必要があります。

ミニポート ドライバーは、後で受信を示す場合NdisMIndicateReceiveNetBufferLists 、NIC の受信バッファーを共有メモリ ブロックにマップするバッファー プールからバッファー記述子の数を割り当てる必要があります。

割り当てられたメモリがキャッシュされ、したがって、転送時にフラッシュする必要がある場合、ミニポート ドライバーは、共有メモリ範囲のNDIS_BUFFER型記述子を割り当てるために NdisAllocateMdl 呼び出す必要があります。 ミニポート ドライバーは、このようなフラッシュを実行するには、このバッファー記述子 KeFlushIoBuffers を呼び出す必要があります。

ミニポート ドライバーが呼び出した場合NdisMAllocateSharedMemoryAsyncEx または NdisMAllocateSharedMemory 、NIC が削除されたときに、つまり、ミニポートHaltEx 関数が呼び出されたときに、NdisMFreeSharedMemory する 1 つ以上の呼び出しで、未処理のすべての割り当てを解放する必要があります。

必要条件

要件 価値
サポートされる最小クライアント NDIS 6.0 以降でサポートされています。
ターゲット プラットフォーム 万国
ヘッダー ndis.h (Ndis.h を含む)
ライブラリ Ndis.lib
IRQL PASSIVE_LEVEL

関連項目

KeFlushIoBuffers

ミニポートHaltEx

ミニポートInitializeEx

ミニポートSharedMemoryAllocateComplete

NdisAllocateMdl

NdisMAllocateNetBufferSGList

NdisMAllocateSharedMemoryAsyncEx

NdisMFreeSharedMemory

NdisMGetDmaAlignment

NdisMIndicateReceiveNetBufferLists

NdisMSetMiniportAttributes

NdisSystemProcessorCount