Compartilhar via


Obtendo um objeto Adapter

Na inicialização do dispositivo, um driver que usa o sistema ou o DMA master de barramento chama IoGetDmaAdapter para obter um ponteiro para um objeto de adaptador e determinar o número máximo de registros de mapa disponíveis para cada operação de transferência. Quando um driver chama IoGetDmaAdapter, o gerente de E/S, por sua vez, chama o HAL para obter as informações específicas da plataforma necessárias.

Um driver deve fornecer determinadas informações em uma estrutura de DEVICE_DESCRIPTION definida pelo sistema em sua chamada para IoGetDmaAdapter. Os drivers devem usar RtlZeroMemory para inicializar a estrutura DEVICE_DESCRIPTION com zeros antes de definir valores nela.

Os dados necessários incluem informações sobre os recursos do dispositivo do driver, como se o dispositivo é um master de barramento, se ele tem recursos de dispersão/coleta e quantos bytes de dados o dispositivo pode transferir por vez (MaximumLength).

Os dados de descrição do dispositivo necessários também incluem informações específicas da plataforma, como o número específico da plataforma e atribuído pelo sistema do barramento que um motorista de um dispositivo master de ônibus controla. Um driver pode obter essas informações chamando IoGetDeviceProperty.

A estrutura DEVICE_DESCRIPTION inclui alguns campos que podem ser irrelevantes para alguns dispositivos ou drivers de AMD. Por exemplo, o campo BusNumber não é usado em drivers WDM. Cada driver deve fornecer valores para os membros da estrutura relevantes e deve definir os valores para todos os outros membros como zero.

O driver de um dispositivo subordinado não deve passar TRUE no campo ScatterGather , a menos que o dispositivo seja capaz de esperar que o controlador de DMA do sistema seja reprogramado quando uma solicitação precisar ser dividida em duas ou mais operações de DMA.

IoGetDmaAdapter retorna um ponteiro para um objeto de adaptador e um valor específico da plataforma ou específico do dispositivo que indica quantos registros de mapa estão disponíveis com o objeto do adaptador para cada operação de transferência de DMA.

O objeto adaptador retornado contém três campos acessíveis aos drivers:

  • Número de versão (versão)

  • Tamanho (Tamanho)

  • Ponteiro para uma estrutura de DMA_OPERATIONS (DmaOperations)

A estrutura DMA_OPERATIONS compreende uma tabela de ponteiros para funções que o driver deve usar para executar operações de DMA em seu dispositivo. As funções são acessíveis somente por meio dos ponteiros nessa estrutura de dados; um driver não pode chamá-los diretamente pelo nome. (Observe que essas rotinas substituem rotinas HalXxx com suporte em versões anteriores do Windows NT. Para garantir a compatibilidade de drivers herdados, os arquivos de cabeçalho Wdm.h e Ntddk.h fornecem macros com os nomes obsoletos, mas os novos drivers sempre devem chamar as funções por meio da estrutura de dados.)

O número de registros de mapa pode variar de dispositivo para dispositivo e de plataforma para plataforma. Em geral, o HAL atribui vários registros de mapa de acordo com os seguintes critérios:

  • Se possível, o HAL retorna um valor que é um a mais do que o número de registros de mapa necessários para transferir o MaximumLength bytes, conforme especificado na chamada do driver para IoGetDmaAdapter.

  • Caso contrário, o HAL retornará um valor menor que é o maior possível para a plataforma específica.

Em outras palavras, o HAL geralmente fornece a cada driver registros de mapa suficientes para maximizar a taxa de transferência de DMA para seu dispositivo, mas o HAL pode retornar um valor menor em algumas plataformas Windows. Não há nenhuma garantia de que um driver obterá o número de registros de mapa que ele solicita, portanto, os drivers devem sempre marcar o valor retornado.

Qualquer driver de dispositivo DMA deve fornecer armazenamento para o ponteiro do objeto do adaptador e o valor NumberOfMapRegisters retornado por IoGetDmaAdapter. Esse ponteiro é um parâmetro necessário para as rotinas de suporte fornecidas pelo sistema usadas para DMA. Como muitas dessas rotinas de suporte devem ser chamadas em IRQL = DISPATCH_LEVEL, o armazenamento alocado pelo driver deve ser residente. A maioria dos drivers de AMD fornece o armazenamento necessário em uma extensão de dispositivo. No entanto, o armazenamento poderá estar em uma extensão do controlador se o driver também usar um objeto de controlador ou em um pool nãopagado alocado pelo driver. Consulte Alocando System-Space memória e gerenciando prioridades de hardware para obter mais informações.

Quando o driver tiver concluído todas as operações de DMA, ele chamará PutDmaAdapter para liberar o objeto do adaptador.

As seções a seguir Usando dma do sistema e usando Bus-Master DMA) descrevem como drivers monolíticos de dispositivos DMA usam rotinas de suporte para atender às solicitações de transferência. Estas seções pressupõem que o driver tenha o seguinte:

  • Uma rotina StartIo padrão, em vez de configurar e gerenciar uma fila interna de IRPs

  • Uma rotina interna para dividir solicitações de transferência para as quais um número insuficiente de registros de mapa está disponível

  • Nenhuma restrição de DMA específica do dispositivo

Em outras palavras, essas seções descrevem a técnica mais simples possível para operações de DMA dos drivers, mas os drivers individuais não usam necessariamente exatamente as mesmas técnicas. Para qualquer driver de um dispositivo DMA, quais rotinas de driver devem dividir grandes solicitações de transferência de DMA depende do modelo de driver (classe/porta ou monolítico), dos recursos do dispositivo e de quaisquer restrições de DMA específicas do dispositivo que o driver deve manipular.