Delen via


Scatter/Gather DMA gebruiken

Stuurprogramma's die systeem- of busmaster- en pakketgebaseerde DMA uitvoeren, kunnen ondersteuningsroutines gebruiken die speciaal zijn ontworpen voor spreidings-/verzamel-DMA. In plaats van de volgorde van routines aan te roepen die worden beschreven in Using Packet-Based System DMA and Packet-Based Bus-Master DMA, kan een stuurprogramma GetScatterGatherList en PutScatterGatherListgebruiken.

Een apparaat hoeft geen ingebouwde spreidings-/verzamelondersteuning te hebben voor het stuurprogramma om deze routines te kunnen gebruiken.

Stuurprogramma's die gebruikmaken van op pakketten gebaseerde DMA roepen de volgende algemene reeks ondersteuningsroutines aan voor spreidings-/verzamelbewerkingen:

  1. MmGetMdlVirtualAddress- om een index op te halen in de MDL, vereist als parameter in de aanroep van GetScatterGatherList

  2. GetScatterGatherList wanneer het stuurprogramma klaar is om het apparaat voor DMA te programmeren en de DMA-controller of bus-masteradapter van het systeem nodig heeft

    GetScatterGatherList wijst de systeemeigen DMA-controller of bus-masteradapter toe, bepaalt hoeveel mapping registers vereist zijn en wijst deze toe, vult de spreidings-/verzamellijst in en roept de routine van het stuurprogramma AdapterListControl aan wanneer de DMA-controller of -adapter en mapping registers beschikbaar zijn.

  3. PutScatterGatherList zodra alle aangevraagde gegevens zijn overgebracht of het stuurprogramma de IRP vanwege een I/O-fout van het apparaat mislukt.

    PutScatterGatherList maakt de adapterbuffers leeg, maakt de kaartregisters vrij en maakt de spreidings-/verzamellijst vrij. Het stuurprogramma moet PutScatterGatherList aanroepen voordat deze toegang heeft tot de gegevens in de buffer.

De adapterobjectaanwijzer die wordt geretourneerd door IoGetDmaAdapter is een vereiste parameter voor elk van deze routines behalve MmGetMdlVirtualAddress, waarvoor een aanwijzer naar de MDL op Irp-->MdlAddressvereist.

De GetScatterGatherList routine bevat aanroepen naar AllocateAdapterChannel en MapTransfer, zodat het stuurprogramma deze aanroepen niet hoeft te doen. De routine neemt het volgende als parameters:

  • Een pointer naar de DMA_ADAPTER structuur die door IoGetDmaAdapter wordt geretourneerd.

  • Een aanwijzer naar het doelapparaatobject voor de DMA-bewerking

  • Een aanwijzer naar de MDL die de buffer beschrijft op Irp-->MdlAddress-

  • Een aanwijzer naar het huidige virtuele adres in de buffer die wordt beschreven door de Mdl

  • Het aantal bytes dat moet worden gemapt

  • Een aanwijzer naar een AdapterListControl routine waarmee de overdracht wordt uitgevoerd

  • Een aanwijzer naar een door het stuurprogramma gedefinieerd contextgebied dat moet worden doorgegeven aan de AdapterListControl routine

  • Een Booleaanse waarde: TRUE voor een overdracht naar het apparaat; ONWAAR anders

Nadat het vereiste aantal kaartregisters is bepaald, het adapterkanaal en de kaartregisters zijn toegewezen, de spreidings-/verzamellijst is ingevuld en de overdracht is voorbereid, roept GetScatterGatherList de door het stuurprogramma geleverde AdapterListControl routine aan. De AdapterListControl routine wordt uitgevoerd in een willekeurige threadcontext op IRQL = DISPATCH_LEVEL.

De AdapterListControl routine een stuurprogramma levert bij aanroepen van GetScatterGatherList verschilt van de AdapterControl routine doorgegeven aan AllocateAdapterChannel in de volgende belangrijke opzichten:

  • De AdapterListControl routine heeft geen retourwaarde, terwijl de AdapterControl routine een IO_ALLOCATION_ACTIONretourneert.

  • In plaats van een aanwijzer naar de MapRegisterBase- voor de systeemtoewijzingsregisters, verwijst de derde parameter van een AdapterListControl- routine daarentegen naar een SCATTER_GATHER_LIST-structuur waarmee het stuurprogramma DMA kan uitvoeren.

  • De AdapterListControl routine voert een subset uit van de taken die zijn vereist in een AdapterControl routine.

    De AdapterListControl routine roept AllocateAdapterChannel- of MapTransfer-niet aan. De enige verantwoordelijkheden zijn het opslaan van de invoerspreidings-/verzamellijstwijzer, het instellen van het apparaat en het gebruik van de spreidings-/verzamellijst om DMA uit te voeren.

De spreidings-/verzamellijststructuur bevat een SCATTER_GATHER_ELEMENT matrix en het aantal elementen in de matrix. Elk element van de matrix biedt de lengte en het begin van een fysiek aaneengesloten spreidings-/verzamelgebied. Een stuurprogramma gebruikt de lengte en het adres in gegevensoverdracht.

Een stuurprogramma kan GetScatterGatherList gebruiken, ongeacht of het apparaat spreidings-/verzamel-DMA ondersteunt. Voor een apparaat dat geen spreidings-/verzamel-DMA ondersteunt, bevat de spreidings-/verzamellijst slechts één element.

Het gebruik van de spreidings-/verzamelroutines kan de prestaties verbeteren ten opzichte van het aanroepen van AllocateAdapterChannel- (zoals eerder beschreven in Met Packet-Based System DMA- en Met Packet-Based Bus-Master DMA-). In tegenstelling tot aanroepen naar AllocateAdapterChannel, kunnen meer dan één aanroep naar GetScatterGatherList op elk gewenst moment in de wachtrij worden geplaatst voor een apparaatobject. Een stuurprogramma kan GetScatterGatherList opnieuw aanroepen voor een andere DMA-bewerking op hetzelfde stuurprogrammaobject voordat de AdapterListControl- routine is voltooid.

Bij terugkeer van de door het stuurprogramma geleverde AdapterListControl routine houdt GetScatterGatherList de kaartregisters bij, maar wordt de DMA-adapterstructuur vrijgemaakt.

Wanneer het stuurprogramma aan de overdrachtsaanvraag van de huidige IRP heeft voldaan of de IRP moet mislukken vanwege een I/O-fout van een apparaat of bus, moet deze PutScatterGatherList aanroepen voordat deze toegang heeft tot de overgedragen gegevens in de buffer. PutScatterGatherList spoelt de adapterbuffers door en maakt de kaartregisters en de spreidings-/verzamellijst vrij.