Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A rendszer- vagy busz-mester, csomag-alapú DMA-t végrehajtó illesztőprogramok olyan támogatási rutinokat használhatnak, amelyeket kifejezetten scatter/gather DMA-hoz terveztek. Ahelyett, hogy meghívná a Packet-Based rendszer DMA és Packet-Based Bus-Master DMA használatával felvázolt rutinok sorozatát, az illesztőprogramok használhatják a GetScatterGatherList és a PutScatterGatherList parancsot.
Az eszköznek nem szükséges beépített scatter/gather támogatással rendelkezni ahhoz, hogy az illesztőprogram használja ezeket a rutinokat.
A csomag alapú DMA-t használó illesztőprogramok a következő általános támogatási rutinokat hívják meg a szórás/összegyűjtés műveletekhez:
MmGetMdlVirtualAddress az index beolvasásához az MDL-be, amely paraméterként szükséges a GetScatterGatherList hívásában
GetScatterGatherList, amikor az illesztőprogram készen áll az eszköz DMA-ra való programozására és szüksége van a rendszer DMA-vezérlőjére vagy a buszvezérlő adapterre.
A GetScatterGatherList lefoglalja a rendszer DMA-vezérlőjét vagy a busz-főadaptert, meghatározza, hogy hány térképregisztrálóra van szükség, és lefoglalja őket, kitölti a pont-/gyűjtési listát, és meghívja az illesztőprogram AdapterListControl rutinját, amikor a DMA-vezérlő vagy az adapter és a térképregisztráló elérhető.
PutScatterGatherList, amint az összes kért adat átkerült, vagy ha az illesztőprogram egy eszköz I/O-hibája miatt meghiúsította az IRP-t.
A PutScatterGatherList kiüríti az adapter puffereit, felszabadítja a térképregisztereket, és felszabadítja a scatter/gather listát. Az illesztőprogramnak meg kell hívnia a PutScatterGatherList-et , mielőtt hozzáfér a pufferben lévő adatokhoz.
Az IoGetDmaAdapter által visszaadott adapterobjektum-mutató minden rutinhoz kötelező paraméter, kivéve az MmGetMdlVirtualAddress-et, amelyhez az MDL mutatója szükséges az Irp-MdlAddress címén.
A GetScatterGatherList rutin tartalmazza a AllocateAdapterChannel és a MapTransfer hívásait, így az illesztőprogramnak nem kell ezeket a hívásokat kezdeményeznie. A rutin a következő paramétereket veszi fel:
Az IoGetDmaAdapter által visszaadott DMA_ADAPTER szerkezet mutatója
Mutató a DMA-művelet céleszköz-objektumára
Az Irp->MdlAddress pufferét leíró MDL mutatója.
Mutató az Mdl által leírt puffer aktuális virtuális címére
A leképezendő bájtok száma
Az átvitelt végrehajtó AdapterListControl rutin mutatója
Az AdapterListControl rutinnak továbbítandó illesztőprogram által meghatározott környezeti területre mutató mutató
Logikai érték: IGAZ az eszközre történő átvitelhez; HAMIS egyéb esetben
A szükséges térképregisztrálók számának meghatározása, az adaptercsatorna és a térképregisztrálók kiosztása, a pont/gyűjtési lista kitöltése és az átvitel előkészítése után a GetScatterGatherList meghívja az illesztőprogram által biztosított AdapterListControl rutint. Az AdapterListControl rutin egy tetszőleges szálkörnyezetben fut, amikor az IRQL = DISPATCH_LEVEL.
Az AdapterListControl rutin, amelyet a GetScatterGatherList hívásaiban az illesztőprogramok ellátnak, eltér a AllocateAdapterChannelnek átadott AdapterControl rutintól a következő fontos szempontok szerint:
Az AdapterListControl rutinnak nincs visszatérési értéke, míg az AdapterControl rutin egy IO_ALLOCATION_ACTION ad vissza.
A rendszer által lefoglalt térképregisztrálások MapRegisterBase-jére mutató mutató helyett az AdapterListControl rutin harmadik paramétere inkább egy SCATTER_GATHER_LIST struktúrára mutat, amelyen keresztül az illesztőprogram DMA-t hajthat végre.
Az AdapterListControl rutin elvégzi az AdapterControl rutinban szükséges feladatok egy részhalmazát.
Az AdapterListControl rutin nem hívja meg a AllocateAdapterChannelt vagy a MapTransfert. Az egyetlen feladata a bemeneti pont/listamutató mentése, az eszköz beállítása, valamint a pont/gyűjtési lista használata a DMA végrehajtásához.
A scatter/gather lista struktúrája egy SCATTER_GATHER_ELEMENT tömböt és a tömb elemeinek számát tartalmazza. A tömb minden eleme megadja egy fizikailag összefüggő szórási/gyűjtési régió hosszát és kezdő fizikai címét. Egy illesztőprogram az adatátvitelek hosszát és címét használja.
Az illesztőprogramok használhatják a GetScatterGatherList-et , függetlenül attól, hogy az eszköz támogatja-e a pont-/gyűjtési DMA-t. A scatter/gather DMA-t nem támogató eszköz esetében a scatter/gather lista csak egy elemet tartalmaz.
A szórás/gyűjtés rutinok használata javíthatja a teljesítményt a AllocateAdapterChannel meghívásával szemben, ahogyan azt korábban a Packet-Based rendszer DMA használata és a Packet-Based Bus-Master DMA használata című leírásokban ismertettük. A AllocateAdapterChannel hívásaitól eltérően a GetScatterGatherList több hívása is várólistára állítható egy eszközobjektumhoz egyszerre. Az illesztők újra meghívhatják a GetScatterGatherList parancsot ugyanazon az illesztőprogram-objektumon egy másik DMA-művelethez, mielőtt az AdapterListControl rutinja befejeződött volna.
Az illesztőprogram által biztosított AdapterListControl rutinból visszatérve a GetScatterGatherList megőrzi a térképregisztrálókat, de felszabadítja a DMA-adapter struktúráját.
Ha az illesztőprogram teljesítette az aktuális IRP átviteli kérését, vagy egy eszköz- vagy busz I/O-hibája miatt meghiúsult az IRP, fel kell hívnia a PutScatterGatherList-et , mielőtt hozzáfér az átvitt adatokhoz a pufferben. PutScatterGatherList kiüríti az adapter puffereit, és felszabadítja a térképregisztereket és a szórt/gyűjtő listát.