Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе описывается, как включить поддержку отладчика 2PF для минипорта NDIS, чтобы обеспечить повышенную производительность для высокоскоростных адаптеров, часто используемых в центрах обработки данных. Эта функция доступна в Windows 11 и более поздних версиях.
При включении отладки ядра в сетевом адаптере поддержка отладки ядра перехватывает управление физическим устройством, чтобы предоставить возможность как отладки ядра, так и сетевого подключения на устройстве. Это хорошо подходит для сетевых карт с низкой пропускной способностью потребителей (1–10 Гбит/с). Однако на устройствах с высокой пропускной способностью, поддерживающих 10–40 Гбит/с, модули расширяемости ядра не могут поддерживать трафик из сетевого стека Windows. В результате общая производительность системы снижается.
Использование функции PCI с несколькими физическими функциями (PF) для KDNET позволяет включить отладку практически без влияния на производительность.
Физическая функция (PF) — это функция PCI Express (PCIe) сетевого адаптера, поддерживающего единый корневой интерфейс виртуализации ввода-вывода (SR-IOV) . PF включает расширенную возможность SR-IOV в пространстве конфигурации PCIe. Эта возможность используется для настройки SR-IOV функциональных возможностей сетевого адаптера и управления ими, таких как включение виртуализации и предоставление виртуальных функций PCIe.
PF поддерживает структуру расширенных возможностей SR-IOV в пространстве конфигурации PCIe. Эта структура определена в спецификации PCI-SIG виртуализации ввода-вывода с одним корнем и совместного использования ресурсов 1.1.
Транспорт отладчика использует несколько драйверов Минипорта с поддержкой 2PF. Чтобы разрешить отладку систем высокоскоростных серверов, рекомендуется включить поставщики сетевых адаптеров 2PF во всех сетевых адаптерах, которые поддерживают несколько PF в встроенном ПО сетевой карты.
Сведения о настройке поддержки 2PF для проверки подключения см. в статье Настройка отладки 2PF Kernel-Mode с помощью KDNET.
Обзор архитектуры PF KDNET для нескольких устройств
Функциональность нескольких PF (2PF) заключается в добавлении и назначении нового PF для исходного сетевого порта PCI (например, Bus.dev.fun0.0).
Новый добавленный PF (например, bus.dev.fun0.1) используется только KDNET для маршрутизации пакетов отладчика в целевой объект или из нее.
Драйвер сетевой карты для папки "Входящие" Windows использует исходный PF для маршрутизации сетевых пакетов Windows (TCP/IP).
С помощью этого подхода оба драйвера могут работать параллельно, не мешая друг другу.
Оба драйвера выполняются по секционированного пространства конфигурации PCI
Драйвер папки "Входящие" Windows выходит из исходного сетевого порта в bus.dev. fun0.0
KDNET-KDNET-Ext. модуль выходит из добавленного PF в bus.dev. fun0.1, таким образом гарантирует, что драйвер сетевого адаптера windows в папке "Входящие" не влияет на общий доступ к сетевому адаптеру с KDNET.
Средство kdnet.exe пользовательского режима настраивает функцию 2PF с помощью драйвера папки "Входящие", добавив определенные коды IOCTL для добавления и удаления KDNET PF.
Требования к проектированию функций нескольких PFS
Функция KDNET 2PF должна работать для всех текущих сценариев KD, будь то предварительная ОС NT (например, диспетчер загрузки, загрузчик ОС, WinResume, Hyper-V, SK и т. д.), NT OS или Классический компьютер Windows.
При добавлении нового PF для устройства требуется перезагрузка системы для изменения конфигурации BCD для параметров отладки. Это требование означает, что конфигурация для дополнительного PF должна быть постоянной во время загрузки.
Используйте KDNET 2PF только для отладки. Это гарантирует, что драйвер Ethernet Windows или UEFI не обращается к расположению PCI 2PF, когда отладчик владеет устройством. Расположение 2PF настраивается с помощью dbgsettings::busparams.
Драйверы Ethernet Windows или UEFI не могут выйти из добавленной KDNET 2PF, даже если KDNET не включена в системе.
Функция 2PF должна поддерживать динамический механизм для добавления/включения и удаления/отключения функциональности на текущей сетевой карте.
Драйверы Windows Miniport реализуют функцию 2PF с помощью обслуживания следующих NDIS OID.
| Имя OID | Описание |
|---|---|
| OID_KDNET_ENUMERATE_PFS | Перечисляет PFs в текущем bus.dev.fun (BDF), где выполняется драйвер мини-порта. |
| OID_KDNET_ADD_PF | Добавляет PF в текущий BDF, где выполняется минипортовый драйвер. |
| OID_KDNET_REMOVE_PF | Удаляет добавленный PF из переданного в BDF. |
| OID_KDNET_QUERY_PF_INFORMATION | Запрашивает данные сведений PF из переданного в BDF. |
OIDs и их структуры определяются в файлах ntddndis.h и kdnetpf.h, выпущенных с общедоступным WDK.
См. следующие сведения о параметрах входных и выходных данных для каждого OID и сведениях, предоставленных в файле заголовка kdnetpf.h.
- Настройте KDNET с помощью функции KDNET 2PF на сетевых адаптерах, поддерживающих несколько PFS. Убедитесь, что сетевой адаптер соответствует всем требованиям, описанным в этом разделе, для включения функций 2PF.
KDNET с несколькими интерфейсами PF для драйверов сетевого адаптера Windows
Для поддержки интерфейса KDNET Multiple PF драйверы Miniport должны реализовать обработку следующих четырех NDIS OID.
OID_KDNET_ENUMERATE_PFS
OID_KDNET_ADD_PF
OID_KDNET_REMOVE_PF
OID_KDNET_QUERY_PF_INFORMATION
Эти OID и структуры заполняются в файлах ntddndis.h и kdnetpf.h в общедоступной версии WDK по следующему пути:
<WDK root directory>\ddk\inc\ndis
Эти файлы также доступны в пакете SDK для Windows и находятся в этом каталоге.
\Program Files (x86)\Windows Kits\10\Include\<Version for example 10.0.21301.0>\shared
Клиентский инструмент (kdnet.exe) использует частный NDIS IOCTL для маршрутизации NDIS OID KDNET 2PF к минипорт-драйверам.
Функция NDIS с несколькими PF OIDs
Функция нескольких PF управляется с помощью этих четырех NDIS OID.
1. Перечисление PFS на первичном порту минипорта BDF с помощью OID: OID_KDNET_ENUMERATE_PFS см. следующее определение.
OID_KDNET_ENUMERATE_PFS возвращает список всех BDFs, связанных с заданным основным портом, из которого работает мини-драйвер. Bus.dev.fun (BDF) представляет порт. В операции перечислены PFS, связанные только с портом bus.dev.fun (BDF), на котором выполняется мини-драйвер. Каждый минипорт-драйвер может определить расположение BDF.
Список PFS возвращается клиенту с помощью операции запроса NDIS.
OID_KDNET_ENUMERATE_PFS OID связан с структурой NDIS_KDNET_ENUMERATE_PFS.
Обработчик драйвера OID_KDNET_ENUMERATE_PFS возвращает буфер, содержащий список PFS с каждым элементом PF, описанным типом NDIS_KDNET_PF_ENUM_ELEMENT.
Поле PfNumber содержит номер функции PF (например, bus.dev.весело)
Поле PfState содержит возможные значения состояния PF, каждый тип элемента описан в перечислении NDIS_KDNET_PF_STATE.
NDIS_KDNET_PF_STATE::NdisKdNetPfStatePrimary - это основной PF, который обычно используется только драйвером минипорта.
NDIS_KDNET_PF_STATE::NdisKdnetPfStateEnabled — это добавленный дополнительный PF, используемый KDNET.
NDIS_KDNET_PF_STATE::NdisKdnetPfStateConfigured — это добавленная PF, но она только добавлена или настроена и не используется.
Если размер выходного буфера списка PF недостаточно велик, чтобы выделить фактический список PFS, обработчик OID должен возвращать
E_NOT_SUFFICIENT_BUFFERвозвращаемое значение ошибки вместе с требуемым размером буфера, поэтому клиентское средство может выделить необходимый буфер размера, а затем клиент может вызвать другой вызов с правильным размером буфера, выделенным. Кроме того, поле состояния запроса OID (описано NDIS_IOCTL_OID_REQUEST_INFO.status) должно быть равноNDIS_STATUS_BUFFER_TOO_SHORT.
2. Добавьте PCI PF в минипорт BDF основной порт (OID: OID_KDNET_ADD_PF, см. следующее определение)
Добавьте PF в основной порт минипорта. Bus.dev.fun (BDF) представляет порт.
Добавленный PF возвращается клиенту с помощью операции запроса NDIS.
OID_KDNET_ADD_PF OID связан с структурой NDIS_KDNET_ADD_PF.
Обработчик драйвера OID_KDNET_ADD_PF возвращает ULONG, содержащий добавленный номер функции PF.
Этот запрос OID имеет только один выходной параметр:
AddedFunctionNumberAddedFunctionNumberуказывает добавленное значение номера функции в расположении минипорта PCI (минипорт BDF). Программа kdnet.exe получает это значение и настраивает dbgsettings::busparams для точек на добавленный PF.
Заметка
KDNET может использовать добавленный PF исключительно. Драйверы сетевого адаптера Windows настроены для явного запуска *NOT* в добавленной PF. Это также применяется, если KDNET включен в системе, а PF добавляется в порт.
3. Удаление PCI PF (OID: OID_KDNET_REMOVE_PF см. следующее определение)
Удалите PF из заданного порта . Bus.dev.fun (BDF) представляет порт.
OID OID_KDNET_REMOVE_PF связан со структурой NDIS_KDNET_REMOVE_PF.
OID_KDNET_REMOVE_PF OID имеет входной порт BDF и возвращает ULONG, содержащий удаленный удаленный номер функции PF через операцию метода NDIS.
Эта функция успешно выполняется только на PFS, добавленных с помощью OID_KDNET_ADD_PF OID.
Этот запрос OID содержит входной порт BDF, из которого необходимо удалить BDF. Эта функция имеет параметр вывода
FunctionNumber. Выходные данныеFunctionNumberсодержат удаленное значение номера функции.
4. Запрос сведений о PCI PF (OID: OID_KDNET_QUERY_PF_INFORMATION см. следующее определение)
Этот код OID позволяет запрашивать определенные данные PF на заданном порту . Bus.dev.fun (BDF) представляет порт.
Запрошенные сведения о PF возвращаются клиенту с помощью операции метода NDIS.
OID OID_KDNET_QUERY_PF_INFORMATION связан со структурой NDIS_KDNET_QUERY_PF_INFORMATION .
OID_KDNET_QUERY_PF_INFORMATION OID имеет входной порт BDF и возвращает буфер, содержащий следующие данные:
MAC-адрес: сетевой адрес назначенного нового KDNET PF при наличии.
Тег использования: описывает сущность, которая владеет портом PF. Он содержит константное значение, описываемое перечислением NDIS_KDNET_PF_USAGE_TAG.
Максимальное число PFS: содержит ULONG с максимальным числом PFS, которые можно добавить в заданный BDF.
Идентификатор устройства: содержит идентификатор устройства, связанный с заданным портом BDF. Это необходимо для случаев, когда NIC FW назначает новый идентификатор устройства ново добавленному порту KDNET PF.
Этот OID запрашивает сведения для любого переданного порта BDF (BDF является входным параметром для этой операции). Он не обязательно связан с текущим BDF, из которого работает драйвер.
NDIS OIDs для KDNET на 2PF
файл Ntddndis.h определяет OIDs.
#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 описывает тип и структуры, связанные с NDIS OIDами.
#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)
См. также
Настройка 2PF Kernel-Mode Отладка с помощью KDNET