Compartilhar via


Usando Packet-Based Bus-Master DMA

Para usar o AMD baseado em pacotes, os drivers de dispositivos DMA master 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 Manutenção da coerência de cache)

  • AllocateAdapterChannel quando o driver estiver pronto para programar o adaptador de barramento master para DMA

  • MmGetMdlVirtualAddress para obter um índice no MDL, necessário como um parâmetro inicial para MapTransfer e MapTransfer para tornar a memória física do sistema que apoia o dispositivo de buffer do IRP acessível pelo dispositivo de buffer

    Observe que qualquer driver pode precisar executar mais de uma operação de transferência para atender ao IRP atual, conforme explicado em Dividir Solicitações de Transferência. Drivers de dispositivos que não têm recursos de dispersão/coleta podem chamar MapTransfer uma vez por operação de transferência. 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 interno de dispersão/coleta do sistema, descrito em Usando o DMA de dispersão/coleta.

  • FlushAdapterBuffers no final de cada operação de transferência de 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 de DMA para o IRP atual são feitas, porque todos os dados solicitados foram completamente transferidos ou porque o driver deve falhar no IRP devido a um erro de E/S de dispositivo ou 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 master de barramento poderiam passar um ponteiro de objeto do adaptador NULL para MapTransfer e FlushAdapterBuffers. No Windows 2000 e posterior, os drivers não podem mais fazer isso.

KeFlushIoBuffers e MmGetMdlVirtualAddress exigem um ponteiro para o MDL em Irp-MdlAddress>.

Drivers individuais chamam essa sequência de rotinas de suporte em diferentes pontos, dependendo de como cada driver é implementado para atender seu dispositivo. Por exemplo, a rotina StartIo de um driver pode fazer a chamada para AllocateAdapterChannel, enquanto outro driver pode fazer essa chamada de uma rotina que remove IRPs de uma fila ou fila de dispositivos interconectada criada pelo driver.

Em vez de usar as rotinas descritas nesta seção, qualquer driver que usa DMA baseado em pacotes pode usar rotinas de suporte destinadas a simplificar o DMA de dispersão/coleta, independentemente de seu dispositivo ter suporte interno de dispersão/coleta. Consulte Usando o DMA de dispersão/coleta para obter detalhes.