Sdílet prostřednictvím


Používání systému DMA Packet-Based

Ovladače podřízených zařízení, které používají DMA založené na paketech, volají při zpracování IRP požadujícího přenos DMA následující obecnou sekvenci rutin podpory:

  • KeFlushIoBuffers těsně před pokusem o přidělení systémového řadiče DMA (další informace naleznete v tématu Údržba mezipaměti Coherency)

  • AllocateAdapterChannel, když je ovladač připraven naprogramovat své zařízení pro DMA a potřebuje systémový řadič DMA

    AllocateAdapterChannel zase volá rutinu AdapterControl ovladače.

  • MmGetMdlVirtualAddress pro získání indexu do MDL, který se vyžaduje jako parametr v počátečním volání MapTransfer

  • MapTransfer k naprogramování systémového řadiče DMA pro operaci přenosu

    Ovladač může potřebovat zavolat MapTransfer více než jednou, aby přenesl všechna požadovaná data, jak je vysvětleno v Rozdělení žádostí o přenos.

  • FlushAdapterBuffers těsně po každé operaci přenosu DMA do/z podřízeného zařízení

    Pokud ovladač musí zavolat MapTransfer více než jednou k přenosu všech požadovaných dat, musí volat FlushAdapterBuffers tolikrát, kolikrát volá MapTransfer.

  • FreeAdapterChannel buď jakmile se přenesou všechna požadovaná data, nebo pokud ovladač selže kvůli I/O chybě zařízení

Ukazatel objektu adaptéru vrácený IoGetDmaAdapter je povinný parametr pro každou z těchto rutin s výjimkou KeFlushIoBuffers a MmGetMdlVirtualAddress, které vyžadují ukazatel na MDL předaný v Irp-MdlAddress>.

Jednotlivé ovladače volají tuto sekvenci rutin podpory v různých bodech v závislosti na tom, jak je každý ovladač implementovaný do služby svého zařízení. Například rutina StartIo jednoho ovladače může volat funkci AllocateAdapterChannel, jiný ovladač může tuto funkci volat z rutiny, která odebere IRP z fronty vytvořené ovladačem, která je vzájemně zablokovaná, a další ovladač může toto volání uskutečnit, když jeho podřízené zařízení DMA indikuje, že je připravené k přenosu dat.