Hata Ayıklayıcı 2PF KDNET Desteği

Bu konu başlığında, genellikle veri merkezlerinde kullanılan yüksek hızlı bağdaştırıcılar için daha yüksek performansa izin vermek üzere 2PF hata ayıklayıcı desteği için miniport NDIS sürücünüzün nasıl etkinleştirileceği açıklanmaktadır. Bu özellik Windows 11 ve sonraki sürümlerde kullanılabilir.

Bir NIC'de çekirdek hata ayıklamasını etkinleştirirken, çekirdek hata ayıklama desteği fiziksel cihazı devralarak kutuda hem çekirdek hata ayıklama hem de ağ bağlantısı sağlar. Bu, tüketici düşük bant genişliğine (1-10 Gb/sn) uygun şekilde çalışır. Ancak, 10–40 Gb/sn'yi destekleyen yüksek aktarım hızına sahip cihazlarda çekirdek hata ayıklama genişletilebilirlik modülleri Windows ağ yığınından gelen trafiğe ayak uyduramaz. Sonuç olarak, genel sistem performansı düşer.

KDNET için PCI çoklu Fiziksel İşlev (PF) özelliğinin kullanılması, hata ayıklamanın neredeyse hiç performans etkisi olmadan etkinleştirilmesini sağlar.

Fiziksel İşlev (PF), tek kök G/Ç sanallaştırma (SR-IOV) arabirimini destekleyen bir ağ bağdaştırıcısının PCI Express (PCIe) işlevidir. PF, PCIe Yapılandırma alanında SR-IOV Genişletilmiş Özelliğini içerir. Bu özellik, sanallaştırmayı etkinleştirme ve PCIe Sanal İşlevleri'ni (VFS) kullanıma açma gibi ağ bağdaştırıcısının SR-IOV işlevselliğini yapılandırmak ve yönetmek için kullanılır.

PF, PCIe yapılandırma alanında SR-IOV Genişletilmiş Yetenek yapısını destekler. Bu yapı, PCI-SIG Tek Kök G/Ç Sanallaştırma ve Paylaşım 1.1 belirtiminde tanımlanır.

Hata ayıklayıcı aktarımı, birden çok veya 2PF özellikli Miniport sürücüsünden yararlanır. Yüksek hızlı sunucu sistemlerinde hata ayıklamaya izin vermek için, NIC satıcılarının ağ kartı üretici yazılımında birden çok PF'yi destekleyen tüm NIC'lerde 2PF'yi etkinleştirmesi önerilir.

Bağlantıyı test etmek için 2PF desteğini yapılandırma hakkında bilgi için bkz. KDNET kullanarak 2PF Kernel-Mode Hata Ayıklamayı Ayarlama.

Birden çok PF KDNET mimarisine genel bakış

  • Çoklu PF (2PF) işlevi, özgün PCI ağ bağlantı noktasına (örneğin, Bus.dev.fun0.0) yeni bir PF eklemek/atamaktır.

  • Eklenen yeni PF (örneğin, bus.dev.fun0.1) yalnızca KDNET tarafından Hata Ayıklayıcı paketlerini hedefe/hedefe yönlendirmek için kullanılır.

  • Windows gelen kutusu NIC sürücüsü, Windows ağ paketlerini (TCP/IP) yönlendirmek için özgün PF'yi kullanır.

  • Bu yaklaşımın kullanılması, her iki sürücü de birbirinin çalışmasını engellemek için paralel olarak çalışabilir.

  • Her iki sürücü de bölümlenmiş PCI yapılandırma alanı üzerinde çalışır

    • Windows Gelen Kutusu sürücüsü, bus.dev özgün ağ bağlantı noktasının dışında çalışır. fun0.0

    • KDNET-KDNET-Ext. modülünde bus.dev eklenen PF tükeniyor. fun0.1, Bu şekilde Windows gelen kutusu NIC sürücüsünün NIC'yi KDNET ile paylaşarak etkilenmemesini sağlar.

  • kdnet.exe kullanıcı modu aracı, KDNET PF eklemek/kaldırmak için belirli IOCTL kodları ekleyerek Windows gelen kutusu sürücüsünü kullanarak 2PF özelliğini yapılandırıyor.

birleştirilmiş PCI kart kurulumu kullanılarak 2PF'yi destekleyen iki ağ yığınını gösteren Diyagramı.

