Asignar y liberar memoria para un controlador proxy SAN
El controlador proxy debe configurar el acceso a los búferes de usuario para que el conmutador de Windows Sockets pueda transferir mensajes de control y realizar operaciones RDMA. Para solicitar este tipo de acceso al búfer, el controlador proxy establece un bit en el miembro Flags de su objeto de dispositivo en DO_DIRECT_IO. El controlador proxy también debe asignar o liberar memoria que se usa para la transferencia de mensajes y RDMA siempre que se solicite hacerlo. Cuando el conmutador de Windows Sockets solicita a un proveedor de servicios SAN que registre o libere memoria, el proveedor de servicios SAN solicita a su controlador proxy que asigne o libere memoria física respectivamente. Para obtener más información sobre cómo configurar el acceso al búfer y asignar y liberar memoria, consulte Administración de memoria y Administración de búferes.
Asignar memoria baja para RDMA
Un controlador proxy debe asignar memoria a la que se pueda acceder para las operaciones RDMA. El controlador proxy puede asignar poca memoria para las operaciones RDMA incluso en un sistema configurado para que no se pueda asignar ninguna memoria física por debajo de 4 GB. (Esto se denomina configuración NOLOWMEM). El controlador proxy llama a la función MmAllocateContiguousMemorySpecifyCache o a su propia función AllocateCommonBuffer de DMA para recuperar memoria baja.
Para recuperar un puntero a su función AllocateCommonBuffer de DMA, el controlador proxy realiza los pasos siguientes:
Inicializa cero una estructura de DEVICE_DESCRIPTION y, a continuación, escribe información relevante para su NIC san en esta estructura.
Llama a IoGetDmaAdapter para recuperar un puntero a la estructura del adaptador DMA para su NIC san. En esta llamada, el controlador pasa un puntero a la estructura DEVICE_DESCRIPTION rellenada. IoGetDmaAdapter devuelve un puntero a una estructura del adaptador DMA que contiene un puntero a una estructura de DMA_OPERATIONS . DMA_OPERATIONS contiene punteros a un conjunto definido por el sistema de funciones DMA. Una de estas funciones es AllocateCommonBuffer, que asigna un búfer DMA físicamente contiguo.