Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Ovladače, které provádějí systémové nebo řízení sběrnice, DMA založené na paketech mohou používat podpůrné rutiny navržené speciálně pro DMA typu scatter/gather. Místo volání posloupnosti rutin uvedených v Using Packet-Based System DMA a Packet-Based Bus-Master DMA, ovladač může použít GetScatterGatherList a PutScatterGatherList.
Zařízení nemusí mít integrovanou podporu scatter/gather, aby jeho ovladač mohl používat tyto rutiny.
Ovladače, které používají DMA založené na paketech, volají následující obecnou sekvenci podpůrných rutin pro operace bodového/shromažďování:
MmGetMdlVirtualAddress pro získání indexu do MDL, který je vyžadován jako parametr ve volání GetScatterGatherList
GetScatterGatherList, když je ovladač připraven naprogramovat zařízení pro DMA a potřebuje systémový řadič DMA nebo adaptér bus-master.
GetScatterGatherList přiděluje systémový řadič DMA nebo adaptér hlavní sběrnice, určí, kolik mapovacích registrů je potřeba, přidělí je, vyplní scatter/gather seznam a zavolá rutinu AdapterListControl ovladače, když je řadič DMA nebo adaptér a mapovací registry k dispozici.
PutScatterGatherList, jakmile se přenesou všechna požadovaná data nebo ovladač selže, protože došlo k chybě vstupně-výstupních operací zařízení
PutScatterGatherList vyprázdní vyrovnávací paměti adaptéru, uvolní mapové registry a uvolní bodový/indexovací seznam. Ovladač musí zavolat PutScatterGatherList, aby získal přístup k datům ve vyrovnávací paměti.
Ukazatel objektu adaptéru vrácený IoGetDmaAdapter je povinný parametr pro každou z těchto rutin s výjimkou MmGetMdlVirtualAddress, který vyžaduje ukazatel na MDL v Irp->MdlAddress.
Rutina GetScatterGatherList zahrnuje volání AllocateAdapterChannel a MapTransfer, takže ovladač nemusí provádět tato volání. Rutina přebírá následující parametry:
Ukazatel na strukturu DMA_ADAPTER vrácenou IoGetDmaAdapter
Ukazatel na objekt cílového zařízení pro operaci DMA
Ukazatel na MDL, který popisuje vyrovnávací paměť na Irp–>MdlAddress
Ukazatel na aktuální virtuální adresu ve vyrovnávací paměti popsané Mdlem
Počet bajtů, které se mají mapovat
Ukazatel na rutinu AdapterListControl, která provádí přenos
Ukazatel na kontextovou oblast definovanou ovladačem, která se má předat rutině AdapterList Control
Logická hodnota: TRUE pro přenos do zařízení; FALSE jinak
Po určení požadovaného počtu registrů mapování, přidělení kanálu adaptéru a mapových registrů, vyplnění seznamu scatter/gather a přípravě na přenos, rutina GetScatterGatherList volá ovladačem poskytovanou AdapterListControl. Rutina AdapterListControl se spouští v libovolném kontextu vlákna v IRQL = DISPATCH_LEVEL.
Rutina AdapterListControl, kterou ovladač dodává ve voláních na GetScatterGatherList, se liší od rutiny AdapterControl, která je předána do AllocateAdapterChannel, v následujících důležitých ohledech:
Rutina AdapterListControl nemá žádnou návratovou hodnotu, zatímco rutina AdapterControl vrací IO_ALLOCATION_ACTION.
Místo ukazatele na MapRegisterBase pro systémem přidělené mapové registry, třetí parametr v rutině AdapterListControl ukazuje na strukturu SCATTER_GATHER_LIST, pomocí které může ovladač provádět DMA.
Rutina AdapterListControl provádí podmnožinu úloh požadovaných v rutině AdapterControl.
Rutina AdapterListControl nevolá AllocateAdapterChannel nebo MapTransfer. Jedinými odpovědnostmi je uložení vstupního ukazatele scatter/gather seznamu, nastavení zařízení a použití scatter/gather seznamu k provádění DMA.
Struktura seznamu scatter/gather obsahuje pole SCATTER_GATHER_ELEMENT a počet prvků v tomto poli. Každý prvek pole poskytuje délku a počáteční fyzickou adresu fyzicky souvislé oblasti bodového/shromáždění. Ovladač používá délku a adresu v přenosech dat.
Ovladač může používat GetScatterGatherList bez ohledu na to, jestli jeho zařízení podporuje scatter-gather DMA. Pro zařízení, která nepodporují scatter/gather DMA, bude seznam obsahovat pouze jeden prvek.
Použití rozptýlených/shromažďovacích rutin může zlepšit výkon oproti volání AllocateAdapterChannel (jak bylo popsáno výše v Použití Packet-Based System DMA a Použití Packet-Based Bus-Master DMA). Na rozdíl od volání AllocateAdapterChannellze zařadit do fronty pro jeden objekt zařízení více než jedno volání GetScatterGatherList najednou. Ovladač může volat GetScatterGatherList znovu pro další operaci DMA na stejném objektu ovladače předtím, než jeho rutina AdapterListControl dokončí provádění.
Při návratu z rutiny AdapterListControl poskytnuté ovladačem GetScatterGatherList ponechává mapové registry, ale uvolňuje strukturu adaptéru DMA.
Pokud ovladač splnil požadavek na přenos aktuálního protokolu IRP nebo musí selhat IRP kvůli chybě vstupně-výstupních operací zařízení nebo sběrnice, je třeba volat PutScatterGatherList, než lze mít přístup k přeneseným datům ve vyrovnávací paměti. PutScatterGatherList vyprázdní vyrovnávací paměti adaptéru a uvolní seznam map a bodový/indexovací seznam.