为 SAN 上的操作注册内存

Windows 套接字交换机调用 SAN 服务提供商的扩展函数来注册所有数据缓冲区,以便在系统区域网络上发送和接收消息以及执行 RDMA 操作。 这些扩展函数将缓冲区注册到物理内存区域,以便在连接到远程对等方的特定 SAN 套接字上使用。 有关这些扩展函数的说明,请参阅 适用于 SAN 的 Windows 套接字 SPI 扩展

注册数据缓冲区

该交换机代表在本地进程中运行的应用程序调用 SAN 服务提供商的 WSPRegisterMemory 扩展函数,以注册只能由该进程访问的数据缓冲区。 WSPRegisterMemory 返回的缓冲区句柄仅在执行注册的本地进程的上下文中有效。 该交换机调用 WSPRegisterMemory 来注册在调用 WSPRecv 函数时用作消息接收缓冲区的缓冲区,或在调用 WSPSend 函数时发送缓冲区的消息。 该开关还调用 WSPRegisterMemory 来注册在调用 WSPRdmaRead 扩展函数时用作本地接收 RDMA 缓冲区的缓冲区,或者在调用 WSPRdmaWrite 扩展函数时注册本地 RDMA 源。 本地进程使用已注册到 WSPRegisterMemory 的缓冲区后,开关调用 WSPDeregisterMemory 扩展函数来释放这些缓冲区。

该交换机代表在本地进程中运行的应用程序调用 SAN 服务提供商的 WSPRegisterRdmaMemory 扩展函数,以注册本地和远程进程都可以访问的 RDMA 缓冲区。 WSPRegisterRdmaMemory 返回的缓冲区描述符仅对远程对等节点连接到执行注册的 SAN 套接字的上下文中启动的 RDMA 数据传输操作有效。 远程对等连接的交换机使用这些 RDMA 缓冲区作为调用 WSPRdmaWrite 扩展函数的目标,或调用 WSPRdmaRead 扩展函数中的源。 本地和远程进程使用已注册到 WSPRegisterRdmaMemory 的缓冲区后,交换机调用 WSPDeregisterRdmaMemory 扩展函数来释放这些缓冲区。

管理内存访问

SAN 服务提供商必须阻止对已注册内存的未经授权的访问。

内存必须注册并可供访问,如下所示:

为本地访问注册的内存应仅适用于名为 WSPRegisterMemory 的交换机的进程。

通过名为 WSPRegisterRdmaMemory 的交换机注册内存的进程或连接到内存注册到的 SAN 套接字的远程对等方,可以访问为本地和远程访问注册的内存。

只有在注册和建立连接时,才能访问内存。 SAN 服务提供商必须确保它不会无意中使同一台计算机或 SAN 上其他计算机上运行的其他进程可访问此类内存。

仅针对读取访问注册的内存不能用于写入访问。 仅针对写入访问注册的内存不能用于读取访问。

使用已注册的内存

交换机为每个连接的 TCP 套接字注册两个几乎连续的内存区域,以用于协商数据传输会话。 调用 SAN 服务提供商的 WSPSend 函数时,交换机使用一个内存区域来提供包含发送数据的消息缓冲区。 调用 SAN 服务提供商的 WSPRecv 函数时,该交换机使用内存的其他区域来发布消息缓冲区以接收数据。

通常,仅当交换机在 RDMA 操作中传输应用程序数据时,才会注册 RDMA 缓冲区。

在交换机关闭套接字之前,交换机会调用 SAN 服务提供程序的 WSPDeregisterMemoryWSPDeregisterRdmaMemory 函数,以释放挂起的数据传输操作当前未使用的任何内存。 SAN 服务提供程序还必须释放与未完成数据传输操作关联的内存。