Compartilhar via


Versão 3 da Interface de Operações de DMA

A versão 3 da interface de operações de DMA está disponível a partir do Windows 8. A estrutura DMA_OPERATIONS para essa interface contém uma série de novas rotinas que não são definidas em versões anteriores dessa interface. Para obter uma lista das rotinas na versão 3, consulte DMA_OPERATIONS.

Embora a versão 3 da interface de operações de DMA esteja disponível em todas as plataformas de hardware do Windows, essa interface tem muitos recursos para permitir que os drivers do modo kernel usem os recursos avançados dos controladores de DMA do sistema em circuitos integrados do SoC (System on a Chip). Esses recursos normalmente incluem a capacidade de fazer transferências de DMA de dispersão/coleta. Por outro lado, as versões anteriores da interface de operações de DMA restringem transferências de DMA de dispersão/coleta para dispositivos master de barramento. A interface versão 3 simplifica o gerenciamento de listas de dispersão/coleta e reduz a necessidade de intervenção do driver durante transferências complexas de DMA.

Para usar a versão 3 da interface de operações de DMA para executar uma transferência de DMA, um driver normalmente chama as seguintes rotinas:

IoGetDmaAdapter
Aloca um objeto adaptador DMA e retorna um ponteiro para uma estrutura DMA_ADAPTER que contém a interface de operações de DMA.

GetDmaTransferInfo
Fornece uma descrição dos recursos necessários para executar a transferência de DMA descrita pelo chamador.

AllocateAdapterChannelEx
Aloca os recursos necessários para a transferência de DMA e atribui esses recursos ao objeto do adaptador DMA.

MapTransferEx
Inicializa os registros de mapa e o buffer de dispersão/coleta para a transferência de DMA e inicia a transferência.

FlushAdapterBuffersEx
Executa todas as operações de cache que podem ser necessárias no final da transferência de DMA.

FreeAdapterChannel
Libera o canal DMA e os registros de mapa.

PutDmaAdapter
Libera o objeto do adaptador.

Essas rotinas são usadas para dispositivos master de barramento que usam controladores DMA dedicados e para dispositivos subordinados que compartilham um controlador de DMA do sistema. Para obter uma descrição passo a passo das chamadas feitas por um driver durante uma transferência de DMA típica, consulte Padrão básico de chamada para rotinas de DMA versão 3.

Nota Na versão 3 da interface de operações de DMA, as chamadas para a rotina KeFlushIoBuffers não são necessárias antes ou depois das transferências de DMA. O motivo é que as seguintes rotinas abrangem a necessidade de liberar caches de dados em plataformas que não impõem a coerência de cache no hardware:

  • MapTransferEx garante que os caches de dados do processador sejam liberados antes das transferências de gravação (memória para dispositivo).
  • FlushAdapterBuffersEx garante que os caches sejam invalidados após transferências de leitura (dispositivo para memória).

Em um processador x86 ou x64, a chamada KeFlushIoBuffers não executa nenhuma operação e essa chamada, embora desnecessária, não interfere na operação da plataforma de hardware. Em um processador Arm, as chamadas para KeFlushIoBuffers durante transferências de DMA executam operações de cache desnecessárias e podem prejudicar o desempenho.