Delen via


DMA Common-Buffer Bus-Master gebruiken

Zoals beschreven in Het gebruik van Bus-Master DMA, maken sommige stuurprogramma's voor DMA-apparaten met busmaster uitsluitend gebruik van DMA met algemene buffer en sommige gebruiken DMA in combinatie met DMA op basis van pakketten.

Gebruik common-buffer DMA economisch. Het instellen van een gemeenschappelijke buffer kan sommige (of alle, afhankelijk van de grootte van de aangevraagde buffer) van de kaartregisters koppelen die zijn gekoppeld aan het adapterobject dat de bus-master-adapter vertegenwoordigt.

Het efficiënt instellen van gemeenschappelijke buffergebieden, bijvoorbeeld door het gebruik van PAGE_SIZE segmenten of één enkele toewijzing, laat meer adresregisters beschikbaar voor pakketgebaseerde DMA-bewerkingen. Het laat ook meer systeemgeheugen vrij voor andere doeleinden, wat zorgt voor betere algehele stuurprogramma- en systeemprestaties.

Als u een gemeenschappelijke buffer wilt configureren voor bus-master DMA, moet een DMA-apparaatstuurprogramma voor bus-master AllocateCommonBuffer aanroepen met de adapterobjectaanwijzer die is geretourneerd door IoGetDmaAdapter. Normaal gesproken doet een stuurprogramma deze oproep vanuit de DispatchPnP-routine voor IRP_MN_START_DEVICE aanvragen. Een stuurprogramma moet alleen een gemeenschappelijke buffer toewijzen als deze de buffer herhaaldelijk gebruikt voor de DMA-bewerkingen terwijl het stuurprogramma geladen blijft. In het volgende diagram ziet u een dergelijke aanroep naar AllocateCommonBuffer.

diagram dat de toewijzing van een gemeenschappelijke buffer voor bus master DMA illustreert.

De aangevraagde grootte voor de buffer, die in het vorige diagram wordt weergegeven als LengthForBuffer, bepaalt hoeveel kaartregisters moeten worden gebruikt om een virtuele naar logische toewijzing voor de gemeenschappelijke buffer te bieden. Gebruik de BYTES_TO_PAGES macro om het maximum aantal pagina's te bepalen dat nodig is (BYTES_TO_PAGES (LengthForBuffer)). Deze waarde kan niet groter zijn dan de NumberOfMapRegisters die worden geretourneerd door IoGetDmaAdapter.

Daarnaast moet de beller het volgende opgeven:

  • Een Booleaanse waarde die aangeeft of caching moet worden ingeschakeld

    Notitie Deze waarde wordt genegeerd. Het besturingssysteem bepaalt of gecached geheugen moet worden ingeschakeld in de gemeenschappelijke buffer die moet worden toegewezen. Deze beslissing is gebaseerd op de processorarchitectuur en apparaatbus.

    Op computers met x86-gebaseerde, x64- en Itanium-processors is cachegeheugen ingeschakeld.

    Op computers met arm- of Arm 64-processors schakelt het besturingssysteem niet automatisch geheugen in de cache in voor alle apparaten. Het systeem is afhankelijk van de ACPI_CCA methode voor elk apparaat om te bepalen of het apparaat cache-coherent is.

  • Een aanwijzer naar een door het stuurprogramma gedefinieerde variabele die het door het apparaat toegankelijke basisadres voor de buffer bevat (BufferLogicalAddress in het vorige diagram) bij terugkeer van AllocateCommonBuffer

Als de aanroep is geslaagd, retourneert AllocateCommonBuffer een virtueel basisadres voor de buffer (BufferVirtualAddress in het vorige diagram), dat het stuurprogramma moet opslaan in de apparaatextensie, controllerextensie of een andere door het stuurprogramma toegankelijke opslagruimte (niet-gepaginade pool die door het stuurprogramma is toegewezen).

AllocateCommonBuffer retourneert NULL als er geen geheugen voor de buffer kan worden toegewezen. Als het geretourneerde virtuele basisadres NULL is, moet het stuurprogramma de DMA-ondersteuning op basis van pakketten van het systeem uitsluitend gebruiken of moet het stuurprogramma de IRP_MN_START_DEVICE aanvraag mislukken en STATUS_INSUFFICIENT_RESOURCES retourneren.

Anders kan het stuurprogramma de toegewezen gemeenschappelijke buffer gebruiken als een opslaggebied dat toegankelijk is voor stuurprogramma's en adapters voor DMA-overdrachten.

Wanneer de PnP-manager een IRP verzendt die het apparaat stopt of verwijdert, moet het stuurprogramma FreeCommonBuffer aanroepen om elke gemeenschappelijke buffer vrij te geven die het heeft toegewezen.