Alocando e liberando memória para um driver de proxy SAN
O driver de proxy deve configurar o acesso aos buffers do usuário para que o comutador Windows Sockets possa transferir mensagens de controle e executar operações RDMA. Para solicitar este tipo de acesso ao buffer, o driver de proxy define um bit no membro Flags do seu objeto de dispositivo para o DO_DIRECT_IO. O driver proxy também deve alocar ou liberar memória que é usada para transferência de mensagens e RDMA sempre que solicitado a fazê-lo. Quando o switch Windows Sockets solicita que um provedor de serviços de SAN registre ou libere memória, o provedor de serviços de SAN solicita seu driver de proxy para, respectivamente, alocar ou liberar memória física. Para obter mais informações sobre como configurar o acesso ao buffer e alocar e liberar memória, consulte de Gerenciamento de Memória e de Gerenciamento de Buffer.
Alocando pouca memória para RDMA
Um driver de proxy deve alocar memória que pode ser acessada para operações RDMA. O driver proxy pode alocar pouca memória para operações RDMA, mesmo em um sistema configurado para que nenhuma memória física abaixo de 4 GB possa ser alocada. (Isso é chamado de configuração NOLOWMEM.) O driver de proxy chama a função MmAllocateContiguousMemorySpecifyCache ou a sua própria função de DMA AllocateCommonBuffer para recuperar memória de baixa capacidade.
Para recuperar um ponteiro para a função DMA AllocateCommonBuffer, o driver de proxy executa os seguintes passos:
Zero-inicializa uma estrutura de DEVICE_DESCRIPTION e, em seguida, grava informações relevantes para sua SAN NIC nessa estrutura.
Chama IoGetDmaAdapter para recuperar um ponteiro para a estrutura do adaptador DMA para sua SAN NIC. Nesta chamada, o driver passa um ponteiro para a estrutura de DESCRIÇÃO_DO_DISPOSITIVO preenchida. IoGetDmaAdapter retorna um ponteiro para uma estrutura de adaptador DMA que contém um ponteiro para uma estrutura DMA_OPERATIONS. DMA_OPERATIONS contém ponteiros para um conjunto definido pelo sistema de funções DMA. Uma dessas funções é AllocateCommonBuffer, que aloca um buffer DMA fisicamente contíguo.