Verwenden der direkten E/A mit DMA

Die folgende Abbildung veranschaulicht, wie der E/A-Manager eine IRP_MJ_READ-Anforderung für einen DMA-Übertragungsvorgang einrichtet, der direkte E/A verwendet.

Diagramm zur Veranschaulichung von direkten E/A-Vorgängen auf Benutzerpuffern für Geräte, die dma verwenden.

Die vorherige Abbildung veranschaulicht, wie Treiber die MdlAddress des IRP verwenden können, um Daten für eine Leseanforderung zu übertragen. Der Treiber in der Abbildung verwendet paketbasiertes System oder busbasiertes master DMA und hat die Flags des Geräteobjekts mit DO_DIRECT_IO ORededed.

  1. Ein Bereich von virtuellen Benutzerspeicheradressen stellt den Puffer des aktuellen Threads dar, und der Inhalt dieses Puffers kann tatsächlich auf einer Anzahl physisch nicht ordnungsgemäßer Seiten gespeichert werden (dunkle Schattierung in der vorherigen Abbildung). Der E/A-Manager erstellt eine MDL, um diesen Puffer zu beschreiben. Eine MDL ist eine nicht transparente Datenstruktur, die vom Speicher-Manager definiert wird und einen bestimmten virtuellen Adressbereich einem oder mehreren seitenbasierten physischen Adressbereichen zuordnet. Weitere Informationen finden Sie unter Verwenden von MDLs.

  2. Der E/A-Manager verarbeitet die Leseanforderung des aktuellen Threads, für die der Thread einen Bereich von virtuellen Benutzerraumadressen übergibt, die einen Puffer darstellen.

  3. Der E/A-Manager oder Dateisystemtreiber (FSD) überprüft den vom Benutzer bereitgestellten Puffer auf Barrierefreiheit und ruft MmProbeAndLockPages mit der zuvor erstellten MDL auf. MmProbeAndLockPages füllt auch den entsprechenden physischen Adressbereich in der MDL aus.

    Wie in der vorherigen Abbildung gezeigt, kann eine MDL für einen virtuellen Bereich mehrere entsprechende seitenbasierte physische Adresseinträge enthalten, und der virtuelle Bereich für einen Puffer kann mit einem Byteoffset beginnen und enden, der von einer MDL beschrieben wird.

  4. Der E/A-Manager stellt einen Zeiger auf die MDL (MdlAddress) in einem IRP bereit, der einen Übertragungsvorgang anfordert. Bis der E/A-Manager oder das Dateisystem MmUnlockPages aufruft , nachdem der Treiber die IRP abgeschlossen hat, bleiben die in der MDL beschriebenen physischen Seiten gesperrt und dem Puffer zugewiesen. Die virtuellen Adressen in einer solchen MDL können jedoch unsichtbar (und ungültig) werden, bevor der IRP an den Gerätetreiber oder einen zwischengeschalteten Treiber gesendet wird, der sich möglicherweise über dem Gerätetreiber befindet.

  5. Wenn der Treiber paketbasiertes System oder Bus-master DMA verwendet, ruft seine AdapterControl-RoutineMmGetMdlVirtualAddress mit dem MdlAddress-Zeiger des IRP auf, um die virtuelle Basisadresse für die seitenbasierten Einträge der MDL abzurufen.

  6. Die AdapterControl-Routine ruft dann MapTransfer mit der von MmGetMdlVirtualAddress zurückgegebenen Basisadresse auf, um Daten vom Gerät direkt in den physischen Speicher zu lesen. (Weitere Informationen finden Sie unter Adapterobjekte und DMA.)

Treiber sollten die Pufferlängen immer überprüfen. Beachten Sie, dass der E/A-Manager keine MDL für einen Puffer der Länge Null erstellt.