Partager via


Utilisation d’E/S directes avec DMA

La figure suivante illustre la façon dont le gestionnaire d’E/S configure une demande IRP_MJ_READ pour une opération de transfert DMA qui utilise des E/S directes.

diagramme illustrant les e/s directes sur les mémoires tampons utilisateur pour les appareils qui utilisent dma.

La figure précédente illustre comment les pilotes peuvent utiliser mdlAddress de l’IRP pour transférer des données pour une demande de lecture. Le pilote dans la figure utilise un système basé sur des paquets ou un DMA master bus, et a ORed les indicateurs de l’objet d’appareil avec DO_DIRECT_IO.

  1. Une plage d’adresses virtuelles d’espace utilisateur représente la mémoire tampon du thread actuel, et le contenu de cette mémoire tampon peut en fait être stocké sur un certain nombre de pages physiquement discontigues (ombrage foncé dans la figure précédente). Le gestionnaire d’E/S crée une MDL pour décrire cette mémoire tampon. Un MDL est une structure de données opaque, définie par le gestionnaire de mémoire, qui mappe une plage d’adresses virtuelle particulière à une ou plusieurs plages d’adresses physiques basées sur une page. Pour plus d’informations, consultez Utilisation de dll MDL.

  2. Le gestionnaire d’E/S traite la demande de lecture du thread actuel, pour laquelle le thread transmet une plage d’adresses virtuelles d’espace utilisateur qui représentent une mémoire tampon.

  3. Le gestionnaire d’E/S ou le pilote de système de fichiers (FSD) vérifie l’accessibilité de la mémoire tampon fournie par l’utilisateur et appelle MmProbeAndLockPages avec le MDL créé précédemment. MmProbeAndLockPages remplit également la plage d’adresses physiques correspondante dans le MDL.

    Comme le montre la figure précédente, une MDL pour une plage virtuelle peut avoir plusieurs entrées d’adresses physiques basées sur une page correspondantes, et la plage virtuelle d’une mémoire tampon peut commencer et se terminer à un décalage d’octet à partir du début de la première et de la dernière pages décrites par un MDL.

  4. Le gestionnaire d’E/S fournit un pointeur vers le MDL (MdlAddress) dans un IRP qui demande une opération de transfert. Jusqu’à ce que le gestionnaire d’E/S ou le système de fichiers appelle MmUnlockPages une fois que le pilote a terminé l’IRP, les pages physiques décrites dans le MDL restent verrouillées et affectées à la mémoire tampon. Toutefois, les adresses virtuelles d’une telle MDL peuvent devenir invisibles (et non valides), même avant l’envoi de l’IRP au pilote de périphérique ou à tout pilote intermédiaire qui peut être superposé au pilote de périphérique.

  5. Si le pilote utilise un système basé sur des paquets ou master DMA de bus, sa routine AdapterControl appelle MmGetMdlVirtualAddress avec le pointeur MdlAddress de l’IRP pour obtenir l’adresse virtuelle de base pour les entrées basées sur la page du MDL.

  6. La routine AdapterControl appelle ensuite MapTransfer avec l’adresse de base retournée par MmGetMdlVirtualAddress pour lire les données de l’appareil directement dans la mémoire physique. (Pour plus d’informations, consultez Adapter Objects and DMA.)

Les pilotes doivent toujours case activée longueurs de mémoire tampon. Notez que le gestionnaire d’E/S ne crée pas de MDL pour une mémoire tampon de longueur nulle.