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.
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.
Ovladače mohou v rámci svých rozšíření zařízení využívat systémově přidělený prostor jako globální úložné oblasti pro informace specifické pro daná zařízení. Ovladače mohou použít pouze zásobník jádra k předání malého množství dat do svých interních rutin. Některé ovladače musí přidělit další, větší množství paměti systémového prostoru, obvykle pro vstupně-výstupní vyrovnávací paměti.
Přidělení prostoru vyrovnávací paměti vstupně-výstupních operací: Nejlepší rutiny přidělování paměti jsou MmAllocateNonCachedMemory, MmAllocateContiguousMemorySpecifyCache, AllocateCommonBuffer (pokud zařízení ovladače používá režim automatické inicializace sběrnicového řadiče DMA master nebo systémový řadič DMA) nebo ExAllocatePoolWithTag.
Nestránkovaný fond se obvykle při spuštění systému fragmentuje, takže rutina driverEntry driverEntry by měla volat tyto rutiny, aby se nastavily všechny dlouhodobé vstupně-výstupní vyrovnávací paměti, které ovladač potřebuje. Každá z těchto rutin, s výjimkou ExAllocatePoolWithTag, přiděluje paměť, která je zarovnaná na hranici specifické pro procesor (určená velikostí řádku mezipaměti procesoru), aby byl zajištěn nejlepší výkon.
Ovladače by měly přidělovat vyrovnávací paměti pro vstupně-výstupní operace co nejúsporněji, protože paměť nestránkového fondu je omezeným systémovým prostředkem. Ovladač by obvykle neměl opakovaně volat tyto podpůrné rutiny, aby požádal o přidělení menší než PAGE_SIZE, protože každé takové přidělení má také hlavičku fondu, která se používá k interní správě přidělení.
Tipy pro ekonomické přidělování prostoru vyrovnávací paměti řidiče
Pokud chcete ekonomicky přidělit paměť I/O vyrovnávací paměti, mějte na paměti následující skutečnosti:
Každé volání MmAllocateNonCachedMemory nebo MmAllocateContiguousMemorySpecifyCache vždy vrátí množství nestránkové systémové paměti, které je úplným násobkem velikosti systémové stránky, bez ohledu na velikost požadovaného přidělení. Proto jsou žádosti o množství paměti menší než jedna stránka zaokrouhleny nahoru na celou stránku a všechny zbývající bajty na stránce jsou zbytečné, protože jsou nepřístupné ovladačem, který volal funkci, a jsou nepoužitelné dalším kódem režimu jádra.
Každé volání AllocateCommonBuffer používá alespoň jeden registr mapování objektů adaptéru, který mapuje alespoň jeden bajt a maximálně jednu stránku. Další informace o mapových registrech a používání běžných vyrovnávacích pamětí naleznete v tématu Adapter Objects a DMA.
Přidělování paměti s exAllocatePoolWithTag
Ovladače mohou také volat ExAllocatePoolWithTag, zadáním jedné z následujících systémem definovaných POOL_TYPE hodnoty pro parametr PoolType:
PoolType = NonPagedPool pro všechny objekty nebo prostředky, které nejsou uložené v rozšíření zařízení nebo kontroleru, ke kterým může ovladač přistupovat při spuštění na úrovni > APC_LEVEL IRQL.
Pro tuto hodnotu PoolType alokuje ExAllocatePoolWithTag požadované množství paměti, pokud je zadaný NumberOfBytes menší nebo roven PAGE_SIZE. V opačném případě jsou všechny zbývající bajty na poslední stránce nevyužité: nepřístupné volajícímu a nepoužitelné jiným kódem v režimu jádra.
Například na systému x86 vrátí žádost o přidělení 5 kilobajtů (KB) dvě 4KB stránky. Poslední 3 kB druhé stránky není volajícímu nebo jinému volajícímu k dispozici. Aby se zabránilo plýtvání fondem nestránkových stránek, ovladač by měl účelně přidělit více stránek. V tomto případě může například ovladač provést dvě přidělení, jedno pro PAGE_SIZE a druhé pro 1 kB, aby celkem přidělil 5 kB.
Poznámka Počínaje systémem Windows Vista systém automaticky přidá další paměť, takže dva přidělení jsou zbytečné.
PoolType = PagedPool pro paměť, ke které se vždy přistupuje v IRQL <= APC_LEVEL a není v zápisové cestě souborového systému.
ExAllocatePoolWithTag vrátí ukazatel NULL, pokud nemůže přidělit požadovaný počet bajtů. Ovladač by měl vždy zkontrolovat vrácený ukazatel. Pokud je jeho hodnota null, rutina DriverEntry (nebo jakákoli jiná rutina ovladače, která vrací hodnoty NTSTATUS), by měla vrátit STATUS_INSUFFICIENT_RESOURCES nebo zpracovat chybovou podmínku, pokud je to možné.