Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Arabellek yönetimi, iletim (Tx) ve alma (Rx) veri yolları için sistem belleğinden paket veri arabellekleri ayrılırken Ağ Arabirimi Kartı (NIC) istemci sürücülerinin ve işletim sisteminin birlikte çalışmasını sağlayan bir özelliktir. Bu, NIC için daha hızlı performansa, NIC'nin istemci sürücüsü için daha kolay bellek ömrü yönetimine ve sistem için bellek üzerinde daha fazla denetime neden olabilir.
NetAdapterCx'te arabellek yönetiminin avantajları
Veri arabelleklerinin paket yükleri için sistem belleğinden ayrılacağı yer seçimi, veri yolunun performansı açısından kritik önem taşır. NetAdapterCx'te arabellek yönetimi modeli DMA özellikli NIC donanımı için iyileştirilmiştir ve istemci sürücülerinin bundan yararlanmasının en iyi yolu, sistemin hem Tx hem de Rx yolları için kendi adına veri arabellekleri ayırmasına izin vermektir. Ancak istemci sürücüleri, sistemin veri arabelleklerini nereye ve nasıl ayıracağını etkileyerek, bu arabelleklerin istemcinin donanımı tarafından kolayca kullanılabilmesini sağlayabilir.
Örneğin tipik bir DMA özellikli NIC'yi göz önünde bulundurun. Bu yaklaşımın birçok avantajı vardır:
- Veri arabellekleri sistem tarafından ayrılır ve serbest bırakılır. Bu nedenle, istemci sürücüsü bellek ömrü yönetimi yükünden kurtulur.
- Sistem, istemci sürücüsü tarafından bildirilen özelliklere göre ayrılan veri arabelleklerinin NIC donanımı için DMA'ya hazır olmasını sağlar. Ardından, istemci sürücüsü, ek DMA eşleme işlemleri gerçekleştirmeden veri arabelleklerini donanım as-is'a basitçe programlayabilir.
- Sistem, veri arabelleklerini ayırırken üst katman uygulamalarının gereksinimlerini dikkate alarak yalnızca yerel uçtan uca performans yerine genel uçtan uca performans için iyileştirmeye karar verebilir.
USB tabanlı ağ donanım kilidi gibi DMA özellikli olmayan NIC'ler veya diğer gelişmiş/yazılım NIC'leri için arabellek yönetim modeli, veri arabelleği yönetimini istemci sürücüsüne tamamen bırakma seçeneği de sağlar.
Arabellek yönetiminden yararlanma
Önemli
Donanımınız DMA özellikliyse Rx ve Tx özelliklerinizi ayarlamadan önce bir WDFDMAENABLER nesnesi oluşturmanız gerekir. WDFDMAENABLER nesnenizi WDF_DMA_ENABLER_CONFIG yapısıyla yapılandırırken, DMA sürüm 3'ün belirtilmesi için WdmDmaVersionOverride üyesini 3 olarak ayarladığınızdan emin olun.
Arabellek yönetimini kabul etmek için şu adımları izleyin:
- Ağ bağdaştırıcınızı başlatırken, ancak NetAdapterStartçağırmadan önce, sırasıyla Rx ve Tx yolu için NET_ADAPTER_RX_CAPABILITIES ve NET_ADAPTER_TX_CAPABILITIES veri yapısını kullanarak donanımınızın veri arabelleği özelliklerini ve kısıtlamalarını sisteme bildirin.
- Başlatma işlevlerinden birini çağırarak iki özellik yapısını başlatın. Örneğin, DMA özellikli bir NIC istemci sürücüsü, donanım DMA uygunluklarını bildirmek ve sisteme veri arabelleklerini kendi adına tam olarak yönetmesini bildirmek için NET_ADAPTER_TX_CAPABILITIES_INIT_FOR_DMA ve NET_ADAPTER_RX_CAPABILITIES_INIT_SYSTEM_MANAGED_DMA kullanır.
- Başlatılan Tx ve Rx yetenek yapılarını NetAdapterSetDatapathCapabilities metoduna iletin.
Örnek
Aşağıdaki örnekte, NIC istemci sürücünüzde arabellek yöneticisini kullanmaya başlamaya yönelik önceki bölümde özetlenen temel adımlar gösterilmektedir. Örnekte hem Tx hem de Rx için DMA kullanıldığından, daha önce cihaz bağlam alanında depolandığı bir WDFDMAENABLER nesnesi oluşturmuştur.
Örneğin, Tx ve Rx yetkinlik yapılarını başlattıktan sonra parça arabellekleri hakkında bazı ipuçları da sağladığını unutmayın. Bu ipuçları NetAdapterCx ve protokol sürücüleri tarafından performansı geliştirmek için kullanılabilir.
Hata işleme, netlik amacıyla hariç tutuldu.
VOID
MyAdapterSetDatapathCapabilities(
_In_ NETADAPTER Adapter
)
{
// Get the device context
PMY_DEVICE_CONTEXT deviceContext = GetMyContextFromDevice(Adapter);
// Set various capabilities such as link layer MTU size, link layer capabilities, and power capabilities
...
// Initialize the Tx DMA capabilities structure
NET_ADAPTER_DMA_CAPABILITIES txDmaCapabilities;
NET_ADAPTER_DMA_CAPABILITIES_INIT(&txDmaCapabilities,
deviceContext->dmaEnabler);
// Set Tx capabilities
NET_ADAPTER_TX_CAPABILITIES txCapabilities;
NET_ADAPTER_TX_CAPABILITIES_INIT_FOR_DMA(&txCapabilities,
&txDmaCapabilities,
1);
txCapabilities.FragmentRingNumberOfElementsHint = deviceContext->NumTransmitControlBlocks * MAX_PHYS_BUF_COUNT;
txCapabilities.MaximumNumberOfFragments = MAX_PHYS_BUF_COUNT;
// Initialize the Rx DMA capabilities structure
NET_ADAPTER_DMA_CAPABILITIES rxDmaCapabilities;
NET_ADAPTER_DMA_CAPABILITIES_INIT(&rxDmaCapabilities,
deviceContext->dmaEnabler);
// Set Rx capabilities
NET_ADAPTER_RX_CAPABILITIES rxCapabilities;
NET_ADAPTER_RX_CAPABILITIES_INIT_SYSTEM_MANAGED_DMA(&rxCapabilities,
&rxDmaCapabilities,
MAX_PACKET_SIZE + FRAME_CRC_SIZE + RSVD_BUF_SIZE,
1);
rxCapabilities.FragmentBufferAlignment = 64;
rxCapabilities.FragmentRingNumberOfElementsHint = deviceContext->NumReceiveBuffers;
// Set the adapter's datapath capabilities
NetAdapterSetDatapathCapabilities(Adapter,
&txCapabilities,
&rxCapabilities);
}