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 Bus-Master DMA használata című cikkben leírtak szerint a busz-fő DMA-eszközök egyes illesztőprogramjai kizárólag a common-buffer DMA-t használják, mások pedig a közös puffer DMA-t a csomagalapú DMA-val kombinálva.
Használjon közös pufferes DMA-t gazdaságilag. A közös puffer beállítása összekapcsolhatja a térképregisztrálók térképregisztrálóinak egy részét (vagy az összeset a kért puffer méretétől függően) a busz-főadaptert képviselő adapterobjektumhoz.
Ha gazdaságosan állít be közös pufferterületeket, például PAGE_SIZE adattömböket vagy egyetlen foglalást használ, több térképregisztrációs adatbázis áll rendelkezésre a csomagalapú DMA-műveletekhez. Emellett több rendszermemória marad más célokra is, ami jobb illesztőprogram- és rendszerteljesítményt eredményez.
A bus-master DMA közös pufferének beállításához a bus-master DMA eszközillesztőnek meg kell hívnia a AllocateCommonBuffert az IoGetDmaAdapter által visszaadott adapterobjektum-mutatóval. Az illesztőprogramok általában a DispatchPnP rutinból indítják ezt a hívást IRP_MN_START_DEVICE kérésekhez. Az illesztőprogramnak csak akkor szabad közös puffert lefoglalnia, ha a puffert többször is használni fogja a DMA-műveletekhez, miközben az illesztőprogram betöltve marad. Az alábbi ábra a AllocateCommonBuffer hívását szemlélteti.
A puffer kért mérete, amely az előző ábrán LengthForBuffer néven látható, meghatározza, hogy hány térképregisztrálást kell használni a közös puffer virtuális-logikai leképezésének biztosításához. A szükséges lapok maximális számának (BYTES_TO_PAGES (LengthForBuffer)) meghatározásához használja a BYTES_TO_PAGES makrót. Ez az érték nem lehet nagyobb, mint az IoGetDmaAdapter által visszaadott NumberOfMapRegisters érték.
Emellett a hívónak a következőket kell megadnia:
Logikai érték, amely jelzi, hogy a gyorsítótárazás engedélyezett-e.
Jegyzet Ezt az értéket a rendszer figyelmen kívül hagyja. Az operációs rendszer határozza meg, hogy engedélyezi-e a gyorsítótárazott memóriát a lefoglalni kívánt közös pufferben. Ez a döntés a processzorarchitektúrán és az eszközbuszon alapul.
Az x86-alapú, x64-alapú és Itanium-alapú processzorokkal rendelkező számítógépeken a gyorsítótárazott memória engedélyezve van.
Arm- vagy Arm 64-alapú processzorokkal rendelkező számítógépeken az operációs rendszer nem engedélyezi automatikusan a gyorsítótárazott memóriát minden eszköz számára. A rendszer az egyes eszközök ACPI_CCA metódusára támaszkodik annak meghatározásához, hogy az eszköz gyorsítótár-koherens-e.
Egy illesztőprogram által definiált változóra mutató mutató, amely a AllocateCommonBufferből való visszatérés után tartalmazza a puffer eszköz által elérhető alap logikai címét (BufferLogicalAddress az előző ábrán).
Ha a hívás sikeres, a AllocateCommonBuffer egy illesztőprogram által elérhető alap virtuális címet ad vissza a pufferhez (az előző ábrán a BufferVirtualAddress), amelyet az illesztőprogramnak mentenie kell az eszközbővítményben, a vezérlőbővítményben vagy más, illesztőprogram által elérhető rezidens tárolóterületen (az illesztőprogram által lefoglalt nem lapozott készletben).
A AllocateCommonBuffernull értéket ad vissza, ha nem tud memóriát lefoglalni a pufferhez. Ha a visszaadott alap virtuális cím NULL, az illesztőprogramnak vagy kizárólag a rendszer csomagalapú DMA-támogatását kell használnia, vagy az illesztőprogramnak meg kell hiúsulnia a IRP_MN_START_DEVICE kérésben, és STATUS_INSUFFICIENT_RESOURCES kell visszaadnia.
Ellenkező esetben az illesztőprogram a lefoglalt közös puffert használhatja illesztőprogramként és adapterrel elérhető tárolóhelyként a DMA-átvitelekhez.
Amikor a PnP-kezelő olyan IRP-t küld, amely leállítja vagy eltávolítja az eszközt, az illesztőprogramnak fel kell hívnia a FreeCommonBuffert , hogy felszabadítsa az összes közös puffert, amelyet lefoglalt.