Usando E/S Direta com DMA

A figura a seguir ilustra como o gerente de E/S configura uma solicitação de IRP_MJ_READ para uma operação de transferência de DMA que usa E/S direta.

diagrama ilustrando e/s diretas em buffers de usuário para dispositivos que usam dma.

A figura anterior ilustra como os drivers podem usar o MdlAddress do IRP para transferir dados para uma solicitação de leitura. O driver na figura usa o sistema baseado em pacotes ou o DMA de master de barramento e tem Sinalizadores do objeto do dispositivo com DO_DIRECT_IO.

  1. Alguns intervalos de endereços virtuais de espaço do usuário representam o buffer do thread atual e o conteúdo desse buffer pode realmente ser armazenado em algumas páginas fisicamente descontínuas (sombreamento escuro na figura anterior). O gerenciador de E/S cria um MDL para descrever esse buffer. Um MDL é uma estrutura de dados opaca, definida pelo gerenciador de memória, que mapeia um determinado intervalo de endereços virtuais para um ou mais intervalos de endereços físicos baseados em página. Para obter mais informações, consulte Usando MDLs.

  2. O gerenciador de E/S atende à solicitação de leitura do thread atual, para a qual o thread passa por um intervalo de endereços virtuais de espaço do usuário que representam um buffer.

  3. O FSD (gerenciador de E/S ou driver do sistema de arquivos) verifica o buffer fornecido pelo usuário quanto à acessibilidade e chama MmProbeAndLockPages com o MDL criado anteriormente. MmProbeAndLockPages também preenche o intervalo de endereços físicos correspondente no MDL.

    Como mostra a figura anterior, um MDL para um intervalo virtual pode ter várias entradas de endereço físico baseadas em página correspondentes, e o intervalo virtual de um buffer pode começar e terminar em algum deslocamento de bytes desde o início da primeira e última páginas descritas por um MDL.

  4. O gerenciador de E/S fornece um ponteiro para o MDL (MdlAddress) em um IRP que solicita uma operação de transferência. Até que o gerenciador de E/S ou o sistema de arquivos chame MmUnlockPages depois que o driver concluir o IRP, as páginas físicas descritas no MDL permanecerão bloqueadas e atribuídas ao buffer. No entanto, os endereços virtuais em tal MDL podem se tornar invisíveis (e inválidos), mesmo antes de o IRP ser enviado para o driver do dispositivo ou para qualquer driver intermediário que possa estar em camadas acima do driver do dispositivo.

  5. Se o driver usar o sistema baseado em pacotes ou o DMA do bus-master, sua rotina AdapterControlchamará MmGetMdlVirtualAddress com o ponteiro MdlAddress do IRP para obter o endereço virtual base para as entradas baseadas em página do MDL.

  6. A rotina AdapterControl chama MapTransfer com o endereço base retornado por MmGetMdlVirtualAddress para ler dados do dispositivo diretamente na memória física. (Para obter mais informações, consulte Objetos do adaptador e DMA.)

Os drivers devem sempre marcar comprimentos de buffer. Observe que o gerenciador de E/S não cria um MDL para um buffer de comprimento zero.