Compartilhar via


Usando Common-Buffer Bus-Master DMA

Conforme descrito em Usando Bus-Master DMA, alguns drivers para dispositivos DMA master de barramento usam dMA de buffer comum exclusivamente e alguns usam DMA de buffer comum em combinação com DMA baseado em pacotes.

Use o DMA de buffer comum economicamente. A configuração de um buffer comum pode vincular alguns (ou todos, dependendo do tamanho do buffer solicitado) dos registros de mapa associados ao objeto do adaptador que representa o adaptador de master de barramento.

Configurar áreas de buffer comum economicamente, como usando PAGE_SIZE partes ou uma única alocação, deixa mais registros de mapa disponíveis para operações de DMA baseadas em pacotes. Ele também deixa mais memória do sistema livre para outras finalidades, o que produz melhor desempenho geral do driver e do sistema.

Para configurar um buffer comum para o DMA master de barramento, um driver de dispositivo DMA master de barramento deve chamar AllocateCommonBuffer com o ponteiro de objeto do adaptador retornado por IoGetDmaAdapter. Normalmente, um driver faz essa chamada de sua rotina DispatchPnP para solicitações de IRP_MN_START_DEVICE . Um driver deverá alocar um buffer comum somente se ele usar o buffer repetidamente para suas operações de DMA enquanto o driver permanecer carregado. O diagrama a seguir ilustra essa chamada para AllocateCommonBuffer.

diagrama ilustrando a alocação de um buffer comum para dma master de barramento.

O tamanho solicitado para o buffer, mostrado no diagrama anterior como LengthForBuffer, determina quantos registros de mapa devem ser usados para fornecer um mapeamento virtual para lógico para o buffer comum. Use a macro BYTES_TO_PAGES para determinar o número máximo de páginas necessárias (BYTES_TO_PAGES (LengthForBuffer)). Esse valor não pode ser maior que o NumberOfMapRegisters retornado por IoGetDmaAdapter.

Além disso, o chamador deve fornecer o seguinte:

  • Um valor booliano que indica se o cache deve ser habilitado

    Nota Esse valor é ignorado. O sistema operacional determina se a memória armazenada em cache deve ser habilitada no buffer comum a ser alocado. Essa decisão é baseada na arquitetura do processador e no barramento de dispositivo.

    Em computadores com processadores baseados em x86, baseados em x64 e itanium, a memória armazenada em cache é habilitada.

    Em computadores com processadores arm ou arm 64, o sistema operacional não habilita automaticamente a memória armazenada em cache para todos os dispositivos. O sistema depende do método ACPI_CCA para cada dispositivo determinar se o dispositivo é coerente com cache.

  • Um ponteiro para uma variável definida pelo driver que conterá o Endereço Lógico base acessível pelo dispositivo para o buffer (BufferLogicalAddress no diagrama anterior) no retorno de AllocateCommonBuffer

Se a chamada for bem-sucedida, AllocateCommonBuffer retornará um endereço virtual base acessível pelo driver para o buffer (BufferVirtualAddress no diagrama anterior), que o driver deve salvar em sua extensão de dispositivo, extensão do controlador ou outra área de armazenamento residente acessível pelo driver (pool nãopagado alocado pelo driver).

AllocateCommonBuffer retornará NULL se não puder alocar memória para o buffer. Se o endereço virtual base retornado for NULL, o driver deverá usar exclusivamente o suporte de DMA baseado em pacotes do sistema ou o driver deverá falhar na solicitação de IRP_MN_START_DEVICE , retornando STATUS_INSUFFICIENT_RESOURCES.

Caso contrário, o driver pode usar o buffer comum alocado como uma área de armazenamento acessível por driver e adaptador para transferências de DMA.

Quando o gerenciador PnP envia um IRP que para ou remove o dispositivo, o driver deve chamar FreeCommonBuffer para liberar cada buffer comum alocado.