Megosztás a következőn keresztül:


Szétszórás/gyűjtés DMA használata

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:

  1. MmGetMdlVirtualAddress az index beolvasásához az MDL-be, amely paraméterként szükséges a GetScatterGatherList hívásában

  2. 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ő.

  3. 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.