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 obvykle používají vyrovnávací paměti k předávání dat do a od rámce a jiných ovladačů nebo k místnímu ukládání informací. Toto téma popisuje objekty paměti, vyhledávání seznamů, mdlsa místních vyrovnávacích pamětí.
Použití paměťových objektů rámce
Architektura používá paměťové objekty k popisu paměťových vyrovnávacích pamětí, které ovladač přijímá od a předává architektuře. Každý objekt paměti rámce představuje jeden buffer.
Chcete-li vytvořit objekt paměti, ovladač volá jednu z následujících metod objektu:
WdfMemoryCreate, který vytvoří objekt paměti a přidělí vyrovnávací paměť zadané velikosti.
WdfMemoryCreatePreallocated, který vytvoří objekt paměti pro předem přidělenou vyrovnávací paměť.
WdfMemoryCreateFromLookaside, který vytvoří vyrovnávací paměť ze seznamu lookaside .
Chcete-li získat objekt paměti, který představuje vyrovnávací paměti přijatého vstupně-výstupního požadavku, ovladač volá WdfRequestRetrieveInputMemory a WdfRequestRetrieveOutputMemory. Další informace o načítání vyrovnávacích pamětí V/V požadavku naleznete v tématu Přístup k vyrovnávacím pamětem dat v ovladačích Framework-Based.
Aby ovladač mohl získat adresu a velikost vyrovnávací paměti paměťového objektu, musí zavolat WdfMemoryGetBuffer.
Pokud chcete přenést data do nebo z vyrovnávací paměti objektu, ovladač volá buď WdfMemoryCopyFromBuffer nebo WdfMemoryCopyToBuffer. Tyto metody objektů kontrolují velikost zdrojového a cílového umístění a brání chybám přetečení vyrovnávací paměti.
Pokud ovladač vytvoří objekt paměti voláním WdfMemoryCreatePreallocated, může následně přiřadit objektu paměti jinou vyrovnávací paměť voláním WdfMemoryAssignBuffer.
Když ovladač odešle V/V požadavek na V/V cíl, obvykle předává vstupní nebo výstupní vyrovnávací paměť metodě objektu cíle V/V rozhraní architektury . Ovladač specifikuje vyrovnávací paměť buď předáním struktury WDF_MEMORY_DESCRIPTOR, která popisuje vyrovnávací paměť, nebo předáním popisovače objektu paměti. (I/V cílové metody objektů, které odesílají vstupně-výstupní požadavky synchronně, vyžadují strukturu WDF_MEMORY_DESCRIPTOR a metody, které odesílají vstupně-výstupní požadavky asynchronně vyžadují zpracování objektu paměti.)
Informace o tom, kdy je vyrovnávací paměť platná, naleznete v tématu Životní cyklus vyrovnávací paměti.
Použití seznamů lookaside
Pokud váš ovladač bude potřebovat více vyrovnávacích pamětí přibližně stejné velikosti, měl by je přidělit z seznamu paměťových přidělování. Ovladač vytvoří vyhledávací seznam voláním WdfLookasideListCreate. Následně může ovladač získat vyrovnávací paměti z lookaside seznamu voláním WdfMemoryCreateFromLookaside.
Pokaždé, když ovladač volá WdfMemoryCreateFromLookaside, Framework vytvoří objekt paměti, získá buffer z lookaside seznamu a přiřadí buffer objektu. Jakmile ovladač dokončí použití jednoho z těchto objektů paměti volá WdfObjectDelete, který odstraní objekt paměti a vrátí prostor vyrovnávací paměti do vyhledávacího seznamu.
Operační systém spravuje prostředky paměti, které jsou přiřazeny k seznamu vyhledávání. Pokud ovladač požaduje vyrovnávací paměť z lookaside seznamu, když žádná není k dispozici, například když ovladač poprvé zavolá WdfMemoryCreateFromLookaside, systém přidělí vyrovnávací paměť a přidá ji do seznamu. Když ovladač volá WdfObjectDelete (a místo vyrovnávací paměti se vrátí do seznamu pohotovostní paměti), systém zachová nyní nepřiřazenou vyrovnávací paměť v seznamu, dokud ji ovladač znovu nepotřebuje. Systém podle potřeby zvětšuje velikost seznamu; Například ovladače, které častěji požadují vyrovnávací paměti, přijímají větší seznamy vyhledávání. Na druhou stranu může systém snížit počet vyrovnávacích pamětí v seznamu, pokud je ovladač nepoužívá všechny najednou.
Použití MDLs
Některé ovladače používají seznamy popisovačů paměti (MDLs) k popisu vyrovnávacích pamětí. Například ovladač zařízení pro přímý přístup do paměti (DMA) musí předat MDL metodě WdfDmaTransactionInitialize, pokud tuto metodu volá.
Ovladač, který používá MDL, může získat MDL představující vyrovnávací paměti přijatého vstupně-výstupního požadavku voláním WdfRequestRetrieveInputWdmMdl a WdfRequestRetrieveOutputWdmMdl.
Většina ovladačů založených na frameworku nepoužívá MDLs.
Přidělování místních vyrovnávacích pamětí
Ovladač, který vyžaduje místní interní prostor vyrovnávací paměti, který nepřejde do architektury, nemusí vytvářet paměťové objekty představující vyrovnávací paměti. Ovladač může volat ExAllocatePoolWithTag k přidělení interní vyrovnávací paměti. Jakmile ovladač dokončí použití vyrovnávací paměti, musí volat ExFreePoolWithTag.
Drivery však mohou také používat paměťové objekty pro místní vyrovnávací paměti. Výhodou použití vyrovnávací paměti místo volání ExAllocatePoolWithTagje, že rámec automaticky odstraní paměťové objekty a jejich vyrovnávací paměti, když je odstraněn nadřazený objekt každého z objektů.
Důležité
Identifikátory DDI ExAllocatePool popsané v tomto tématu jsou ve Windows 10, verze 2004 zastaralé a byly nahrazeny ExAllocatePool2 a ExAllocatePool3. Další informace naleznete v tématu aktualizaci zastaralých volání ExAllocatePool k ExAllocatePool2 a ExAllocatePool3.
Zarovnání vyrovnávacích pamětí
Ovladač může použít funkci WDF_ALIGN_SIZE_UP nebo WDF_ALIGN_SIZE_DOWN k výpočtu velikosti vyrovnávací paměti, která je zarovnaná podle zadaného posunu. Tento výpočet je užitečný, pokud ovladač musí přidělit více souvislých vyrovnávacích pamětí, pokud každá vyrovnávací paměť musí začínat na hranici zarovnání adresy.