Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit onderwerp wordt beschreven hoe u het NDIS-stuurprogramma voor miniport voor ondersteuning voor 2PF-foutopsporingsprogramma's inschakelt om betere prestaties voor adapters met hoge snelheid toe te staan, die vaak worden gebruikt in datacenters. Deze functie is beschikbaar in Windows 11 en hoger.
Bij het inschakelen van kernelfoutopsporing op een NIC, neemt de ondersteuning daarvoor het fysieke apparaat over om zowel kernelfoutopsporing als een netwerkverbinding op het systeem te bieden. Dit werkt prima voor netwerkkaarten met een lage bandbreedte voor consumenten (1-10 Gbps), maar op apparaten met hoge doorvoer die ondersteuning bieden voor 10-40+ Gbps kunnen de kernelfoutopsporingsmodules die met de hardware praten over het algemeen niet de hoeveelheid verkeer die afkomstig is van de Windows-netwerkstack bijhouden, waardoor dit de algehele systeemprestaties vermindert.
Met behulp van de PCI-functie voor meerdere fysieke functies (PF) voor KDNET kan foutopsporing worden ingeschakeld met bijna geen invloed op de prestaties.
De fysieke functie (PF) is een PCI Express (PCIe)-functie van een netwerkadapter die ondersteuning biedt voor single root I/O-virtualisatie (SR-IOV). De PF bevat de SR-IOV Uitgebreide mogelijkheid in de PCIe-configuratieruimte. De mogelijkheid wordt gebruikt voor het configureren en beheren van de SR-IOV-functionaliteit van de netwerkadapter, zoals het inschakelen van virtualisatie en het beschikbaar maken van VIRTUELE PCIe-functies (VFs).
De PF ondersteunt de SR-IOV uitgebreide capaciteitsstructuur in de PCIe-configuratieruimte. Deze structuur wordt gedefinieerd in de PCI-SIG Single Root I/O-virtualisatie en delen-specificatie 1.1.
Het debuggertransport maakt gebruik van meerdere of 2PF-compatibele stuurprogramma's voor minipoorten. Als u foutopsporing van systemen met servers met hoge snelheid wilt toestaan, wordt aanbevolen dat NIC-leveranciers 2PF inschakelen in alle NIC's die ondersteuning bieden voor meerdere PF's in de firmware van de netwerkkaart.
Zie 2PF-Kernel-Mode instellen met KDNET-voor meer informatie over het configureren van 2PF-ondersteuning om een verbinding te testen.
Een overzicht van de KDNET-architectuur met meerdere PF's
De functionaliteit Multiple PF (2PF) is het toevoegen/toewijzen van een nieuwe PF aan de oorspronkelijke PCI-netwerkpoort (bijvoorbeeld Bus.dev.fun0.0).
De nieuwe toegevoegde PF (bijvoorbeeld bus.dev.fun0.1) wordt alleen door KDNET gebruikt om foutopsporingsprogrammapakketten naar/van het doel te routeren.
De oorspronkelijke PF wordt gebruikt door het ingebouwde Windows NIC-stuurprogramma om de Windows-netwerkpakketten (TCP/IP) te routeren.
Met deze methode kunnen beide stuurprogramma's parallel werken zonder elkaar te storen.
Beide stuurprogramma's worden uitgevoerd via de gepartitioneerde PCI-configuratieruimte
Het Windows Inbox-stuurprogramma zal buiten de originele netwerkpoort op bus.dev.fun0.0 draaien.
KDNET-KDNET-Ext. module raakt de toegewezen PF op bus.dev.fun0.1kwijt. Op deze manier wordt ervoor gezorgd dat de ingebouwde NIC-driver van Windows niet wordt beïnvloed door het delen van de NIC met KDNET.
Het hulpmiddel in de kdnet.exe-gebruikersmodus configureert de 2PF-functie door specifiek IOCTL-codes toe te voegen of te verwijderen met behulp van het Windows-inbox-stuurprogramma, om KDNET PF toe te voegen of te verwijderen.
Ontwerpvereisten voor meerdere PFs-functies
De KDNET 2PF-functie moet werken voor alle huidige KD-scenario's, of het nu het pre-NT-besturingssysteem is (bijvoorbeeld Opstartbeheer, osloader, WinResume, Hyper-V, SK, enzovoort), NT-besturingssysteem of Windows Desktop.
Het opnieuw opstarten van het systeem is vereist wanneer het toevoegen van een nieuwe PF voor een apparaat leidt tot een noodzakelijke wijziging in de BCD-configuratie voor de instellingen van foutopsporing. Dit betekent dat de configuratie voor een extra PF permanent moet zijn over alle systeemstarts heen.
De KDNET 2PF mag alleen worden gebruikt door het foutopsporingsprogramma om ervoor te zorgen dat er geen andere Windows/UEFI Ethernet-stuurprogramma's die vanaf de PCI 2PF-locatie worden geopend/uitgevoerd wanneer het foutopsporingsprogramma eigenaar is van het foutopsporingsapparaat (de 2PF-locatie is geconfigureerd met behulp van dbgsettings::busparams).
Windows- of UEFI Ethernet-stuurprogramma's kunnen niet draaien vanuit de toegevoegde KDNET 2PF, zelfs niet wanneer KDNET niet is ingeschakeld in het systeem.
De 2PF-functie moet een dynamisch mechanisme ondersteunen voor het toevoegen/inschakelen en verwijderen/uitschakelen van de functionaliteit op de huidige NIC.
De Windows-minipoortstuurprogramma's implementeren de 2PF-functie via het onderhoud van de volgende NDIS-OID's.
| OID-naam | Beschrijving |
|---|---|
| OID_KDNET_ENUMERATE_PFS | Inventariseert PFs op de huidige bus.dev.fun (BDF), waar het minipoortstuurprogramma wordt uitgevoerd. |
| OID_KDNET_ADD_PF | Voegt een PF toe aan de huidige BDF waarop het minipoortstuurprogramma actief is. |
| OID_KDNET_REMOVE_PF | De toegevoegde PF wordt verwijderd uit de doorgegeven BDF. |
| OID_KDNET_QUERY_PF_INFORMATION | Query's uitvoeren op PF-gegevens uit de doorgegeven in BDF. |
De OID's en hun structuren worden gedefinieerd in ntddndis.h- en kdnetpf.h-bestanden die worden vrijgegeven met de openbare WDK.
Zie de onderstaande details over invoer-/uitvoerparameters voor elke OID en de informatie in het kdnetpf.h-headerbestand.
- KDNET moet worden geconfigureerd via de KDNET 2PF-functie op NICS waar meerdere PF-functies beschikbaar zijn en de NIC maakt 2PF-functionaliteit mogelijk door alle hierboven beschreven vereisten te volgen.
KDNET Meerdere PF-interface voor Windows NIC-stuurprogramma's
Om ondersteuning te bieden voor de KDNET Multiple PF Interface Miniport-stuurprogramma's, moeten de volgende vier NDIS-OID's worden verwerkt.
OID_KDNET_ENUMERATE_PFS
OID_KDNET_ADD_PF
OID_KDNET_REMOVE_PF
OID_KDNET_QUERY_PF_INFORMATION
Deze OID's en structuren worden ingevuld in de bestanden ntddndis.h en kdnetpf.h in de openbare WDK-release op dit pad:
<WDK root directory>\ddk\inc\ndis
Deze bestanden zijn ook beschikbaar in de Windows SDK en zijn te vinden in deze map.
\Program Files (x86)\Windows Kits\10\Include\<Version for example 10.0.21301.0>\shared
Het clienttool (kdnet.exe) gebruikt een private NDIS IOCTL om de KDNET 2PF NDIS OIDs naar de miniportdrivers te routeren.
De functie voor meerdere PF's van NDIS OID's
De functie Meerdere PF wordt uitgevoerd met behulp van deze vier NDIS-OID's.
1. PFs opsommen van de primaire mini-BDF-poort met behulp van OID: OID_KDNET_ENUMERATE_PFS, zie de onderstaande definitie.
OID_KDNET_ENUMERATE_PFS retourneert een lijst met alle BDF's die zijn gekoppeld aan de opgegeven primaire poort van waaruit het minipoortstuurprogramma wordt uitgevoerd. De poort wordt gerepresenteerd door de bus.dev.fun (BDF). De bewerking vermeldt/inventariseert de lijst met PFS die zijn die alleen zijn gekoppeld aan de bus.dev.fun (BDF-poort) van waaruit het minipoortstuurprogramma wordt uitgevoerd op het systeem, omdat elk minipoortstuurprogramma de BDF-locatie kan bepalen.
De lijst met PFs wordt via een NDIS-querybewerking naar de client geretourneerd.
De OID_KDNET_ENUMERATE_PFS OID is gekoppeld aan de NDIS_KDNET_ENUMERATE_PFS structuur.
De OID_KDNET_ENUMERATE_PFS stuurprogrammahandler retourneert een buffer met de lijst van PF's, waarbij elk PF-element wordt beschreven door het type NDIS_KDNET_PF_ENUM_ELEMENT.
Het veld PfNumber bevat het PF-functienummer (bijvoorbeeld bus.dev.functie)
Het veld PfState bevat de mogelijke pf-statuswaarden: elk elementtype dat wordt beschreven door NDIS_KDNET_PF_STATE enum.
NDIS_KDNET_PF_STATE::NdisKdNetPfStatePrimary - Dit is een primaire PF en wordt meestal alleen gebruikt door het minipoortstuurprogramma.
NDIS_KDNET_PF_STATE::NdisKdnetPfStateEnabled - Dit is een secundaire PF die wordt gebruikt door KDNET.
NDIS_KDNET_PF_STATE::NdisKdnetPfStateConfigured - Dit is een toegevoegde PF, maar wordt alleen toegevoegd/geconfigureerd en wordt niet gebruikt.
Als de uitvoerbuffergrootte van de PF-lijst niet groot genoeg is om de werkelijke lijst met PFs toe te wijzen, moet de OID-handler
E_NOT_SUFFICIENT_BUFFERgeretourneerde foutwaarde retourneren, samen met de vereiste buffergrootte, zodat het clienthulpprogramma de vereiste groottebuffer kan toewijzen. Vervolgens kan de client een andere aanroep uitvoeren met de juiste buffergrootte toegewezen. Daarnaast moet het veld OID-aanvraagstatus (beschreven door NDIS_IOCTL_OID_REQUEST_INFO.status) worden ingesteld op gelijk aanNDIS_STATUS_BUFFER_TOO_SHORT.
2. PCI PF toevoegen aan de primaire poort van de minipoort BDF (OID: OID_KDNET_ADD_PF, zie de definitie hieronder)
Voeg een PF toe aan de primaire poort van de minipoort. De poort wordt vertegenwoordigd door de BDF.
De zojuist toegevoegde PF wordt via een NDIS-querybewerking naar de client geretourneerd.
De OID_KDNET_ADD_PF OID is gekoppeld aan de NDIS_KDNET_ADD_PF structuur.
De OID_KDNET_ADD_PF driver handler retourneert een ULONG met het toegevoegde PF-functienummer.
Deze OID-aanvraag heeft slechts één uitvoerparameter:
AddedFunctionNumber. DeAddedFunctionNumbergeeft het toegevoegde functienummer aan op de miniport-PCI-locatie (de BDF-miniport). Het hulpprogramma kdnet.exe ontvangt deze waarde en configureert dbgsettings::busparams om te verwijzen naar de toegevoegde PF.
Notitie
De toegevoegde PF kan uitsluitend door KDNET worden gebruikt. Windows NIC-stuurprogramma's zijn zo geconfigureerd dat ze niet werken op een toegevoegde PF. Dit geldt ook wanneer KDNET niet is ingeschakeld op het systeem en de PF aan de poort is toegevoegd.
3. PCI PF (OID: OID_KDNET_REMOVE_PFverwijderen, zie definitie hieronder)
Verwijder een PF van de opgegeven poort . De poort wordt vertegenwoordigd door de BDF.
De OID_KDNET_REMOVE_PF OID is gekoppeld aan de NDIS_KDNET_REMOVE_PF structuur.
De OID_KDNET_REMOVE_PF OID heeft een BDF-invoerpoort en retourneert een ULONG met de verwijderd PF-functienummer via een NDIS-methodebewerking.
Deze functie slaagt alleen voor de PFs die zijn toegevoegd met de OID_KDNET_ADD_PF OID.
Deze OID-aanvraag heeft de invoer-BDF-poort waaruit de BDF moet worden verwijderd. Deze functie heeft een uitvoerparameter van
FunctionNumber. De uitvoerFunctionNumberbevat de waarde van het verwijderde functienummer.
4. Voer een query uit op PCI PF-gegevens (OID: OID_KDNET_QUERY_PF_INFORMATION, zie de onderstaande definitie)
Met deze OID-code kunt u query's uitvoeren op specifieke PF-gegevens op een opgegeven poort. De poort wordt vertegenwoordigd door de BDF.
De aangevraagde PF-gegevens worden via een NDIS-methodebewerking naar de client geretourneerd.
De OID_KDNET_QUERY_PF_INFORMATION OID is gekoppeld aan de NDIS_KDNET_QUERY_PF_INFORMATION structuur.
De OID_KDNET_QUERY_PF_INFORMATION OID heeft een BDF-invoerpoort en retourneert een buffer met de volgende gegevens:
MAC-adres: netwerkadres van de toegewezen nieuwe KDNET PF, indien aanwezig.
Gebruikstag: Beschrijft de entiteit die eigenaar is van de PF-poort. Deze bevat een constante waarde die wordt beschreven door NDIS_KDNET_PF_USAGE_TAG enum.
Maximum aantal PF's: Bevat een ULONG met het maximale aantal PF's dat kan worden toegevoegd aan de opgegeven BDF.
Apparaat-id: bevat de apparaat-id die is gekoppeld aan de opgegeven BDF-poort. Dit is vereist voor gevallen waarin de NIC FW een nieuwe apparaat-id toewijst aan de nieuwe toegevoegde KDNET PF-poort.
Deze OID vraagt de informatie op voor elke doorgegeven BDF-poort (BDF is een invoerparameter voor deze bewerking), dus het is niet noodzakelijkerwijs gerelateerd aan de huidige BDF van waaruit het stuurprogramma wordt uitgevoerd.
NDIS-OID's voor KDNET op 2PF
Ntddndis.h-bestand definieert de OID's.
#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 bestand beschrijft het type en de structuren die zijn gekoppeld aan de NDIS-OID's.
#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)
Zie ook
2PF-Kernel-Mode Foutopsporing instellen met behulp van KDNET-