Delen via


Het Bus-Master-adapterobject toewijzen

Ter voorbereiding op pakketgebaseerde, busmaster-DMA roept een stuurprogramma KeFlushIoBuffers en AllocateAdapterChannel aan nadat het een IRP_MJ_READ of IRP_MJ_WRITE heeft ontvangen. Voordat de bestuurder deze routines aanroept, moet de verzendroutine de geldigheid van de parameters van de IRP controleren. Het kan ook de IRP in de wachtrij plaatsen voor een andere stuurprogrammaroutine voor verdere verwerking. De overdrachtsaanvraag is de huidige IRP waarvoor een I/O-bewerking van een apparaat is vereist.

De stuurprogrammaroutine die AllocateAdapterChannel aanroept, moet worden uitgevoerd op IRQL = DISPATCH_LEVEL. Samen met een aanwijzer naar het adapterobject dat wordt geretourneerd door IoGetDmaAdapter, moet een stuurprogramma het volgende opgeven wanneer AllocateAdapterChannel aanroept:

  • Een aanwijzer naar het doelapparaatobject voor de huidige IRP

  • Het toegangspunt voor de AdapterControl-routine

  • Een aanwijzer naar door het stuurprogramma bepaalde contextinformatie die door de AdapterControl-routine wordt gebruikt

AllocateAdapterChannel zet de AdapterControl-routine van het stuurprogramma in de wachtrij, die wordt uitgevoerd wanneer het adapterobject vrij is en er een set kaartregisters is toegewezen voor de DMA-bewerkingen van het stuurprogramma naar of van het doelapparaat.

Bij invoer krijgt een AdapterControl-routine de DeviceObject - en Contextaanwijzers die worden doorgegeven in de aanroep naar AllocateAdapterChannel, evenals een ingang (MapRegisterBase) voor de toegewezen kaartregisters.

De AdapterControl-routine krijgt ook een aanwijzer naar het DeviceObject-CurrentIrp> als het stuurprogramma een StartIo-routine heeft. Wanneer het stuurprogramma zijn eigen wachtrij van IRP's beheert in plaats van een StartIo-routine te hebben, moet het stuurprogramma een verwijzing naar de huidige IRP opnemen als onderdeel van de context die wordt doorgegeven wanneer AllocateAdapterChannel wordt aangeroepen.

Voor het stuurprogramma van een DMA-apparaat met busmaster zonder spreidings-/verzamelmogelijkheden doet de AdapterControl-routine meestal het volgende:

  1. Slaat of initialiseert de context die het stuurprogramma voor DMA-bewerkingen onderhoudt. De context kan de invoer MapRegisterBase-ingang bevatten die het stuurprogramma moet doorgeven aan MapTransfer en FlushAdapterBuffers, de lengte in bytes van de aangevraagde overdracht vanaf de I/O-stacklocatie in de IRP, enzovoort.

  2. Roept MmGetMdlVirtualAddress aan, gevolgd door MapTransfer (beschreven in Het instellen van een overdrachtsbewerking, volgende) om het logische adres op te halen dat het apparaat kan gebruiken om de overdrachtsbewerking te starten.

  3. Hiermee stelt u de bus-masteradapter in om de overdrachtsbewerking te starten.

  4. Retourneert de waarde DeallocateObjectKeepRegisters.

Voor het stuurprogramma van een busmaster-apparaat met spreidings-/verzamelmogelijkheden doet de AdapterControl-routine meestal het volgende:

  1. Slaat of initialiseert de status die het stuurprogramma behoudt over DMA-bewerkingen, zoals het opslaan van de MapRegisterBase-ingang die het stuurprogramma moet doorgeven aan MapTransfer en FlushAdapterBuffers, de lengte in bytes van de aangevraagde overdracht vanaf de I/O-stacklocatie in de IRP, enzovoort.

  2. Roept MmGetMdlVirtualAddress aan, gevolgd door MapTransfer (beschreven in de volgende subsectie) om het logische adres op te halen dat het apparaat kan gebruiken om de overdrachtsbewerking te starten.

    De AdapterControl-routine roept MapTransfer herhaaldelijk aan totdat alle beschikbare kaartregisters zijn gebruikt om een spreidings-/verzamellijst te maken voor de bus-masteradapter.

  3. Hiermee stelt u de bus-masteradapter in om de overdrachtsbewerking te starten.

  4. Retourneert de waarde DeallocateObjectKeepRegisters.

Zie Writing AdapterControl Routines voor meer informatie.

Houd er rekening mee dat stuurprogramma's die busmaster DMA uitvoeren, de GetScatterGatherList - en PutScatterGatherList-routines kunnen gebruiken, ongeacht of hun apparaten spreidings-/verzamel-DMA ondersteunen. Door deze routines te gebruiken, worden de vereisten voor de AdapterControl-routine van het stuurprogramma gewijzigd; zie Spreiding gebruiken/DMA verzamelen voor meer informatie.

Een AdapterControl-routine moet een door het systeem gedefinieerde waarde van het type IO_ALLOCATION_ACTION retourneren. Voor stuurprogramma's die gebruikmaken van busmaster DMA, moet de AdapterControl-routine doorgaans de waarde DeallocateObjectKeepRegisters retourneren, zodat het stuurprogramma de toegewezen kaartregisters voor het doelapparaatobject kan behouden totdat alle aangevraagde gegevens voor de huidige IRP zijn overgedragen. Nadat de overdracht is voltooid, moet de DPC-routine FreeMapRegisters aanroepen om de toegewezen kaartregisters vrij te maken. In gevallen waarin het apparaat geen ondersteuning biedt voor het in de wachtrij plaatsen van opdrachten, kan de AdapterControl-routineKeepObject echter retourneren wanneer de overdracht voor de huidige IRP is voltooid en kan de DPC-routine in plaats daarvan FreeAdapterChannel aanroepen.

Een AdapterControl-routine kan niet wachten totdat de bus-master-adapter een DMA-bewerking heeft voltooid.

Ongeacht of de bus-master-adapter spreidings-/verzameladapters ondersteunt, moet de AdapterControl-routine ten minste het volgende doen:

  1. Sla de benodigde contextinformatie( met name de MapRegisterBase-ingang ) op in de apparaatextensie van het stuurprogramma, de controllerextensie of een andere, door het stuurprogramma toegankelijke opslagruimte (niet-paginagroep, toegewezen door het stuurprogramma). Het stuurprogramma moet deze ingang doorgeven wanneer het MapTransfer en FlushAdapterBuffers aanroept.

  2. Return DeallocateObjectKeepRegisters.

Een andere stuurprogrammaroutine (waarschijnlijk de DpcForIsr-routine ) moet FlushAdapterBuffers aanroepen wanneer elke DMA-overdrachtsbewerking wordt uitgevoerd. Deze routine moet ook eventuele aanvullende DMA-bewerkingen instellen die nodig zijn om te voldoen aan de huidige IRP.

Wanneer het stuurprogramma aan het overdrachtsverzoek van de huidige IRP heeft voldaan of de IRP als mislukt moet beschouwen vanwege een I/O-fout van een apparaat of bus, moet het FreeMapRegisters aanroepen. Deze aanroep moet onmiddellijk plaatsvinden na de laatste aanroep van FlushAdapterBuffers voor de huidige IRP, zodat het stuurprogramma andere DMA-aanvragen kan verwerken, mogelijk voor andere apparaten in de bus.