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.
Wanneer AllocateAdapterChannel het besturingselement overdraagt naar de AdapterControl-routine van een stuurprogramma, heeft deze een set kaartregisters toegewezen. Het stuurprogramma moet echter het fysieke geheugen van het systeem toewijzen voor de overdrachtsaanvraag van de huidige IRP naar het logische adresbereik van de bus-masteradapter, als volgt:
Roep MmGetMdlVirtualAddress aan met de MDL bij Irp-MdlAddress> om een index op te halen voor het fysieke systeemadres waar de overdracht moet beginnen.
De retourwaarde is een vereiste parameter (CurrentVa) voor MapTransfer.
Roep MapTransfer aan om de fysieke adresbereiken van het systeem voor de buffer van de IRP toe te wijzen aan het logische adresbereik van de bus-masteradapter.
Het stuurprogramma kan vervolgens de adapter instellen voor de overdrachtsbewerking. In de volgende afbeelding ziet u de stappen voor het instellen van de overdracht.
Zoals in de vorige afbeelding wordt weergegeven, stelt de AdapterControl-routine van een stuurprogramma als volgt een DMA-bewerking met busmaster in:
De AdapterControl routine krijgt het adres waarop de overdracht moet worden gestart. Voor de eerste overdracht die nodig is om aan een IRP te voldoen, geeft de AdapterControl routineaanroepen MmGetMdlVirtualAddress, waarbij een aanwijzer naar de MDL wordt doorgegeven op Irp->MdlAddress, waarin de buffer voor deze DMA-overdracht wordt beschreven.
MmGetMdlVirtualAddress retourneert een virtueel adres dat het stuurprogramma kan gebruiken als index voor het fysieke systeemadres waar de overdracht moet beginnen.
Als voor de IRP meer dan één overdrachtsbewerking is vereist, berekent het stuurprogramma een bijgewerkt beginadres, zoals verderop in deze sectie wordt beschreven.
De AdapterControl-routine slaat het adres op dat wordt geretourneerd door MmGetMdlVirtualAddress of berekend in stap 1. Dit adres is een vereiste parameter (CurrentVa) voor MapTransfer.
De AdapterControl-routine roept MapTransfer aan, die een logisch adres retourneert waarop het stuurprogramma de bus-master-adapter kan programmeren om de overdrachtsbewerking te starten. In de aanroep van MapTransfer levert de chauffeur de volgende parameters:
De adapterobjectaanwijzer geretourneerd door IoGetDmaAdapter
Een aanwijzer naar de MDL bij Irp->MdlAddress voor de huidige IRP
De MapRegisterBase-ingang doorgegeven aan de AdapterControl-routine van het stuurprogramma door AllocateAdapterChannel (zie Het toewijzen van het Bus-Master-adapterobject)
De waarde die wordt geretourneerd door MmGetMdlVirtualAddress als dit de eerste aanroep van MapTransfer is voor de huidige IRP
Anders geeft het stuurprogramma een bijgewerkte CurrentVa-waarde op, waarmee de volgende fysieke naar logische toewijzing wordt aangegeven. (Hoe u een bijgewerkte CurrentVa berekent, wordt verderop in deze sectie beschreven.)
Een aanwijzer naar een variabele (Lengte), waarmee het aantal bytes voor deze overdracht wordt aangegeven
Als het stuurprogramma voldoende kaartregisters heeft om alle aangevraagde gegevens over te dragen in één DMA-bewerking en geen apparaatspecifieke beperkingen heeft voor de DMA-bewerkingen, kan de lengte worden ingesteld op de waarde lengte op de I/O-stacklocatie van het stuurprogramma van de IRP. De invoerlengte in bytes kan maximaal zijn (PAGE_SIZE * de NumberOfMapRegisters die worden geretourneerd door IoGetDmaAdapter). Anders moet het stuurprogramma de aanvraag opsplitsen, zoals uitgelegd in Overdrachtsaanvragen splitsen, en moet de waarde van Lengte bijwerken in volgende aanroepen naar MapTransfer- voor de huidige IRP.
Een Booleaanse waarde (WriteToDevice), die de richting van de overdrachtsbewerking aangeeft (TRUE om gegevens over te dragen van het geheugen naar het apparaat)
De AdapterControl routine stelt het apparaat in voor de DMA-bewerking.
De AdapterControl-routine retourneert DeallocateObjectKeepRegisters.
Als het stuurprogramma MapTransfer meerdere keren moet aanroepen om aan de huidige IRP te voldoen, levert het dezelfde adapterobjectaanwijzer, Mdl-aanwijzer , MapRegisterBase-ingang en overdrachtsrichting in elke aanroep naar MapTransfer. Het stuurprogramma moet echter bijgewerkte CurrentVa - en Length-waarden opgeven in de tweede en volgende aanroepen naar MapTransfer. Gebruik de volgende formules om deze waarden te berekenen:
CurrentVa = CurrentVa + (Lengte aangevraagd in voorgaande aanroep van MapTransfer)
Lengte = Minimum (resterende Lengte om over te dragen, (PAGE_SIZE * NumberOfMapRegisters geretourneerd door IoGetDmaAdapter))
De contextinformatie die elk stuurprogramma moet onderhouden over de DMA-overdrachten, is afhankelijk van de behoeften van het specifieke apparaat. Typische context kan bestaan uit het huidige virtuele adres in de MDL (CurrentVa), het aantal bytes dat tot nu toe is overgedragen, het aantal resterende bytes dat moet worden overgedragen en mogelijk een aanwijzer naar de huidige IRP.
Voor stuurprogramma's van apparaten met spreidings-/verzamelmogelijkheden is de parameter Length voor MapTransfer zowel een invoer- als uitvoerparameter. Bij terugkeer van MapTransfer wordt aangegeven hoeveel bytes aan gegevens het systeem heeft toegewezen. Dat wil gezegd: de retourwaarde van Length, in combinatie met het geretourneerde logische adres, geeft het bereik aan van logische adressen die de bus-master-adapter kan gebruiken voor dit deel van de overdracht in deze DMA-bewerking.
Notitie Aangezien Length wordt overschreven door MapTransfer, volgt u deze implementatierichtlijn: Geef nooit een aanwijzer door naar de lengte op de I/O-stacklocatie van het stuurprogramma van een IRP als de parameter Lengte aan MapTransfer als uw apparaat spreiding/verzamel ondersteunt.
Hierdoor kan de waarde in de huidige IRP worden vernietigd, waardoor het onmogelijk is om te bepalen of de bestuurder alle aangevraagde gegevens heeft overgedragen.
Aan het einde van elke DMA-bewerking moet het stuurprogramma FlushAdapterBuffers aanroepen met een geldige adapterobjectaanwijzer en de MapRegisterBase-ingang om ervoor te zorgen dat alle gegevens zijn overgedragen en om de fysieke naar logische toewijzingen voor de huidige DMA-bewerking vrij te geven. Als het stuurprogramma aanvullende DMA-bewerkingen moet instellen om te voldoen aan de huidige IRP, moet het FlushAdapterBuffers aanroepen nadat elke overdrachtsbewerking is voltooid.
Wanneer alle aangevraagde overdracht is voltooid of het stuurprogramma een foutstatus voor het IRP moet retourneren, moet het stuurprogramma FreeMapRegisters onmiddellijk na de laatste aanroep naar FlushAdapterBuffers aanroepen om de best mogelijke doorvoer voor de bus-master-adapter te krijgen. In de aanroep van FreeMapRegisters moet het stuurprogramma de adapterobjectaanwijzer doorgeven die in de voorgaande aanroep is doorgegeven aan AllocateAdapterChannel.