Birden çok PDF özellik tasarım gereksinimleri

  1. KDNET 2PF özelliğinin NT öncesi işletim sistemi (örneğin, Önyükleme Yöneticisi, işletim sistemi yükleyicisi, WinResume, Hyper-V, SK vb.), NT OS veya Windows Masaüstü gibi tüm geçerli KD senaryolarında çalışması gerekir.

  2. Bir cihaz için yeni bir PF eklenmesi hata ayıklama ayarları için BCD yapılandırmasını değiştirirse sistem yeniden başlatması gerekir. Bu gereksinim, ek PF yapılandırmasının önyüklemeler arasında kalıcı olması gerektiği anlamına gelir.

  3. KDNET 2PF'yi yalnızca hata ayıklama için kullanın. Bu, hata ayıklayıcı cihaza sahip olduğunda hiçbir Windows veya UEFI Ethernet sürücüsünün PCI 2PF konumuna erişmemesini sağlar. 2PF konumu dbgsettings::busparams kullanılarak yapılandırılır.

  4. Sistemde KDNET etkinleştirilmemiş olsa bile Windows veya UEFI Ethernet sürücüleri eklenen KDNET 2PF'nin dışında çalışamaz.

  5. 2PF özelliği, geçerli NIC'de işlevselliği eklemek/etkinleştirmek ve kaldırmak/devre dışı bırakmak için dinamik bir mekanizmayı desteklemelidir.

  6. Windows Miniport sürücüleri, aşağıdaki NDIS OID'lerine hizmet veerek 2PF özelliğini uygular.

OID Adı Açıklama
OID_KDNET_ENUMERATE_PFS Miniport sürücüsünün çalıştığı geçerli bus.dev.fun (BDF) üzerindeki PDF'leri numaralandırır.
OID_KDNET_ADD_PF Miniport sürücüsünün çalıştığı geçerli BDF'ye bir PF ekler.
OID_KDNET_REMOVE_PF Eklenen PF'yi BDF'de geçirilenden kaldırır.
OID_KDNET_QUERY_PF_INFORMATION BDF'de geçirilen dosyasından PF bilgileri verilerini sorgular.

OID'ler ve yapıları, genel WDK ile yayımlanan ntddndis.h ve kdnetpf.h dosyalarında tanımlanır.

Her OID için Giriş/Çıkış parametreleri ve kdnetpf.h üst bilgi dosyasında sağlanan bilgiler hakkında aşağıdaki ayrıntılara bakın.

  1. KDNET'i, birden çok PC'yi destekleyen NIC'lerde KDNET 2PF özelliğini kullanarak yapılandırın. NIC'nin 2PF işlevselliğini etkinleştirmek için bu bölümde açıklanan tüm gereksinimleri karşıladığından emin olun.

Windows NIC Sürücüleri için KDNET Birden Çok PF Arabirimi

KDNET Çoklu PF Arabirimini desteklemek için Miniport sürücülerinin aşağıdaki dört NDIS OID'nin işlenmesini uygulaması gerekir.

  • OID_KDNET_ENUMERATE_PFS

  • OID_KDNET_ADD_PF

  • OID_KDNET_REMOVE_PF

  • OID_KDNET_QUERY_PF_INFORMATION

Bu OID'ler ve yapılar, şu yoldaki genel WDK sürümündeki ntddndis.h ve kdnetpf.h dosyalarında doldurulur:

<WDK root directory>\ddk\inc\ndis

Bu dosyalar Windows SDK'sında da kullanılabilir ve bu dizinde bulunabilir.

\Program Files (x86)\Windows Kits\10\Include\<Version for example 10.0.21301.0>\shared

İstemci aracı (kdnet.exe), KDNET 2PF NDIS OID'lerini miniport sürücülerine yönlendirmek için özel bir NDIS IOCTL kullanır.

Çoklu PF özelliği NDIS OID'leri

Çoklu PF özelliği bu dört NDIS OID kullanılarak çalıştırılır.

