Заголовок pcivirt.h

Справочное руководство по использованию интерфейсов, используемых для предоставления виртуальных машин виртуальной машине.

Устройства, соответствующие спецификации PCI Express Single-Root виртуализации ввода-вывода (SR-IOV), могут предоставлять несколько интерфейсов для устройства. Эти интерфейсы, известные как виртуальные функции (VF), являются независимыми и предоставляются через интерфейс начального устройства, известный как физическая функция (PF). Например, сетевой адаптер Ethernet, поддерживающий SR-IOV, можно спроектировать для коммутатора с одним физическим портом Ethernet (подключенным к физическому проводу) и множеством виртуальных портов Ethernet.

Пространство конфигурации PF позволяет драйверу PF управлять ресурсами PCI VF, включая сопоставленное в памяти пространство ввода-вывода и прерывания с сигналом сообщения. Так как виртуальные машины являются подмножеством полного устройства, они могут быть дешевле предоставлять на оборудовании, чем традиционная функция в пакете с несколькими функциями. Это позволяет создателю устройств создавать дополнительные интерфейсы и централизованно управлять всеми общими ресурсами.

Когда Windows работает непосредственно на оборудовании компьютера, драйверы устройств участвуют в операциях, связанных с Plug and Play, управлением питанием, управлением прерываниями и другими задачами. Доверенный драйвер шины Windows и уровень аппаратной абстракции (HAL) владеют конфигурацией шины и настраивают всю шину. Драйвер работает на том же уровне привилегий, и в режиме ядра нет границ доверия.

Если Windows работает на виртуальной машине, эти предположения не применяются. Виртуальные машины можно поставить под управление виртуальной машины, не относяющейся к привилегированным привилегиям. Однако оборудование должно быть проверено на безопасность, чтобы не влиять на безопасность или производительность системы.

Когда драйвер, работающий на VF, запрашивает пространство для чтения или записи конфигурации, стек виртуализации получает запрос и отправляется в драйвер PF устройства SR-IOV. Драйвер PF отвечает на эти запросы и предоставляет сведения для VF. Драйверу PF иногда может потребоваться запрос на чтение или запись конфигурации, передаваемый на оборудование.

Стек использует MMU ввода-вывода, чтобы различать трафик, поступающий от различных интерфейсов, предоставляемых устройством, применяя политику о том, к каким областям памяти устройство может получить доступ и к каким прерываниям оно может создаваться.

Виртуализация PCI.

Требования к оборудованию

Система, используемая для назначения устройств SR-IOV, должна соответствовать требованиям к сети SR-IOV и прямому назначению устройств. Система должна иметь IOMMU, что IOMMU должна быть настроена для предоставления управления устройствами операционной системе, а PCIe ACS (службы контроль доступа) должны быть включены и настроены для использования операционной системой. Наконец, рассматриваемое устройство не должно использовать прерывания на основе строк и не должно требовать ATS (службы преобразования адресов).

Дополнительные сведения:

Все, что вы хотели знать о SR-IOV в Hyper-V. Часть 1

Дискретное назначение устройства — описание и фон

Чтобы определить, поддерживает ли система назначение устройств и будет ли работать определенное устройство PCI для назначения устройств, выполните следующие действия.

Скрипт дискретного назначения устройств

Запрос устройств SR-IOV

GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE — это интерфейс класса устройства, предоставляемый драйверами для устройств SR-IOV. Этот GUID позволяет запрашивать все стеки устройств, предоставляющие различные таблицы функций, используемые для управления функциями устройства, связанными с виртуализацией. После того как драйвер регистрирует GUID, отдельные возможности обнаруживаются путем отправки IRP_MN_QUERY_INTERFACE. Драйвер должен ответить на этот запрос GUID_SRIOV_DEVICE_INTERFACE_STANDARD. Драйверы также должны обрабатывать IOCTL_SRIOV_NOTIFICATION и IOCTL_SRIOV_EVENT_COMPLETE.

