Ausführen von DMA in 64-Bit-Windows

Das Hinzufügen von 64-Bit-Adressierungsunterstützung zu Ihrem Treiber kann die Gesamtsystemleistung erheblich verbessern. Dies ist besonders wichtig für Gerätetreiber, die den direkten Speicherzugriff (DMA) ausführen. In 64-Bit-Microsoft Windows werden Gerätetreiber, die DMA ausführen, aber keine 64-Bit-Adressierung unterstützen, doppelt gepuffert, was zu einer geringeren relativen Leistung führt.

Obwohl die Doppelpufferung in der Regel einen relativ geringen Einfluss (einzelne Prozentpunkte) auf 8-GB-Systeme hat, reicht dies aus, um sich auf E/A-intensive Aufgaben wie die Datenbankaktivität zu auswirken. Wenn die Menge des physischen Arbeitsspeichers zunimmt, erhöhen sich auch diese negativen Auswirkungen auf die Leistung.

Um 64-Bit-DMA zu unterstützen, sollten Treiber die folgenden Richtlinien beachten:

  1. Verwenden Sie PHYSICAL_ADDRESS-Strukturen für physische Adressberechnungen.

  2. Behandeln Sie die gesamte 64-Bit-Adresse als gültige physische Adresse. Beispielsweise sollten Treiber mmGetPhysicalAddress nicht für einen gesperrten Puffer aufrufen, die hohen 32 Bits verwerfen und die abgeschnittene Adresse an einen 32-Bit-Komponentenadapter übergeben. Dies führt zu beschädigtem Arbeitsspeicher, verlorenen E/A-Vorgängen und Systemfehlern.

  3. Verwenden Sie die leistungsstarken Scatter/Gather-Routinen (GetScatterGatherList und PutScatterGatherList), die in Windows 2000 hinzugefügt wurden.

  4. Überprüfen Sie den Wert der globalen Systemvariable Mm64BitPhysicalAddress . Wenn es TRUE ist, unterstützt das System die physische 64-Bit-Adressierung.

  5. Legen Sie den Dma64BitAddresses-Member der DEVICE_DESCRIPTION-Struktur auf TRUE fest, um anzugeben, dass Ihr Treiber 64-Bit-DMA-Adressen unterstützt.

Die DMA-Routinen in 32-Bit-Windows sind 64-Bit-bereit. Wenn Ihr Gerätetreiber diese Routinen ordnungsgemäß verwendet, sollte Ihr DMA-Code ohne Änderungen unter 64-Bit-Windows funktionieren.