Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Een stuurprogramma dat gebruikmaakt van de automatische initialisatiemodus van een systeem-DMA-controller, moet geheugen toewijzen voor een buffer waarin of van waaruit DMA-overdrachten kunnen worden uitgevoerd. Het stuurprogramma roept AllocateCommonBuffer aan om deze buffer op te halen, meestal uit de DispatchPnP-routine die een IRP_MN_START_DEVICE aanvraag afhandelt. In de volgende afbeelding ziet u hoe een stuurprogramma de buffer toewijst en het virtuele adresbereik toewijst aan het fysieke geheugen van het systeem.
Zoals in de vorige afbeelding wordt weergegeven, voert een stuurprogramma de volgende stappen uit om een buffer toe te wijzen voor systeem-DMA:
Het stuurprogramma roept AllocateCommonBuffer aan, waarbij een aanwijzer wordt doorgegeven aan het adapterobject dat is geretourneerd door IoGetDmaAdapter, samen met de lengte in bytes die zijn aangevraagd voor de buffer. Als u geheugen economisch wilt gebruiken, moet de invoerlengtewaarde voor de buffer kleiner dan of gelijk zijn aan PAGE_SIZE of een integraal veelvoud van PAGE_SIZE zijn.
Als AllocateCommonBuffer een NULL-aanwijzer retourneert, moet het stuurprogramma alle systeemresources vrijmaken die al zijn geclaimd en STATUS_INSUFFICIENT_RESOURCES retourneren als reactie op de IRP_MN_START_DEVICE aanvraag.
Anders wijst AllocateCommonBuffer de aangevraagde hoeveelheid geheugen toe in de virtuele adresruimte van het systeem en retourneert twee verschillende typen aanwijzers naar die buffer:
Het LogicalAddress van de buffer (BufferLogicalAddress in de vorige afbeelding), waarvoor het stuurprogramma opslag moet bieden, maar die daarna moet worden genegeerd.
Het virtuele adres van de buffer (BufferVirtualAddress in de vorige afbeelding), dat het stuurprogramma ook moet opslaan, zodat er een MDL kan worden gemaakt met een beschrijving van de buffer voor DMA-bewerkingen
Het stuurprogramma moet deze aanwijzers opslaan in de apparaatextensie of een ander geheugen dat aan het stuurprogramma is toegewezen.
Het stuurprogramma roept IoAllocateMdl aan om een MDL toe te wijzen voor de buffer. Het stuurprogramma geeft het VirtualAddress van de buffer die is geretourneerd door AllocateCommonBuffer door, samen met de lengte van die buffer, voor toewijzing van een MDL.
Het stuurprogramma roept MmBuildMdlForNonPagedPool aan met de aanwijzer die door IoAllocateMdl wordt geretourneerd om het virtuele adresbereik voor de residente buffer toe te wijzen aan het fysieke geheugen van het systeem.
Nadat een gemeenschappelijke buffer is toegewezen en het virtuele adresbereik is toegewezen, kan het stuurprogramma van een ondergeschikt apparaat beginnen met het verwerken van een IRP die een DMA-overdracht aanvraagt. Hiervoor roept het stuurprogramma de volgende algemene reeks ondersteuningsroutines aan:
Naar eigen goeddunken van de schrijfer van het stuurprogramma kan RtlMoveMemory worden gebruikt om gegevens uit een vergrendelde gebruikersbuffer naar de door het stuurprogramma toegewezen gemeenschappelijke buffer te kopiëren voor een overdracht naar het apparaat.
AllocateAdapterChannel wanneer het stuurprogramma klaar is om het apparaat voor DMA te programmeren en de systeem-DMA-controller nodig heeft
MapTransfer, met de MDL die de door het stuurprogramma toegewezen gemeenschappelijke buffer beschrijft, voor het instellen van de systeem-DMA-controller voor de overdrachtsbewerking
Houd er rekening mee dat het stuurprogramma MapTransfer slechts eenmaal aanroept om de DMA-controller van het systeem in te stellen voor het gebruik van de gemeenschappelijke buffer. Tijdens een overdracht kan het stuurprogramma ReadDmaCounter aanroepen om te bepalen hoeveel bytes er nog moeten worden overgedragen en, indien nodig, RtlMoveMemory aanroepen om meer gegevens naar of van een gebruikersbuffer te kopiëren.
FlushAdapterBuffers wanneer het stuurprogramma de DMA-overdracht naar/van het onderliggende apparaat heeft voltooid
FreeAdapterChannel zodra alle aangevraagde gegevens zijn overgedragen of als het stuurprogramma de IRP moet beëindigen vanwege een I/O-apparaatfout
De adapterobjectaanwijzer die door IoGetDmaAdapter wordt geretourneerd, is een vereiste parameter voor elk van deze ondersteuningsroutines behalve RtlMoveMemory.
Afzonderlijke stuurprogramma's noemen deze reeks ondersteuningsroutines op verschillende punten, afhankelijk van hoe elk stuurprogramma wordt geïmplementeerd om het apparaat te onderhouden. De StartIo-routine van het ene stuurprogramma kan bijvoorbeeld de aanroep naar AllocateAdapterChannel maken, een ander stuurprogramma kan deze aanroep uitvoeren vanuit een routine waarmee IR's worden verwijderd uit een door het stuurprogramma gemaakte interlocked wachtrij, en nog steeds een ander stuurprogramma kan deze aanroep maken wanneer het onderliggende DMA-apparaat aangeeft dat het gereed is om gegevens over te dragen.