Драйвером для SR_IOV устройства, работающего на привилегированной виртуальной машине, является ОС узла. Он владеет функцией Plug-and-Play и управлением питанием для всего компьютера и предоставляет виртуальные функции PCI Express SR-IOV на непривилегированных виртуальных машинах, которые должны предоставлять GUID_SRIOV_DEVICE_INTERFACE_STANDARD (определенные в заголовке Pcivirt.h). Этот драйвер может быть драйвером физических функций PCI Express SR-IOV( PF), который создает FDO, или более низким фильтром на узле устройства в случае, когда FDO управляется драйвером порта.

Интерфейс устройства необходим, чтобы драйвер смог получить доступ к пространству конфигурации виртуальных машин.

В реализации EVT_WDF_DRIVER_DEVICE_ADD драйвера PF выполните следующие задачи:

  • После вызова WdfDeviceCreate для создания объекта устройства-функции (FDO) вызовите WdfDeviceCreateDeviceInterface для регистрации GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE. Это позволяет стеку виртуализации извлекать дескриптор устройства на устройство SR-IOV.
  • Предоставление GUID_SRIOV_DEVICE_INTERFACE_STANDARD.
    • Инициализируйте структуру SRIOV_DEVICE_INTERFACE_STANDARD и задайте для членов указатели функций обратного вызова, реализованных драйвером PF.
    • Настройте структуру, вызвав WDF_QUERY_INTERFACE_CONFIG_INIT.
    • Зарегистрируйте интерфейс в FDO, вызвав WdfDeviceAddQueryInterface.
    // Make the device visible as an assignable device.
    //
    status = WdfDeviceCreateDeviceInterface(
        fdo,
        &GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE,
        NULL);
    if (!NT_SUCCESS(status))
    {
        TraceEvents(TRACE_LEVEL_ERROR, DBG_INIT,
                    "Failed to create interface: %!STATUS!",
                    status);
        goto Cleanup;
    }

    //
    // Expose SRIOV_DEVICE_INTERFACE_STANDARD
    //
    RtlZeroMemory(&sriovInterface, sizeof(sriovInterface));
    sriovInterface.Size = sizeof(sriovInterface);
    sriovInterface.Version = 1;
    sriovInterface.Context = deviceContext;
    sriovInterface.InterfaceReference = Virtualization_ReferenceInterface;
    sriovInterface.InterfaceDereference = Virtualization_DereferenceInterface;
    sriovInterface.ReadVfConfig = Virtualization_ReadConfig;
    sriovInterface.WriteVfConfig = Virtualization_WriteConfig;
    sriovInterface.ReadVfConfigBlock = Virtualization_ReadBlock;
    sriovInterface.WriteVfConfigBlock = Virtualization_WriteBlock;
    sriovInterface.ResetVf = Virtualization_ResetFunction;
    sriovInterface.SetVfPowerState = Virtualization_SetPowerState;
    sriovInterface.GetDeviceLocation = Virtualization_GetDeviceLocation;
    sriovInterface.GetVendorAndDevice = Virtualization_GetVendorAndDevice;
    sriovInterface.QueryProbedBars = Virtualization_QueryProbedBars;
    sriovInterface.QueryLuid = Virtualization_QueryLuid;


    WDF_QUERY_INTERFACE_CONFIG_INIT(&qiConfig,
                                    (PINTERFACE)&sriovInterface,
                                    &GUID_SRIOV_DEVICE_INTERFACE_STANDARD,
                                    NULL);

    status = WdfDeviceAddQueryInterface(fdo, &qiConfig);

    if (!NT_SUCCESS(status))
    {
        TraceEvents(TRACE_LEVEL_ERROR, DBG_INIT,
                    "WdfDeviceAddQueryInterface failed: %!STATUS!\n",
                    status);
        goto Cleanup;
    }

Обработка событий Plug and Play

