Usando E/S Direta
Os drivers para dispositivos que podem transferir grandes quantidades de dados por vez devem usar E/S direta para essas transferências. O uso de E/S direta para grandes transferências melhora o desempenho de um driver, reduzindo sua sobrecarga de interrupção e eliminando as operações de alocação de memória e cópia inerentes à E/S em buffer.
Geralmente, os drivers de dispositivo de armazenamento em massa solicitam E/S direta para solicitações de transferência, incluindo drivers de nível mais baixo que usam DMA (acesso direto à memória) ou E/S programado (PIO), bem como quaisquer drivers intermediários encadeados acima deles.
O gerente de E/S determina que uma operação de E/S está usando E/S direta da seguinte maneira:
Para solicitações de IRP_MJ_READ e IRP_MJ_WRITE , DO_DIRECT_IO é definido no membro Flags da estrutura DEVICE_OBJECT . Para obter mais informações, consulte Inicializando um objeto device.
Para solicitações de IRP_MJ_DEVICE_CONTROL e IRP_MJ_INTERNAL_DEVICE_CONTROL , o valor do código IOCTL contém METHOD_IN_DIRECT ou METHOD_OUT_DIRECT como o valor TransferType no valor IOCTL. Para obter mais informações, consulte Definindo códigos de controle de E/S.
Os drivers que usam E/S direta às vezes também usarão E/S em buffer para lidar com alguns IRPs. Em particular, os drivers normalmente usam E/S em buffer para alguns códigos de controle de E/S para solicitações de IRP_MJ_DEVICE_CONTROL que exigem transferências de dados, independentemente de o driver usar E/S direta para operações de leitura e gravação.
A configuração de uma transferência direta de E/S varia ligeiramente, dependendo se o DMA ou o PIO está sendo usado. Para obter mais informações, consulte:
Os drivers devem tomar medidas para manter a coerência do cache durante as transferências de DMA e PIO. Para obter mais informações, consulte Mantendo a coerência do cache.