1. OID: OID_KDNET_ENUMERATE_PFS kullanarak miniport BDF birincil bağlantı noktasındaKI PDF'leri numaralandırın, aşağıdaki tanıma bakın.

  • OID_KDNET_ENUMERATE_PFS, miniport sürücüsünün çalıştığı birincil bağlantı noktasıyla ilişkili tüm BDF'lerin listesini döndürür. bus.dev.fun (BDF) bağlantı noktasını temsil eder. bu işlem yalnızca miniport sürücüsünün çalıştığı bus.dev.fun (BDF bağlantı noktası) ile ilişkili PDF'leri listeler. Her miniport sürücüsü BDF konumunu belirleyebilir.

  • PDF listesi, bir NDIS Sorgusu işlemi aracılığıyla istemciye döndürülür.

  • OID_KDNET_ENUMERATE_PFS OID, NDIS_KDNET_ENUMERATE_PFS yapısıyla ilişkilendirilir.

  • OID_KDNET_ENUMERATE_PFS sürücü işleyicisi, NDIS_KDNET_PF_ENUM_ELEMENT türü tarafından açıklanan her PF öğesiyle BIRLIKTE PDF listesini içeren bir arabellek döndürür.

    PfNumber alanı PF İşlev Numarası'nı (örneğin, bus.dev) içerir.eğlenceli)

    PfState alanı, pf durumu olası değerlerini içerir; her öğe türü NDIS_KDNET_PF_STATE sabit listesi tarafından tanımlanır.

    NDIS_KDNET_PF_STATE::NdisKdNetPfStatePrimary - Bu birincil bir PF'dir ve genellikle yalnızca miniport sürücüsü tarafından kullanılır.

    NDIS_KDNET_PF_STATE::NdisKdnetPfStateEnabled - Bu, KDNET tarafından kullanılan ek bir ikincil PF'dir.

    NDIS_KDNET_PF_STATE::NdisKdnetPfStateConfigured - Bu eklenen bir PF'dir, ancak yalnızca eklenir/yapılandırılır ve kullanılmaz.

  • PF listesi çıkış arabellek boyutu gerçek PDF listesini ayıracak kadar büyük değilse, istemci aracının gerekli boyut arabelleği ayırabilmesi için OID işleyicisinin gerekli arabellek boyutuyla birlikte hata dönüş değeri döndürmesi E_NOT_SUFFICIENT_BUFFER gerekir ve ardından istemci doğru arabellek boyutuyla başka bir çağrı yapabilir. Ayrıca, OID isteği durum alanı (NDIS_IOCTL_OID_REQUEST_INFO.status ile açıklanmıştır) değerine eşit NDIS_STATUS_BUFFER_TOO_SHORTolarak ayarlanmalıdır.

2. Miniport BDF birincil bağlantı noktasına PCI PF ekleyin (OID: OID_KDNET_ADD_PF, aşağıdaki tanıma bakın)

  • Miniport birincil bağlantı noktasına pf ekleyin. bus.dev.fun (BDF) bağlantı noktasını temsil eder.

  • Yeni eklenen PF, bir NDIS Sorgusu işlemi aracılığıyla istemciye döndürülür.

  • OID_KDNET_ADD_PF OID, NDIS_KDNET_ADD_PF yapısıyla ilişkilendirilir.

  • OID_KDNET_ADD_PF sürücü işleyicisi, eklenen PF işlev numarasını içeren bir ULONG döndürür.

  • Bu OID isteğinin yalnızca bir Output parametresi vardır: AddedFunctionNumber. AddedFunctionNumber, miniport PCI konumunda (BDF miniport) eklenen İşlev numarası değerini gösterir. kdnet.exe yardımcı programı bu değeri alır ve dbgsettings::busparams'ı eklenen PF'ye işaret etmek üzere ayarlar.

Uyarı

KDNET, eklenen PF'yi yalnızca kullanabilir. Windows NIC sürücüleri, eklenen bir PF'de *DEĞİl* açıkça çalışacak şekilde ayarlanmıştır. Bu durum, KDNET sistemde *DEĞİl* etkinleştirildiğinde ve PF bağlantı noktasına eklendiğinde de geçerlidir.

3. PCI PF'yi kaldırın (OID: OID_KDNET_REMOVE_PF, aşağıdaki tanıma bakın)

  • verilen bir PF'yi kaldırın. bus.dev.fun (BDF) bağlantı noktasını temsil eder.

  • OID_KDNET_REMOVE_PF OID, NDIS_KDNET_REMOVE_PF yapısıyla ilişkilendirilir.

  • OID_KDNET_REMOVE_PF OID bir giriş BDF bağlantı noktasına sahiptir ve bir NDIS Yöntemi işlemi aracılığıyla PF işlev numarasını kaldıran içeren bir ULONG döndürür.

  • Bu işlev yalnızca OID_KDNET_ADD_PF OID kullanılarak eklenen PDF'lerde başarılı olur.

  • Bu OID isteği, BDF'nin kaldırılması gereken giriş BDF bağlantı noktasına sahiptir. Bu işlevin output parametresi FunctionNumber. Çıkış FunctionNumber , kaldırılan İşlev numarası değerini içerir.

