プロキシ ドライバーは、Windows ソケット スイッチが制御メッセージを転送し、RDMA 操作を実行できるように、ユーザー バッファーへのアクセスを設定する必要があります。 この種類のバッファー アクセスを要求するために、プロキシ ドライバーはデバイス オブジェクトの Flags メンバーのビットをDO_DIRECT_IOに設定します。 プロキシ ドライバーは、要求されるたびにメッセージ転送と RDMA に使用されるメモリを割り当てるか解放する必要もあります。 Windows ソケット スイッチが SAN サービス プロバイダーにメモリの登録または解放を要求すると、SAN サービス プロバイダーは、それぞれ物理メモリを割り当てるか解放するようにプロキシ ドライバーを要求します。 バッファー アクセスの設定とメモリの割り当てと解放の詳細については、「 メモリ管理とメモリバッファーの使用」を参照してください。
RDMA に低メモリを割り当てる
プロキシ ドライバーは、RDMA 操作にアクセスできるメモリを割り当てる必要があります。 プロキシ ドライバーは、4 GB 未満の物理メモリを割り当てないように構成されているシステムでも、RDMA 操作に低メモリを割り当てることができます。 (これは NOLOWMEM 構成と呼ばれます)。プロキシ ドライバーは、低メモリを取得するために 、MmAllocateContiguousMemorySpecifyCache 関数または独自の DMA AllocateCommonBuffer 関数を呼び出します。
DMA AllocateCommonBuffer 関数へのポインターを取得するには、プロキシ ドライバーは次の手順を実行します。
DEVICE_DESCRIPTION構造体をゼロで初期化し、その SAN NIC の関連情報をこの構造体に書き込みます。
IoGetDmaAdapter を呼び出して、その SAN NIC の DMA アダプター構造へのポインターを取得します。 この呼び出しでは、ドライバーは、埋め込まれたDEVICE_DESCRIPTION構造体へのポインターを渡します。 IoGetDmaAdapter は、 DMA_OPERATIONS 構造体へのポインターを含む DMA アダプター構造体へのポインターを返します。 DMA_OPERATIONSには、システム定義の DMA 関数のセットへのポインターが含まれています。 これらの関数の 1 つは AllocateCommonBuffer で、物理的に連続する DMA バッファーを割り当てます。