目录
Single Root I/O虚拟化(SR-IOV)概述
Single Root I / O虚拟化(SR-IOV)接口是对PCI Express(PCIe)规范的扩展。SR-IOV允许设备(例如网络适配器)在各种PCIe硬件功能之间分离对其资源的访问。这些功能包括以下类型:
- 一个的PCIe物理功能(PF) 。此功能是设备的主要功能,并通告设备的SR-IOV功能。PF与虚拟化环境中的Hyper-V父分区关联。
- 一个或多个PCIe虚拟功能(VF)。每个VF与设备的PF相关联。VF与设备上的PF和其他VF共享设备的一个或多个物理资源,例如内存和网络端口。每个VF与虚拟化环境中的Hyper-V子分区关联。
每个PF和VF均分配有唯一的PCI Express请求者ID(RID),该ID允许I / O内存管理单元(IOMMU)区分不同的业务流,并在PF和VF之间应用内存和中断转换。这样可以将流量直接传递到适当的Hyper-V父分区或子分区。结果,非特权数据流量从PF流向VF,而不会影响其他VF。
SR-IOV使网络流量可以绕过Hyper-V虚拟化堆栈的软件交换层。由于VF已分配给子分区,因此网络流量直接在VF和子分区之间流动。结果,减少了软件仿真层中的I / O开销,并实现了与非虚拟化环境几乎相同的网络性能。
有关更多信息,请参见以下主题:
SR-IOV架构
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/sr-iov-architecture
本节简要概述了单根I / O虚拟化(SR-IOV)接口及其组件。
下图显示了Windows Server 2012中从NDIS 6.30开始的SR-IOV的组件。
SR-IOV接口包含以下组件:
- Hyper-V可扩展交换机模块:可扩展交换机模块,用于配置SR-IOV网络适配器上的NIC交换机,以提供与Hyper-V子分区的网络连接。注意 Hyper-V子分区称为虚拟机(VM)。
- 如果子分区连接到PCI Express(PCIe)虚拟功能(VF),则可扩展交换机模块将不参与VM和网络适配器之间的数据通信。取而代之的是,数据流量直接在VM和它所连接的VF之间传递。有关可扩展交换机的更多信息,请参见Hyper-V可扩展交换机。
- 物理功能(PF):PF是支持SR-IOV接口的网络适配器的PCI Express(PCIe)功能。PF在PCIe配置空间中包括SR-IOV扩展功能。该功能用于配置和管理网络适配器的SR-IOV功能,例如启用虚拟化和公开VF。有关更多信息,请参阅SR-IOV物理功能(PF)。
- PF微型端口驱动程序:PF微型端口驱动程序负责管理一个或多个VF使用的网络适配器上的资源。因此,在为VF分配任何资源之前,将PF微型端口驱动程序加载到管理操作系统中。释放为VF分配的所有资源后,将停止PF微型端口驱动程序。有关更多信息,请参见编写SR-IOV PF微型端口驱动程序。
- 虚拟功能(VF):VF是支持SR-IOV接口的网络适配器上的轻型PCIe功能。VF与网络适配器上的VF关联,并且代表网络适配器的虚拟实例。每个VF都有自己的PCI配置空间。每个VF还与PF和其他VF共享网络适配器上的一个或多个物理资源,例如外部网络端口。有关更多信息,请参见SR-IOV虚拟功能(VF)。
- VF微型端口驱动程序:VF微型端口驱动程序安装在VM中以管理VF。VF微型端口驱动程序执行的任何操作都不得影响同一网络适配器上的任何其他VF或PF。有关更多信息,请参见编写SR-IOV VF微型端口驱动程序。
- 网络接口卡(NIC)开关:NIC开关是支持SR-IOV接口的网络适配器的硬件组件。NIC交换机在适配器的物理端口和内部虚拟端口(VPort)之间转发网络流量。每个VPort都连接到PF或VF。有关更多信息,请参阅NIC交换机。
- 虚拟端口(VPort ):VPort是一个数据对象,代表支持SR-IOV接口的网络适配器的NIC交换机上的内部端口。类似于物理交换机上的端口,NIC交换机上的VPort向与该端口相连的PF或VF传递数据包。有关更多信息,请参阅NIC交换机。
- 物理端口:物理端口是网络适配器的硬件组件,支持SR-IOV接口。物理端口提供了适配器上与外部网络介质的接口。
Hyper-V可扩展交换机简介
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/hyper-v-extensible-switch
Hyper-V可扩展交换机支持一个接口,该接口允许NDIS筛选器驱动程序实例(称为可扩展交换机扩展)绑定到可扩展交换机驱动程序堆栈中。绑定和启用它们之后,扩展可以监视,修改数据包并将其转发到可扩展的交换机端口。这还允许扩展拒绝,重定向数据包或将数据包发送到Hyper-V分区使用的端口。
从Windows Server 2012中的NDIS 6.30开始支持Hyper-V可扩展开关。
本节包括以下主题,这些主题描述了Hyper-V可扩展交换机及其接口:
- 开始编写Hyper-V可扩展交换机扩展
- Hyper-V可扩展交换机概述
- Hyper-V可扩展交换机体系结构
- 编写Hyper-V可扩展交换机扩展
- 安装Hyper-V可扩展交换机扩展
- Hyper-V可扩展交换机OID
SR-IOV物理功能(PF)
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/sr-iov-physical-function--pf-
物理功能(PF)是网络适配器的PCI Express(PCIe)功能,支持单根I / O虚拟化(SR-IOV)接口。PF在PCIe配置空间中包括SR-IOV扩展功能。该功能用于配置和管理网络适配器的SR-IOV功能,例如启用虚拟化和公开PCIe虚拟功能(VF)。
PF在Hyper-V父分区的管理操作系统中作为虚拟网络适配器公开。PF微型端口驱动程序是在管理操作系统中管理PF的NDIS微型端口驱动程序。VF的配置和配置,以及用于支持VF的其他硬件和软件资源,是通过PF微型端口驱动程序执行的。PF微型端口驱动程序使用传统的NDIS微型端口驱动程序功能来提供对管理操作系统的网络I / O资源的访问。PF驱动程序还用作管理适配器上为VF分配的资源的方法。
PF在其PCIe配置空间中支持SR-IOV扩展功能结构。此结构在PCI-SIG单根I / O虚拟化和共享1.1规范中定义。该结构包括以下成员:
TotalVFs
一个只读字段,指定可以与PF关联的VF的最大数量。
NumVFs
一个读写字段,它指定SR-IOV网络适配器上可用的VF的当前数量。
SR-IOV控制
一个读写字段,它指定用于启用或禁用网络适配器上的SR-IOV功能的各种控制位。例如,如果VF使能位设置为1 ,则VF可以与适配器上的PF关联。如果此位设置为零,则VF被禁用,并且在适配器上不可见。
PF还为管理操作系统提供了与外部物理网络进行通信的机制。PF提供了与连接到Hyper-V可扩展交换机模块的所有虚拟网络适配器的网络连接。这包括以下内容:
-
提供与Hyper-V父分区的网络连接的虚拟网络适配器。
-
提供与未为其分配VF的Hyper-V子分区的网络连接的虚拟网络适配器。
PF miniport驱动程序负责管理一个或多个VF使用的网络适配器上的资源。因此,在为VF分配任何资源之前,将PF微型端口驱动程序加载到管理操作系统中。释放为VF分配的所有资源后,将停止PF微型端口驱动程序。
编写SR-IOV PF微型端口驱动程序概述
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/writing-sr-iov-pf-miniport-drivers
本节讨论为单个根I / O虚拟化(SR-IOV)网络适配器的PCI Express(PCIe)物理功能(PF)编写NDIS微型端口驱动程序的要求和准则。
本节包括以下主题:
注意: 有关如何为SR-IOV网络适配器的PCIe虚拟功能(VF)编写微型端口驱动程序的信息,请参阅《编写SR-IOV VF微型端口驱动程序》。
SR-IOV虚拟功能(VF)
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/sr-iov-virtual-functions--vfs-
PCI Express(PCIe)虚拟功能(VF)是网络适配器上的轻量级PCIe功能,支持单根I / O虚拟化(SR-IOV)。VF与网络适配器上的PCIe物理功能(PF)关联,并且代表网络适配器的虚拟实例。每个VF都有自己的PCI配置空间。每个VF还与PF和其他VF共享网络适配器上的一个或多个物理资源,例如外部网络端口。
VF不是成熟的PCIe设备。但是,它提供了用于在Hyper-V子分区和基础SR-IOV网络适配器之间直接传输数据的基本机制。与数据传输相关的软件资源可直接用于VF,并且与其他VF或PF隔离使用。但是,大多数这些资源的配置由运行在Hyper-V父分区的管理操作系统中的PF微型端口驱动程序执行。
在Hyper-V子分区中运行的来宾操作系统中,VF作为虚拟网络适配器(VF网络适配器)公开。在将VF与SR-IOV网络适配器的NIC交换机上的虚拟端口(VPort)关联之后,在VM中运行的虚拟PCI(VPCI)驱动程序将公开VF网络适配器。公开后,来宾操作系统中的PnP管理器将加载VF微型端口驱动程序。
注意 Hyper-V子分区也称为虚拟机(VM)。
VF微型端口驱动程序是VM中安装的用于管理VF的NDIS微型端口驱动程序。VF微型端口驱动程序执行的任何操作都不得影响同一网络适配器上的任何其他VF或PF。
VF微型端口驱动程序可以像任何PCI设备驱动程序一样运行。它可以读写VF的PCI配置空间。但是,对虚拟PCI设备的访问是特权操作,并且由PF微型端口驱动程序通过以下方式进行管理:
-
当VF微型端口驱动程序调用NdisMGetBusData从VF网络适配器的PCI配置空间读取数据时,将通知虚拟化堆栈。该堆栈在Hyper-V父分区的管理操作系统中运行。当堆栈被告知读取请求时,它将向PF微型端口驱动程序发出OID_SRIOV_READ_VF_CONFIG_SPACE的对象标识符(OID)方法请求。OID请求中包含的NDIS_SRIOV_READ_VF_CONFIG_SPACE_PARAMETERS结构中指定了要读取的数据。
驱动程序从VF PCI配置空间读取请求的数据,并通过完成OID请求返回数据。当对NdisMGetBusData的调用完成时,此数据然后返回到VF微型端口驱动程序。
-
当VF微型端口驱动程序调用NdisMSetBusData将数据写入VF网络适配器的PCI配置空间时,将向虚拟化堆栈通知写入请求。它向PF微型端口驱动程序发出OID_SRIOV_WRITE_VF_CONFIG_SPACE的OID方法请求。OID请求中包含的NDIS_SRIOV_WRITE_VF_CONFIG_SPACE_PARAMETERS结构中指定了要写入的数据。
驱动程序将数据写入VF PCI配置空间,并在完成OID请求后返回请求的状态。对NdisMSetBusData的调用完成后,此状态将返回到VF微型端口驱动程序。
VF微型端口驱动程序也可以与PF微型端口驱动程序进行通信。该通信路径通过反向通道接口。有关更多信息,请参见SR-IOV PF / VF反向通道通信。
注意 VF微型端口驱动程序必须知道它正在虚拟环境中运行,以便它可以与PF微型端口驱动程序进行某些操作的通信。有关驱动程序如何执行此操作的更多信息,请参见初始化VF微型端口驱动程序。
编写SR-IOV VF微型端口驱动程序概述
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/writing-sr-iov-vf-miniport-drivers
本节讨论为单根I / O虚拟化(SR-IOV)网络适配器的PCI Express(PCIe)虚拟功能(VF)编写NDIS微型端口驱动程序的要求和准则。
本节包括以下主题:
注意: 有关如何为SR-IOV网络适配器的PCIe物理功能(PF)编写微型端口驱动程序的信息,请参阅《编写SR-IOV PF微型端口驱动程序》。
NIC交换机
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/nic-switches
支持单根I / O虚拟化(SR-IOV)的网络适配器必须实现硬件桥,该硬件桥可在适配器的物理端口和内部虚拟端口(VPort)之间转发网络流量。该网桥称为NIC交换机,如下图所示。
每个NIC交换机包含以下组件:
-
一个外部或物理端口,用于提供与外部物理网络的网络连接。
-
一个内部端口,可为网络适配器上的PCI Express(PCIe)物理功能(PF)提供对外部物理网络的访问。内部端口称为虚拟端口(VPort)。
PF始终具有一个已创建并分配给它的VPort。该VPort被称为默认VPort,并由DEFAULT_VPORT_ID标识符引用。
有关VPort的更多信息,请参见虚拟端口(VPort)。
-
一个或多个VPort,它们在网络适配器上提供PCIe虚拟功能(VF)并可以访问外部物理网络。
注意 可以创建其他VPort,并将其分配给PF以进行网络访问。
注意 从Windows Server 2012中的NDIS 6.30开始,SR-IOV接口仅在网络适配器上支持一个NIC开关。此开关被称为默认NIC开关,并由NDIS_DEFAULT_SWITCH_ID标识符引用。
NIC交换机的硬件资源由SR-IOV网络适配器的PF微型端口驱动程序管理。驱动程序通过以下方法之一创建和配置NIC交换机:
-
基于标准化SR-IOV和NIC开关INF关键字的静态创建。有关这些关键字的更多信息,请参见SR-IOV的标准化INF关键字。
-
基于OID_NIC_SWITCH_CREATE_SWITCH的对象标识符(OID)方法请求的动态创建。NDIS或Hyper-V可扩展交换机模块发出这些OID请求,以在SR-IOV网络适配器上创建NIC交换机。
有关如何创建,配置和管理NIC交换机的更多信息,请参阅《管理NIC交换机》。
管理NIC交换机
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/managing-nic-switches
本节介绍了管理支持单根I / O虚拟化(SR-IOV)的网络适配器的NIC交换机的要求和准则。SR-IOV网络适配器的PCI Express(PCIe)物理功能(PF)的微型端口驱动程序管理适配器上的NIC开关。
本节包括以下主题:
有关SR-IOV网络适配器的NIC交换机的更多信息,请参阅NIC交换机。
注意 只有PF微型端口驱动程序可以配置网络适配器的硬件资源,例如NIC交换机。SR-IOV网络适配器上的PCIe虚拟功能(VF)的微型端口驱动程序无法直接访问适配器的大多数硬件资源。有关更多信息,请参见编写SR-IOV VF微型端口驱动程序。
SR-IOV数据路径
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/sr-iov-data-paths
本节介绍了支持单根I / O虚拟化(SR-IOV)的网络适配器与Hyper-V父分区和子分区之间的可能数据路径。
本节包括以下主题:
相关阅读
《DPDK 20.05 | rte_pci_bus思维导图 | 第一版》
《linux系统下:IO端口,内存,PCI总线 的 读写(I/O)操作》
《Linux PCI驱动框架分析:(Peripheral Component Interconnect,外部设备互联)》