Sdílet prostřednictvím


Použití běžných vyrovnávacích pamětí

[Platí jenom pro KMDF]

Ovladače pro zařízení DMA někdy musí přidělit místo vyrovnávací paměti, ke kterému má zařízení i ovladač přístup. Zařízení může například zapisovat informace o přenosu, jako jsou počty bajtů, do tohoto prostoru vyrovnávací paměti a ovladač ho může přečíst, aby určil počet přenesených bajtů. Tento typ vyrovnávací paměti se nazývá společná vyrovnávací paměť.

Pokud chcete přidělit společnou vyrovnávací paměť, použije se zpětná volací funkce EvtDriverDeviceAdd vašeho ovladače:

Následující příklad kódu pochází ze souboru Init.c ukázky PLX9x5x. Tento kód ukazuje, jak ovladač KMDF přiděluje společný prostor vyrovnávací paměti.

// Allocate common buffer for building writes
DevExt->WriteCommonBufferSize = 
         sizeof( DMA_TRANSFER_ELEMENT) * DevExt->WriteTransferElements;
status = WdfCommonBufferCreate( DevExt->DmaEnabler,
                                DevExt->WriteCommonBufferSize,
                                WDF_NO_OBJECT_ATTRIBUTES, 
                                &DevExt->WriteCommonBuffer );
if (!NT_SUCCESS(status)) {
    . . . //Error-handling code omitted 
    }
DevExt->WriteCommonBufferBase = 
             WdfCommonBufferGetAlignedVirtualAddress(
                      DevExt->WriteCommonBuffer);
DevExt->WriteCommonBufferBaseLA = 
             WdfCommonBufferGetAlignedLogicalAddress(
                      DevExt->WriteCommonBuffer);
RtlZeroMemory( DevExt->WriteCommonBufferBase, DevExt->WriteCommonBufferSize);

Pokud ovladač volá WdfDeviceSetAlignmentRequirement před voláním WdfDmaEnablerCreate, vyrovnávací paměti, které jsou vytvořeny funkcí WdfDmaEnablerCreate, se zarovnají na hranici adresy paměti, kterou ovladač specifikoval pro WdfDeviceSetAlignmentRequirement. V opačném případě se běžné vyrovnávací paměti zarovnají na hranice slovních adres. Ovladač může také zavolat WdfCommonBufferCreateWithConfig, aby určil zarovnání pro jednu vyrovnávací paměť.

Chcete-li získat délku společné vyrovnávací paměti, kterou ovladač přidělil, může ovladač použít funkci WdfCommonBufferGetLength.

Když ovladač dokončí používání společné vyrovnávací paměti, volá WdfObjectDelete.