NdisMAllocateSharedMemory 関数 (ndis.h)
注意
ARM および ARM64 プロセッサの場合、NDIS ドライバー ライターは、NDIS 散布図/収集 DMA の代わりに WDF DMA または WDM DMA を使用することを強くお勧めします。
WDF DMA の詳細については、「KMDF ドライバーでの 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 返します。
戻り値
何一つ
備考
NdisMAllocateSharedMemory は、ドライバーが共有メモリ ブロックにアクセスするために使用するマップされた仮想アドレス範囲と、NIC が使用する NDIS_PHYSICAL_ADDRESS型の範囲の両方を提供します。 PhysicalAddress 返される値は、システムによって 2 倍にマップできます。 つまり、physicalAddress とLength の値によって記述される "物理" アドレス範囲は、可能なすべてのプラットフォームでの割り当てに対してホスト物理アドレスと一致しないマップされた論理アドレスの範囲にすることができます。
NdisMAllocateSharedMemory は、ミニポートInitializeEx からのみ呼び出すことができます。 要求する割り当ての大きさは、NIC の機能と機能を知っているドライバー ライターが、次のパフォーマンスとサイズのジレンマのトレードオフを決定する方法によって異なります。
-
ネットワーク トラフィックが多い期間に、ミニポート ドライバーは、デバイスアクセス可能なデータ バッファーの共有メモリ領域で実行が少ない場合、高い I/O スループットを維持できません。
たとえば、ミニポート ドライバーは、このようなバッファーが NIC に受信の洪水が発生したときにバインドされたプロトコル ドライバーから返されるよりも高速に共有メモリ内の受信バッファーを示す可能性があります。 未処理の受信バッファーによって共有メモリ領域がすべて消費される場合、ミニポート ドライバーは、受信バッファーに使用できる共有メモリ領域があるまで、NIC の受信割り込みを無効にする必要があります。
- 一方、Length を使用して NdisMAllocateSharedMemory を呼び出すと、ドライバーのイメージが大きくなり、そのリソース使用量が非常に高い I/O 要求のまれな期間を除き、非常に不経済になります。 さらに、NdisMAllocateSharedMemory 、十分なシステム メモリが利用できない場合は、ドライバーにこのような大きなブロックが与えられない可能性があり、ドライバーの初期化に失敗する必要があります。
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 |
関連項目
ミニポートSharedMemoryAllocateCompleteNdisAllocateMdl の
NdisMAllocateNetBufferSGList の
NdisMAllocateSharedMemoryAsyncEx のNdisMFreeSharedMemory の
NdisMGetDmaAlignment の
NdisMIndicateReceiveNetBufferLists のNdisMSetMiniportAttributes の
NdisSystemProcessorCount の