Стек виртуализации отвечает за отправку соответствующих сообщений на виртуальную машину, ожидание ответа (с истечением времени ожидания) и в случае не отвечающей виртуальной машины, а также применение соответствующих действий, таких как наложение вето на событие PnP или неожиданное удаление устройства из виртуальной машины, не являющейся привилегированной. Драйверы PF, реализующие GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE, также должны обрабатывать эти запросы управления вводом-выводом, которые позволяют стеку виртуализации реагировать на события PnP.

  • Стек виртуализации сначала отправляет IOCTL_SRIOV_ATTACH на устройство. Это уведомляет устройство о том, что стек виртуализации должен быть уведомлен об определенных событиях PnP.

  • Это происходит до тех пор, пока стек виртуализации не отправит IOCTL_SRIOV_DETACH.

  • Стек виртуализации запрашивает у устройств события PnP, отправляя запросы IOCTL_SRIOV_NOTIFICATION. Драйвер PF может сообщить стеку виртуализации о событии PnP, выполнив запрос IOCTL_SRIOV_NOTIFICATION.

  • Стек виртуализации разблокирует эти события, отправляя IOCTL_SRIOV_EVENT_COMPLETE.

pcivirt.h содержит следующие программные интерфейсы:

Функции IOCTL

 
IOCTL_SRIOV_ATTACH

Запрос указывает, что стек виртуализации хочет зарегистрировать события Plug and Play, полученные устройством SR-IOV.
IOCTL_SRIOV_DETACH

Запрос указывает, что стек виртуализации хочет отменить регистрацию для событий Plug and Play (ранее зарегистрированных с помощью запроса IOCTL_SRIOV_ATTACH).
IOCTL_SRIOV_EVENT_COMPLETE

Запрос указывает, что стек виртуализации или устройство SR-IOV получили одно из событий, перечисленных в SRIOV_PF_EVENT.
IOCTL_SRIOV_INVALIDATE_BLOCK

Запрос IOCTL_SRIOV_INVALIDATE_BLOCK указывает, что стек виртуализации хочет сбросить содержимое указанного блока конфигурации.
IOCTL_SRIOV_MITIGATED_RANGE_UPDATE

Запрос IOCTL_SRIOV_MITIGATED_RANGE_UPDATE указывает, что стек виртуализации хочет обновить до диапазонов мер по устранению рисков.
IOCTL_SRIOV_NOTIFICATION

Запрос указывает, что стек виртуализации хочет получать уведомления при возникновении одного из событий, перечисленных в SRIOV_PF_EVENT.
IOCTL_SRIOV_PROXY_QUERY_LUID

Этот запрос предоставляет локальный уникальный идентификатор SR_IOV устройства, реализующего интерфейс.
IOCTL_SRIOV_QUERY_MITIGATED_RANGE_COUNT

Запрос определяет диапазоны пространства ввода-вывода, сопоставленного с памятью, которые должны быть устранены.
IOCTL_SRIOV_QUERY_MITIGATED_RANGES

Запрос определяет конкретные диапазоны, в которых должны быть размещены перехваты.

Функции обратного вызова

 
READ_WRITE_MITIGATED_REGISTER

Считывает или записывает в адресные пространства с устранением рисков.
SRIOV_GET_DEVICE_LOCATION

Извлекает сведения о текущем расположении устройства PCI в шине, такие как сегмент PCI, шина, устройство и номер функции.
SRIOV_GET_MMIO_REQUIREMENTS

Эта функция обратного вызова не поддерживается.
SRIOV_GET_RESOURCE_FOR_BAR

Возвращает переведенный ресурс для определенного базового регистра адресов (BAR).
SRIOV_GET_VENDOR_AND_DEVICE_IDS

Предоставляет идентификатор поставщика и идентификатор устройства для виртуальной функции PCI Express SR-IOV (VF), которая будет использоваться для создания более универсального идентификатора Plug and Play для VF. Эти идентификаторы нельзя считывать непосредственно из пространства конфигурации VF.
SRIOV_QUERY_LUID

Возвращает локальный уникальный идентификатор устройства SR-IOV.
SRIOV_QUERY_LUID_VF

Возвращает виртуальную функцию PCI Express SR-IOV (VF), заданную уникальным идентификатором.
SRIOV_QUERY_PROBED_BARS

Запрашивает данные, считанные из регистров базовых адресов (PF) физической функции (BAR), если в них сначала было записано значение -1.
SRIOV_QUERY_PROBED_BARS_2

Запрашивает данные, считываемые из указанных регистров базовых адресов (BAR) виртуальной функции PCI Express SR-IOV ( VF), если в них сначала было записано значение -1.
SRIOV_QUERY_VF_LUID

Возвращает локальный уникальный идентификатор виртуальной функции PCI Express SR-IOV (VF).
SRIOV_READ_BLOCK