4. PCI PF bilgilerini sorgulama (OID: OID_KDNET_QUERY_PF_INFORMATION, aşağıdaki tanıma bakın)

  • Bu OID kodu, verilen bağlantı noktasıbelirli PF verilerini sorgulamaya olanak tanır. bus.dev.fun (BDF) bağlantı noktasını temsil eder.

  • İstenen PF bilgileri bir NDIS Yöntemi işlemi aracılığıyla istemciye döndürülür.

  • OID_KDNET_QUERY_PF_INFORMATION OID, NDIS_KDNET_QUERY_PF_INFORMATION yapısıyla ilişkilendirilir.

  • OID_KDNET_QUERY_PF_INFORMATION OID giriş BDF bağlantı noktasına sahiptir ve aşağıdaki verileri içeren bir arabellek döndürür:

    • MAC Adresi: Varsa, atanan yeni KDNET PF'sinin ağ adresi.

    • Kullanım Etiketi: PF bağlantı noktasının sahibi olan varlığı açıklar. NDIS_KDNET_PF_USAGE_TAG sabit listesi tarafından tanımlanan sabit bir değer içerir.

    • En Fazla PDF Sayısı: Verilen BDF'ye eklenebilen en fazla SAYıDA PF içeren bir ULONG içerir.

    • Cihaz Kimliği: Verilen BDF bağlantı noktasıyla ilişkili cihaz kimliğini içerir. Bu, NIC FW'sinin yeni eklenen KDNET PF bağlantı noktasına yeni bir cihaz kimliği atadığı durumlar için gereklidir.

  • Bu OID, BDF bağlantı noktasında geçirilen herhangi bir bilgi için bilgi ister (BDF, bu işlem için bir giriş parametresidir). Sürücünün çalıştığı geçerli BDF ile ilgili olması gerekmez.

2PF üzerinde KDNET için NDIS OID'leri

Ntddndis.h dosyası, OID'leri tanımlar.

#if (NDIS_SUPPORT_NDIS686)

 //

 // Optional OIDs to handle network multiple PF feature.

 //
#define OID_KDNET_ENUMERATE_PFS 0x00020222
#define OID_KDNET_ADD_PF 0x00020223
#define OID_KDNET_REMOVE_PF 0x00020224
#define OID_KDNET_QUERY_PF_INFORMATION 0x00020225
#endif // (NDIS_SUPPORT_NDIS686)

Kdnetpf.h dosyası, NDIS OID'leriyle ilişkili türü ve yapıları açıklar.

#if (NDIS_SUPPORT_NDIS686)

 //
 // Used to query/add/remove Physical function on a network port.
 // These structures are used by these OIDs:
 // OID_KDNET_ENUMERATE_PFS
 // OID_KDNET_ADD_PF
 // OID_KDNET_REMOVE_PF
 // OID_KDNET_QUERY_PF_INFORMATION
 // These OIDs handle PFs that are primary intended to be used by  KDNET.
 //
 //
 // PCI location of the port to query
 //
 typedef struct _NDIS_KDNET_BDF
 {
 ULONG SegmentNumber;
 ULONG BusNumber;
 ULONG DeviceNumber;
 ULONG FunctionNumber;
 ULONG Reserved;
 } NDIS_KDNET_BDF, *PNDIS_KDNET_PCI_BDF;

 //
 // PF supported states.
 //
 typedef enum _NDIS_KDNET_PF_STATE
 {
 NdisKdNetPfStatePrimary = 0x0,
 NdisKdnetPfStateEnabled = 0x1,
 NdisKdnetPfStateConfigured = 0x2,
 } NDIS_KDNET_PF_STATE,*PNDIS_KDNET_PF_STATE;

 //
 // PF Usage Tag
 // Used to indicate the entity that owns the PF.
 // Used by the query NdisKdnetQueryUsageTag.
 //
 typedef enum _NDIS_KDNET_PF_USAGE_TAG
 {
 NdisKdnetPfUsageUnknown = 0x0,
 NdisKdnetPfUsageKdModule = 0x1,
 } NDIS_KDNET_PF_USAGE_TAG,*PNDIS_KDNET_PF_USAGE_TAG;

 //
 // PF element array structure
 //
 typedef struct _NDIS_KDNET_PF_ENUM_ELEMENT
 {
 NDIS_OBJECT_HEADER Header;

 //
 // PF value (for example, if <bus.dev.fun>, then PF value = fun)
 //
 ULONG PfNumber;

 //
 // The PF state value (defined by NDIS_KDNET_PF_STATE)
 //
 NDIS_KDNET_PF_STATE PfState;

 } NDIS_KDNET_PF_ENUM_ELEMENT, *PNDIS_KDNET_PF_ENUM_ELEMENT;
