Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Para usar o DMA baseado em pacotes, os drivers de dispositivos DMA de mestre de barramento chamam a seguinte sequência geral de rotinas de suporte enquanto processam um IRP solicitando uma transferência de DMA:
KeFlushIoBuffers pouco antes de tentar alocar registros de mapa para uma solicitação de transferência (para obter mais informações, consulte Mantendo a coerência de cache)
AllocateAdapterChannel quando o driver está pronto para programar o adaptador bus-master para DMA
MmGetMdlVirtualAddress para obter um índice no MDL, necessário como parâmetro inicial para MapTransfer, e MapTransfer para tornar acessível a memória física do sistema que suporta o dispositivo de buffer do IRP
Observe que qualquer driver pode precisar realizar mais de uma operação de transferência para satisfazer o IRP atual, conforme explicado em Dividir solicitações de transferência. Os drivers de dispositivos que não têm recursos de dispersão/coleta podem chamar MapTransfer uma vez por operação de transferência. Os drivers de dispositivos que têm recursos de dispersão/coleta podem chamar MapTransfer mais de uma vez para configurar cada operação de transferência. Como alternativa, esses drivers podem usar o suporte de dispersão/coleta integrado do sistema, descrito em Usando DMA de dispersão/coleta.
FlushAdapterBuffers no final de cada operação de transferência DMA de/para o dispositivo de destino, a fim de determinar se todos os dados solicitados foram completamente transferidos
FreeMapRegisters assim que todas as operações DMA para o IRP atual forem concluídas, quando todos os dados solicitados forem completamente transferidos ou quando o driver deva rejeitar o IRP devido a um erro de E/S de dispositivo ou de barramento
O ponteiro do objeto do adaptador retornado por IoGetDmaAdapter é um parâmetro necessário para AllocateAdapterChannel, MapTransfer, FlushAdapterBuffers e FreeMapRegisters. Observe que em versões do Windows NT anteriores ao Windows 2000, dispositivos bus-master podem passar um ponteiro de objeto de adaptador NULL para MapTransfer e FlushAdapterBuffers. No Windows 2000 e posterior, os drivers não podem mais fazê-lo.
KeFlushIoBuffers e MmGetMdlVirtualAddress exigem um ponteiro para o MDL em Irp->MdlAddress.
Drivers individuais chamam essa sequência de rotinas de suporte em pontos diferentes, dependendo de como cada driver é implementado para fazer a manutenção de seu dispositivo. Por exemplo, a rotina StartIo de um condutor pode fazer a chamada para AllocateAdapterChannel, enquanto outro condutor pode fazer essa chamada a partir de uma rotina que remove IRPs de uma fila intertravada criada pelo condutor ou fila de dispositivos do condutor.
Em vez de usar as rotinas descritas nesta seção, qualquer driver que use DMA baseado em pacotes pode usar rotinas de suporte destinadas a simplificar a dispersão/coleta de DMA, independentemente de seu dispositivo ter suporte interno de dispersão/coleta. Consulte Utilização de DMA de Scatter/Gather para obter detalhes.