为 SAN 代理驱动程序分配和释放内存

代理驱动程序必须设置对用户缓冲区的访问权限,以便 Windows 套接字交换机可以传输控制消息并执行 RDMA作。 若要请求这种类型的缓冲区访问,代理驱动程序将其设备对象的Flags成员中的一个位设置为DO_DIRECT_IO。 代理驱动程序还必须分配或释放用于消息传输和 RDMA 的内存,只要请求这样做。 当 Windows 套接字交换机请求 SAN 服务提供商注册或释放内存时,SAN 服务提供商会请求其代理驱动程序分别分配或释放物理内存。 有关设置缓冲区访问和分配和释放内存的详细信息,请参阅内存管理和使用内存缓冲区

为 RDMA 分配低内存

代理驱动程序必须分配可以用于 RDMA 操作访问的内存。 代理程序驱动即使在配置为无法分配低于4 GB物理内存的系统上,也能够为RDMA操作分配低内存。 (这称为 NOLOWMEM 配置。代理驱动程序调用 MmAllocateContiguousMemorySpecifyCache 函数或其自己的 DMA AllocateCommonBuffer 函数来检索内存不足。

若要检索指向其 DMA AllocateCommonBuffer 函数的指针,代理驱动程序将执行以下步骤:

  1. DEVICE_DESCRIPTION结构零初始化,然后将其 SAN NIC 的相关信息写入此结构。

  2. 调用 IoGetDmaAdapter 以检索指向其 SAN NIC 的 DMA 适配器结构的指针。 在此调用中,驱动程序将指针传递给已填充的“DEVICE_DESCRIPTION”结构。 IoGetDmaAdapter 返回一个指向 DMA 适配器结构的指针,该结构中包含一个指向 DMA_OPERATIONS 结构的指针。 DMA_OPERATIONS包含指向系统定义的 DMA 函数集的指针。 其中一个函数是 AllocateCommonBuffer,它分配物理连续的 DMA 缓冲区。