#define NDIS_KDNET_PF_ENUM_ELEMENT_REVISION_1 1
#define NDIS_SIZEOF_KDNET_PF_ENUM_ELEMENT_REVISION_1 \
 RTL_SIZEOF_THROUGH_FIELD(NDIS_KDNET_PF_ENUM_ELEMENT, PfState)

 //
 // This structure describes the data required to enumerate the list of PF
 // Used by OID_KDNET_ENUMERATE_PFS.
 //
 typedef struct _NDIS_KDNET_ENUMERATE_PFS
 {
 NDIS_OBJECT_HEADER Header;

 //
 // The size of each element is the sizeof(NDIS_KDNET_PF_ENUM_ELEMENT)
 //
 ULONG ElementSize;

 //
 // The number of elements in the returned array
 //
 ULONG NumberOfElements;

 //
 // Offset value to the first element of the returned array.
 // Each array element is defined by NDIS_KDNET_PF_ENUM_ELEMENT.
 //
 ULONG OffsetToFirstElement;
 } NDIS_KDNET_ENUMERATE_PFS, *PNDIS_KDNET_ENUMERATE_PFS;

#define NDIS_KDNET_ENUMERATE_PFS_REVISION_1 1
#define NDIS_SIZEOF_KDNET_ENUMERATE_PFS_REVISION_1 \
 RTL_SIZEOF_THROUGH_FIELD(NDIS_KDNET_ENUMERATE_PFS,
 OffsetToFirstElement)

 //
 // This structure indicates the data required to add a PF to the BDF port.
 // Used by OID_KDNET_ADD_PF.
 //
 typedef struct _NDIS_KDNET_ADD_PF
 {
 NDIS_OBJECT_HEADER Header;

 //
 // One element containing the added PF port number
 //
 ULONG AddedFunctionNumber;
 } NDIS_KDNET_ADD_PF, *PNDIS_KDNET_ADD_PF;

#define NDIS_KDNET_ADD_PF_REVISION_1 1
#define NDIS_SIZEOF_KDNET_ADD_PF_REVISION_1 \
 RTL_SIZEOF_THROUGH_FIELD(NDIS_KDNET_ADD_PF, AddedFunctionNumber)

 //
 // This structure indicates the data required to remove a PF from the BDF port.
 // Used by OID_KDNET_REMOVE_PF.
 //

 typedef struct _NDIS_KDNET_REMOVE_PF
 {
 NDIS_OBJECT_HEADER Header;

 //
 // PCI location that points to the PF that needs to be removed
 //
 NDIS_KDNET_BDF Bdf;

 //
 // One element containing the removed PF port
 //
 ULONG FunctionNumber;
 } NDIS_KDNET_REMOVE_PF, *PNDIS_KDNET_REMOVE_PF;
#define NDIS_KDNET_REMOVE_PF_REVISION_1 1
#define NDIS_SIZEOF_KDNET_REMOVE_PF_REVISION_1 \
 RTL_SIZEOF_THROUGH_FIELD(NDIS_KDNET_REMOVE_PF, FunctionNumber)

 //
 // This structure describes the data required to query the PF management data
 // Used by OID_KDNET_QUERY_PF_INFORMATION
 //
 typedef struct _NDIS_KDNET_QUERY_PF_INFORMATION
 {
 NDIS_OBJECT_HEADER Header;

 //
 // PF PCI location to query for
 //
 NDIS_KDNET_BDF Bdf;

 //
 // PF assigned MAC address
 //
 UCHAR NetworkAdddress[6];

 //
 // PF Usage tag described by NDIS_KDNET_PF_USAGE_TAG
 //
 ULONG UsageTag;

 //
 // Maximum number of Pfs that can be associated to the Primary BDF.
 //
 ULONG MaximumNumberOfSupportedPfs;

 //
 // KDNET PF device ID (Used if there's a new added PF and
 // the FW assigns a new DeviceID to the added KDNET PF)
 //
 ULONG DeviceId;

 } NDIS_KDNET_QUERY_PF_INFORMATION, *PNDIS_KDNET_QUERY_PF_INFORMATION;
#define NDIS_KDNET_QUERY_PF_INFORMATION_REVISION_1 1
#define NDIS_SIZEOF_KDNET_QUERY_PF_INFORMATION_REVISION_1 \
 RTL_SIZEOF_THROUGH_FIELD(NDIS_KDNET_QUERY_PF_INFORMATION, DeviceId)

#endif // (NDIS_SUPPORT_NDIS686)

Ayrıca bkz.

KDNET Kullanarak 2PF Kernel-Mode Hata Ayıklamayı Ayarlama

kdnetpf.h üst bilgisi