Aracılığıyla paylaş


Ortak Arabellekleri Kullanma

[Yalnızca KMDF için geçerlidir]

DMA cihazlarının sürücüleri bazen hem bir cihazın hem de sürücünün erişebileceği arabellek alanı ayırmalıdır. Örneğin, bir cihaz bayt sayısı gibi aktarım bilgilerini bu arabellek alanına yazabilir ve sürücü aktarılan bayt sayısını belirlemek için bu bilgileri okuyabilir. Bu arabellek alanı türü, ortak arabellek olarak adlandırılır.

Ortak bir arabellek ayırmak için sürücünüzün EvtDriverDeviceAdd geri çağırma fonksiyonu:

Aşağıdaki kod örneği, PLX9x5x örneğinin Init.c dosyasından alınmıştır. Bu kod, KMDF sürücüsünün ortak arabellek alanını nasıl ayırıyor olduğunu gösterir.

// 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);

Sürücünüz WdfDmaEnablerCreate'i çağırmadan önce WdfDeviceSetAlignmentRequirement'i çağırırsa, WdfDmaEnablerCreate tarafından oluşturulan arabellekler, sürücünün WdfDeviceSetAlignmentRequirement 'e belirttiği bellek adresi sınırına hizalanır. Aksi takdirde, ortak arabellekler sözcük adresi sınırlarına hizalanır. Alternatif olarak, sürücü tek bir arabellek için bir hizalama belirtmek üzere WdfCommonBufferCreateWithConfig çağırabilir.

Sürücünüzün ayırdığı ortak bir arabelleğin uzunluğunu elde etmek için, sürücü WdfCommonBufferGetLengthçağırabilir.

Sürücü ortak bir arabellek kullanmayı bitirdiğinde, sürücü WdfObjectDelete çağırır.