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.
Jak je popsáno v Použití Bus-Master DMA, některé ovladače pro zařízení pro bus-master DMA používají výhradně DMA společné vyrovnávací paměti, a některé používají DMA společné vyrovnávací paměti v kombinaci s DMA založeným na paketech.
Používejte DMA společné vyrovnávací paměti úsporně. Nastavení společné vyrovnávací paměti může svázat některé (nebo všechny v závislosti na velikosti požadované vyrovnávací paměti) mapové registry spojené s objektem adaptéru, který představuje adaptér hlavního řadiče sběrnice.
Nastavení společných oblastí vyrovnávací paměti z ekonomického hlediska, jako je použití PAGE_SIZE bloků dat nebo jednoho přidělení, ponechá více registrů mapování dostupných pro operace DMA založené na paketech. Také ponechá více systémové paměti volné pro jiné účely, což vede k lepšímu celkovému výkonu ovladačů a systému.
Chcete-li nastavit společnou vyrovnávací paměť pro bus-master DMA, ovladač zařízení bus-master DMA musí zavolat AllocateCommonBuffer s ukazatelem objektu adaptéru, který vrátí IoGetDmaAdapter. Ovladač obvykle provádí toto volání z rutiny DispatchPnP při požadavcích IRP_MN_START_DEVICE. Ovladač by měl přidělit společnou vyrovnávací paměť pouze v případě, že bude opakovaně používat vyrovnávací paměť pro své operace DMA, pokud zůstane ovladač načten. Diagram níže znázorňuje volání na AllocateCommonBuffer.
Požadovaná velikost vyrovnávací paměti zobrazená v předchozím diagramu jako LengthForBuffer určuje, kolik registrů mapování se musí použít k poskytnutí virtuálního logického mapování pro společnou vyrovnávací paměť. Pomocí makra BYTES_TO_PAGES určete maximální požadovaný počet stránek (BYTES_TO_PAGES (LengthForBuffer)). Tato hodnota nemůže být větší než NumberOfMapRegisters vrácený IoGetDmaAdapter.
Volající navíc musí zadat následující:
Logická hodnota označující, jestli se má povolit ukládání do mezipaměti
Poznámka Tato hodnota je ignorována. Operační systém určuje, zda se má povolit paměť uložená v mezipaměti ve společné vyrovnávací paměti, která se má přidělit. Toto rozhodnutí vychází z architektury procesoru a sběrnice zařízení.
Na počítačích s procesory založenými na platformě x86, x64 a Itanium je povolena paměť uložená v mezipaměti.
Na počítačích s procesory Arm nebo Arm 64 operační systém automaticky nepovoluje paměť uloženou v mezipaměti pro všechna zařízení. Systém spoléhá na metodu ACPI_CCA pro každé zařízení, aby určil, zda je zařízení cache-koherentní.
Ukazatel na proměnnou definovanou ovladačem, která bude obsahovat základní logickou adresu přístupnou zařízením pro vyrovnávací paměť (BufferLogicalAddress v předchozím diagramu) při návratu z AllocateCommonBuffer
Pokud volání proběhne úspěšně, AllocateCommonBuffer vrátí základní virtuální adresu přístupnou ovladačem pro vyrovnávací paměť (BufferVirtualAddress v předchozím diagramu), kterou musí ovladač uložit do svého rozšíření zařízení, rozšíření kontroleru nebo jiné oblasti úložiště přístupné ovladačem (nestránkového fondu přiděleného ovladačem).
AllocateCommonBuffer vrátí NULL, pokud nemůže přidělit paměť pro vyrovnávací paměť. Pokud je vrácená základní virtuální adresa NULL, ovladač musí buď výhradně použít systémovou podporu DMA založenou na paketech, nebo ovladač musí neúspěšně vyřídit IRP_MN_START_DEVICE požadavek, přičemž vrátí STATUS_INSUFFICIENT_RESOURCES.
Jinak může ovladač použít přidělenou společnou vyrovnávací paměť jako oblast úložiště přístupnou ovladačem a adaptérem pro přenosy DMA.
Když správce PnP odešle IRP, který zastaví nebo odebere zařízení, ovladač musí volat FreeCommonBuffer, aby uvolnil každou společnou vyrovnávací paměť, kterou přidělil.