Считывает данные из указанного блока конфигурации виртуальной функции PCI Express SR-IOV (VF).
SRIOV_READ_CONFIG

Считывает данные из пространства конфигурации указанной виртуальной функции PCI Express SR-IOV (VF).
SRIOV_RESET_FUNCTION

Сбрасывает указанную виртуальную функцию PCI Express SR-IOV (VF).
SRIOV_SET_POWER_STATE

Задает состояние питания указанной виртуальной функции PCI Express SR-IOV (VF).
SRIOV_WRITE_BLOCK

Записывает данные в указанный блок конфигурации виртуальной функции PCI Express SR-IOV (VF).
SRIOV_WRITE_CONFIG

Записывает данные конфигурации в виртуальную функцию PCI Express SR-IOV (VF).

Структуры

 
MITIGABLE_DEVICE_INTERFACE

Хранит указатели функций на функции обратного вызова, реализованные драйвером физических функций (PF), для интерфейса устройства, допускаемого к митигируемому устройству.
SRIOV_DEVICE_INTERFACE_STANDARD

Хранит указатели функций на функции обратного вызова, реализованные драйвером физических функций (PF), в стеке устройств для устройства SR-IOV.
SRIOV_DEVICE_INTERFACE_STANDARD_2

Хранит указатели функций на функции обратного вызова, реализованные драйвером физических функций (PF), в стеке устройств для устройства SR-IOV. Это расширенная версия SRIOV_DEVICE_INTERFACE_STANDARD.
SRIOV_INVALIDATE_BLOCK

Содержит сведения о блоке конфигурации. Эта структура используется в запросе IOCTL_SRIOV_INVALIDATE_BLOCK.
SRIOV_MITIGATED_RANGE_COUNT_INPUT

Эта структура используется в качестве входного буфера для запроса IOCTL_SRIOV_QUERY_MITIGATED_RANGE_COUNT для определения диапазонов пространства ввода-вывода, сопоставленного с памятью, которые необходимо уменьшить.
SRIOV_MITIGATED_RANGE_COUNT_OUTPUT

Эта структура представляет собой выходной буфер, полученный запросом IOCTL_SRIOV_QUERY_MITIGATED_RANGE_COUNT, который содержит массив диапазонов пространства ввода-вывода, сопоставленного с памятью, который необходимо уменьшить.
SRIOV_MITIGATED_RANGE_UPDATE_INPUT

Эта структура используется в качестве входного буфера для запроса IOCTL_SRIOV_MITIGATED_RANGE_UPDATE, чтобы указать виртуальную функцию (VF), для которой необходимо уменьшить объем операций ввода-вывода в памяти.
SRIOV_MITIGATED_RANGE_UPDATE_OUTPUT

Эта структура представляет собой выходной буфер, полученный запросом IOCTL_SRIOV_MITIGATED_RANGE_UPDATE, который указывает на виртуальную функцию (VF), для которой было устранено пространство ввода-вывода, сопоставленное в памяти.
SRIOV_MITIGATED_RANGES_INPUT

Эта структура представляет собой входной буфер в запросе IOCTL_SRIOV_QUERY_MITIGATED_RANGES для получения определенных диапазонов, в которых должны размещаться перехваты.
SRIOV_MITIGATED_RANGES_OUTPUT

Эта структура представляет собой выходной буфер, получаемый запросом IOCTL_SRIOV_QUERY_MITIGATED_RANGES для получения определенных диапазонов, в которых должны размещаться перехваты.
SRIOV_PNP_EVENT_COMPLETE

Сохраняет состояние события, которое драйвер физических функций SR-IOV (PF) должен задать для даже завершения Plug and Play. Эта структура используется во входном буфере запроса IOCTL_SRIOV_EVENT_COMPLETE.
SRIOV_PROXY_QUERY_LUID_OUTPUT

Хранит локальный уникальный идентификатор SR_IOV устройства, реализующего интерфейс . Эта структура представляет собой выходной буфер для запроса IOCTL_SRIOV_PROXY_QUERY_LUID.

Перечисления

 
SRIOV_PF_EVENT

Определяет значения событий для устройства SR-IOV.