Aracılığıyla paylaş


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ği NIC'lerinde (1-10 Gb/sn) düzgün çalışır, ancak 10-40 Gb/sn'yi destekleyen yüksek aktarım hızına sahip cihazlarda, donanımla konuşan çekirdek hata ayıklama genişletilebilirlik modülleri genellikle Windows ağ yığınından gelen trafik miktarına ayak uyduramaz, bu nedenle genel sistem performansını düşürür.

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 etkin miniport sürücüsünden yararlanacaktı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ış

  • Birden çok 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.

  • Özgün PF, Windows ağ paketlerini (TCP/IP) yönlendirmek için Windows gelen kutusu NIC sürücüsü tarafından kullanılı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ından çıkar.fun0.0

    • KDNET-KDNET-Ext. modülünün bus.dev eklenen PF'si tükenecektir.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 eklenirken sistemin yeniden başlatılması gerekir ve hata ayıklama ayarları için BCD yapılandırmasında değişiklik yapılması gerekir. Bu, ek pf için yapılandırmanın önyüklemeler arasında kalıcı olması gerektiği anlamına gelir.

  3. Hata ayıklayıcı hata ayıklama cihazına sahip olduğunda PCI 2PF konumuna erişen/çalışan başka bir Windows/UEFI ethernet sürücüsü olmadığından emin olmak için KDNET 2PF yalnızca hata ayıklayıcı tarafından kullanılmalıdır (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, birden çok PF özelliğinin kullanılabildiği NICS'de KDNET 2PF özelliği aracılığıyla yapılandırılmalıdır ve NIC, yukarıda açıklanan tüm gereksinimleri izleyerek 2PF işlevselliğini etkinleştirir.

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

KDNET Çoklu PF Arabirimi MiniPort sürücülerini desteklemek için 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_PFSkullanarak 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. Bağlantı noktası bus.dev.fun (BDF) ile temsil edilir. İşlem, sistem üzerinde miniport sürücüsünün çalıştığı bus.dev.fun (BDF bağlantı noktası) ile yalnızca ilişkili PFS listesini listeler/numaralandırır, çünkü 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_ELEMENTtü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ı içerir (örneğin, bus.dev.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ış arabelleği 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 E_NOT_SUFFICIENT_BUFFER hata dönüş değeri döndürmesi gerekir ve ardından istemci doğru arabellek boyutu ayrılmış başka bir çağrı yapabilir. Buna ek olarak, OID isteği durum alanının (NDIS_IOCTL_OID_REQUEST_INFO.status ile açıklanmıştır) NDIS_STATUS_BUFFER_TOO_SHORTdeğerine eşit olarak ayarlanması gerekir.

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. Bağlantı noktası BDF tarafından temsil edilir.

  • 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, PF işlev numarası eklenen içeren bir ULONG döndürür.

  • Bu OID isteğinin yalnızca bir Output parametresi olacaktı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 edecek şekilde ayarlar.

Uyarı

Eklenen PF yalnızca KDNET tarafından kullanılabilir, bu nedenle Windows NIC sürücüleri eklenen bir PF'de *DEĞİl* çalışacak şekilde ayarlanmıştır, bu nedenle 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. Bağlantı noktası BDF tarafından temsil edilir.

  • 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 sahip olacaktır. 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. Bağlantı noktası BDF tarafından temsil edilir.

  • İ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), bu nedenle sürücünün çalıştığı geçerli BDF ile ilgili olması değildir.

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 (e.g. 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 is 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