PCIe协议学习-浅谈SR-IOV
转载(13 封私信 / 81 条消息) PCIe协议学习-浅谈SR-IOV - 知乎1背景和概述SR-IOV全称叫single root I/O virtualization and sharing顾名思义这是一种虚拟化技术目的是让多个终端或者叫做system imageSI共享PCI设备资源提高硬件资源得利用率。一般的虚拟化系统架构如下图所示多个SI可以共享某个PCI设备virtualization intermediaryVI负责管理其下面的硬件资源同时只把每一个SI自己可以访问的资源呈现给他们因此可以说每个SI看到的系统system是一个“虚拟化”的系统。这个架构的问题就是所有的IO命令和数据都需要VI处理分发当多个SI都和PCIe设备有大量IO交互时要保持系统性能对VI的硬件性能要求会非常高即所谓的“significant platform resource overhead”。SR-IOV的引入就是为了减少这种resource overheads具体方法其实也就是在不增加太多resource overheads的前提下尽量卸载VI的数据流处理功能包括DMAmemory space accessinterrupt process等另外就是SR-IOV可以兼容其他的IO virtualization technologies比如address translation serviceATS等这里不做展开SR-IOV的系统架构一般如下图所示。这个系统增加了以下这些功能模块1SR-PCIMsingle root PCI manager负责SR-IOV相关配置管理physical functionsPF和virtual functionsVF同时处理相关的error events和设备的一些功能管理如power management和hot-plug service等。2TAoptional translation agent负责做上下游的PCIe transaction的地址转译TA可能还会包含一个address translation cacheATC作为查表缓存来加快转译速度。3ATPToptional address translation and protection tableTA通过查询ATPT完成PCIe transaction的地址转译。4ATCoptional address transaction cache前面提到ATC可能在TA中同时设备中也可以有一个ATC模块这主要时考虑兼容ATS已经完成地址转译的PCIe function可以bypass 系统中的ATC以提高性能。5PFphysical function就是支持SR-IOV特性的PCIe function同时可以被SR-PCIMVI和SI等访问。6VFvirtual function一个可以被SI直接访问的轻量级Light-weight的PCIe function可以认为的PF的子集也是SI进行数据操作的最终容器或者说对象但是SI无法配置VF。一个VF可以先被分配给一个SI然后reset并被分配给两一个SI但任一时刻只能有一个SI具有访问权限一个VF也可以先分配给一个PF再分配给另一个PF。2ARI在进一步讨论SR-IOV前先介绍ARI一般的routing IDrequester ID和completer ID都是8bit bus number5 bit device number3-bit funciton number组成在ARI模式下device number 不再使用由8-bit bus number 8bit funciton number组成因此ARI设备可以支持到256个functions不考虑AR-IOV。软件在枚举时如果发现一个设备支持ARI存在ARI capability register寄存器则需要使能和ARI设备对接的downstream port中的ARI forwarding enable bit in the device control2 register。使能之后这个DP可以正常将type1 configuration rquest转换成type0 configuration request原先的type1到type0的转换要求device number域段为0。ARI extended capabilityARI capability registeroffset 04h如果设备支持MFVC function groupsmulti-function virtual channel function groupsbit 0不同的function可以分配到不同的function group最大8个function groupsDevice将基于function groups进行调度每个function group内的进一步调度方式时implementation specific的。ARI Control registeroffset 06h3PCIe设备中的PF和VF日常工作中我们接触EP或者说PCIe设备比较多所以本文也会重点讨论一下PCIe设备相关的SR-IOV功能一个支持SR-IOV的PCIe设备多个PF每个PF还包含0个或者多个VF如下图所示几点说明如下1每个PF可以有0个VF多个PFs之间的VFs数量可以不同2ARIAliternative routing indentifierextended capability寄存器定义了设备funciton group的配置比如arbitration和下一个funciton的寄存器offset等。3支持ARI的设备最多支持256个PFs不同的function number需要在256范围内但是不需要连续分配。4一个SR-IOV设备可以占用多个bus number每一个VF都可以关联一个在设备bus number range内的bus number。5每个设备都必须有function0funciton0可以是一个PF支持SR-IOV可以包含多个VFs不同function的arb的问题这里不展开讨论下面主要讲一下设备AR-IOV的配置和使用。4PCIe设备SR-IOV配置SR-IOV extended capability每一个支持AR-IOV的PF都需要一个SR-IOV extended capability寄存器。SR-IOV capability register如下图所示SR-IOV control register如下图所示SR-IOV Control Registeroffset 08h的bit 0表示VF Enable如果clear了bit 0这个PF的所有VFs都会被disabled。Bit 1表示VF Migration Enable表示是否支持VF migration。Bit 3是VF MSEmemory space enable表示能否访问该PF下VFs的memory space。Bit 4用于指示上游设备是否enable了ARI。SR-IOV status register如下图所示pcie gen6 好像已经不再使用。回到SR-IOV capability register 中继续来看TotalVFs表明这个PF可以支持的最大VFs数量InitialVFs表明这个PF初始的VFs数量NumVFs表示这个PF当前enabled的VFs的数量function dependency link表示不同PF之间是否有依赖如果没有这个寄存器需要由软件填成PF自身的fucntion number如果PF之间有一个dependency list且PFa为其中一个则PFa的fucntion dependency link的值应该为dependency list中下一个PF比如PFbdependency list中最后一个PF的值为list中的第一个PF。dependency对PCIe配置有如下约束1同一个dependency list中的PFinitialVFs和TotalVFs的值必须相等2软件需要给同一个dependency list中的PF配置相同的NumberVFs和VF enable3同一个dependency list中的PF必须分配给相同的SIsVFs也必须要分配给相同的SIsFirst VF offsetoffset 14hPF的第一个VF routing ID offsetVF Strideoffset 16h表示该PF中不同VFs之间的routing ID offsetVF device ID offset 1Ah表示每个VF呈现给的device IDsupported page sizesoffset 1ch表示该PF可以支持的page size4KB*2n if bit n is set协议要求PFs至少要支持4/8/64/256/KB1MB和4MB page size。system page sizeoffset 20h表示系统最终使用的page size。VF BAR0-VF BAR5VFs 的base address register用法和一般的PCI BARs一样系统软件先写全1然后读回来确定每个BAR空间大小最后系统软件可以给每个BAR分配基地址所有BAR的空间大小加起来就是这个PF中VFs的空间大小所有VF大小是相同的第一个有效的VF BAR中的地址就是这个PF的第一个VF的基地址其他VFs的基地址需要基于第一个VF的基地址的每个VF的空间大小换算根据First VF Offset和VF Stride可以确定每个VF的routing IDRID所有的VFs和PFs都有distinct routing IDs假设设备对应的bus number是N那么最终的routing ID是256*N RID。