Sdílet prostřednictvím


Použití technologie Packet-Based Bus-Master DMA

Pokud chcete použít DMA založené na paketech, ovladače zařízení DMA hlavní sběrnice volají následující obecnou posloupnost rutin podpory, když zpracovávají protokol IRP požadující přenos DMA:

  • KeFlushIoBuffers těsně před pokusem o přidělení mapovacích registrů pro žádost o převod (další informace naleznete v tématu Zachování koherence mezipaměti)

  • VyvoláníAdapterChannel, když je ovladač připraven k naprogramování adaptéru bus-master pro DMA

  • MmGetMdlVirtualAddress pro získání indexu do MDL, který je vyžadován jako počáteční parametr pro MapTransfer, a MapTransfer k tomu, aby systémová fyzická paměť podporující vyrovnávací paměť IRP byla přístupná pro zařízení.

    Mějte na paměti, že každý ovladač může potřebovat provést více než jednu operaci přenosu, aby splnil aktuální IRP, jak je uvedeno v části Rozdělení žádostí o převod. Ovladače zařízení, která nemají scatter/gather schopnosti, mohou jednou pro každou přenosovou operaci volat MapTransfer. Ovladače zařízení, která mají možnosti bodového/shromažďování, mohou zavolat MapTransfer více než jednou, aby se nastavily jednotlivé operace přenosu. Alternativně tyto ovladače můžou používat integrovanou podporu bodového/indexovacího systému, která je popsaná v tématu Použití bodového/indexovacího DMA.

  • FlushAdapterBuffers na konci každé operace přenosu DMA do/z cílového zařízení, aby bylo možné určit, jestli byla všechna požadovaná data zcela přenesena.

  • FreeMapRegisters ihned po dokončení všech operací DMA pro aktuální IRP, buď protože všechna požadovaná data byla zcela přenesena, nebo protože ovladač musí zrušit IRP kvůli chybě vstupně-výstupní operace zařízení nebo sběrnice.

Ukazatel objektu adaptéru vrácený IoGetDmaAdapter je povinný parametr pro AllocateAdapterChannel, MapTransfer, FlushAdapterBuffers a FreeMapRegisters. Všimněte si, že ve verzích systému Windows NT předcházejících Windows 2000 mohla hlavní zařízení sběrnice předat ukazatel objektu adaptéru NULL funkcím MapTransfer a FlushAdapterBuffers. V systému Windows 2000 a novějších už to ovladače nemůžou dělat.

KeFlushIoBuffers a MmGetMdlVirtualAddress vyžadují ukazatel na MDL 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, zatímco jiný ovladač může toto volání provést z rutiny, která odstraňuje IRP z fronty vzájemně zablokované nebo fronty zařízení vytvořené ovladačem.

Místo použití rutin popsaných v této části může každý ovladač, který používá DMA založený na paketech, používat podpůrné rutiny určené ke zjednodušení scatter/gather DMA, bez ohledu na to, zda má zařízení vestavěnou podporu scatter/gather. Podrobnosti najdete v tématu Používání Scatter/Gather DMA.