XHCI 1.2b 规范摘要(15)
系列文章目录
XHCI 1.2b 规范摘要(一)
XHCI 1.2b 规范摘要(二)
XHCI 1.2b 规范摘要(三)
XHCI 1.2b 规范摘要(四)
XHCI 1.2b 规范摘要(五)
XHCI 1.2b 规范摘要(六)
XHCI 1.2b 规范摘要(七)
XHCI 1.2b 规范摘要(八)
XHCI 1.2b 规范摘要(九)
XHCI 1.2b 规范摘要(十)
XHCI 1.2b 规范摘要(11)
XHCI 1.2b 规范摘要(12)
XHCI 1.2b 规范摘要(13)
XHCI 1.2b 规范摘要(14)
XHCI 1.2b 规范摘要(15)
文章目录
- 系列文章目录
- 8 虚拟化(Virtualization)
- 8.1 操作(Operation)
- 8.1.1 资源分配(Resource Assignment)
- 8.1.1.1 MMIO 空间(MMIO Space)
8 虚拟化(Virtualization)
虚拟化允许在一个平台内同时运行多个操作系统实例 (OSI,Operating System Instances)。xHC 向主机系统提供的默认接口(即禁用虚拟化)是单个物理功能(PF 或 PF0,Physical Function)或可扩展主机控制器接口(eXtensible Host Controller Interface,例如,图 3-3)。打开 xHC 虚拟化功能后,将启用多个虚拟功能 (VF,Virtual Functions)。为了最大限度地降低硬件要求,xHC VF 提供的物理接口是 PF 提供的物理接口的子集,虚拟化软件应模拟 VF 接口的某些部分以填补空白。
虚拟化允许多个操作系统实例 (OSI) 在一个平台内同时运行。xHC 向主机系统提供的默认接口(即虚拟化已禁用)是单个物理功能 (PF 或 PF0) 或可扩展主机控制器接口(例如,图 3-3)。当 xHC 虚拟化功能打开时,将启用多个虚拟功能 (VF)。为了最大限度地减少硬件要求,xHC VF 提供的物理接口是 PF 提供的接口的子集,虚拟化软件应模拟 VF 接口的某些部分以填补空白。
只有 PF 应提供 xHC 虚拟化功能,即 SR-IOV 和 xHCI-IOV 功能结构。所有 VF 都显示为不具备虚拟化功能的 xHC 实例。
请注意,本文档中讨论的 xHC 虚拟化功能在很大程度上依赖于 PCIe SR-IOV (Single Root – I/O Virtualization,单根 - I/O 虚拟化) 规范中定义的虚拟化概念和机制。
此规范假设虚拟机架构支持三类主要软件:
- 虚拟机管理器 (VMM,Virtual Machine Manager):VMM 充当主机,完全控制处理器和其他平台硬件。VMM 向客户软件(请参阅下面的虚拟机 (VM) 描述)提供虚拟处理器的抽象,并允许其直接在逻辑处理器上执行。虚拟化环境中只有一个 VMM 实例,它可以保留对平台资源的选择性控制:处理器资源、物理内存、中断管理、I/O 等。VMM 可能拥有物理资源并提供服务以在多个 VM 之间共享该资源。或者,它可以直接将物理资源专门分配给 VM。
- 虚拟机 (VM,Virtual Machine):每个虚拟机 (VM) 都是一个客户软件环境,支持由操作系统 (OS) 和应用软件组成的堆栈。每个 VM 独立于其他 VM 运行,并使用物理平台提供的相同接口来处理处理器、内存、存储、图形和 I/O。VM 软件堆栈(或 OSI)可能表现得像在没有 VMM 的平台上运行一样。在 VM 中执行的软件应以较低的权限运行,以便 VMM 可以保留对平台资源的控制。
- 虚拟机管理程序(Hypervisor):虚拟机管理程序是一种传输机制,它为虚拟机和 VMM 之间提供通信路径。虚拟机管理程序的功能使其能够捕获虚拟机对平台资源的请求并将这些请求转发给 VMM 。
一些虚拟化环境将 VMM 和 Hypervisor 功能合并为一个实体。
为了降低硬件要求,xHC 架构依赖 VMM 来模拟 PCI 配置空间、xHCI 功能(xHCI Capability)和操作寄存器(Operational Registers)以及虚拟功能 (VF,Virtual Function) 的其他几个功能。
为了最大限度地减少与 VF 相关的硬件要求,xHCI 架构将其寄存器划分为 “低接触(low touch)” 和 “高接触(high touch)” 。低接触寄存器很少被引用,即仅在初始化时或枚举 USB 设备时引用。高接触寄存器在 xHC 的正常运行期间定期被引用。
VMM 可以捕获和模拟低接触寄存器,因为 VMM 干预对性能的影响很小。xHCI 功能寄存器和操作寄存器是低接触寄存器。功能寄存器通常仅在初始化时被引用,而操作寄存器在运行时很少被引用,即在初始化期间或连接或断开 USB 设备时引用。
高接触寄存器是 Interrupt(中断)和 Event Ring(事件环)管理寄存器以及 Doorbell(门铃)寄存器。 Interrupt 和 Event Ring 寄存器位于 Runtime Register Space (运行时寄存器空间)中。Runtime (运行时)和 Doorbell (门铃)寄存器由 xHC 物理呈现给每个 VF 。
xHCI 的设计使得 xHC 硬件和 VMM 硬件模拟组合呈现给 VM 的接口可能与 VM 通过 PF 看到的接口(如果 VM 独占 xHC)无法区分。这是通过 VMM 模拟功能和操作寄存器以及 xHC 硬件支持过滤 VF 对物理门铃和运行时寄存器集的访问来实现的。结果允许 VMM 处理与设备枚举和其他非时间关键 xHCI 操作相关的 xHCI 寄存器的模拟,并允许 xHC 向 VM 呈现硬件寄存器以进行时间关键的 USB 设备控制和数据传输管理。
xHCI 在 MMIO 空间中为运行时和门铃寄存器定义了独立的基地址,以便将它们定位在页面边界上,从而轻松映射到 VM。
此外,xHCI 还支持 VMM 将 USB 设备模拟到 VM 的能力。在单个 USB 设备的资源需要在多个 VM 之间共享的情况下,VMM 可以拥有物理设备并将该设备的操作模拟到多个 VM。例如,VMM 将拥有分配给 USB 键盘的设备插槽,并为每个 VM 创建该键盘的模拟版本。VMM 将管理将按键流切换到当前具有用户焦点的 VM。xHCI 的 USB 设备模拟支持还允许 VMM 将外部 USB 集线器模拟到 VM,其重要性将在下文讨论。
8.1 操作(Operation)
为了使 VMM 向 VM 提供 xHCI 功能,它应在 VM 的地址空间中显示 xHC VF。要启用 xHC 虚拟化功能,VMM 应执行以下基本步骤:
- 通过启用和配置 PCIe SR-IOV (Single Root – IO Virtualization,单根 - IO 虚拟化) 功能创建 VF。
- 通过启用和配置 xHCI-IOV (xHCI – IO Virtualization,xHCI - IO 虚拟化) 功能将 xHC 资源分配给 VF(中断器和设备插槽,Interrupters and Device Slots)。
- 在虚拟机地址空间中为 VF 分配 PCI 配置空间和 MMIO (Memory Mapped I/O,内存映射 I/O) 空间。
- 为虚拟机对模拟 VF 寄存器的引用建立虚拟机管理程序陷阱。
这些步骤允许结合使用 xHC 硬件和 VMM 寄存器级模拟,向虚拟机呈现功能齐全的 xHC,而无需硬件支持 VF 的每个功能。 它们还允许 VMM 充当中介,管理许多虚拟机之间的共享 xHC 资源。
8.1.1 资源分配(Resource Assignment)
为了最小化 VMM 开销,Device Slots(设备槽) 和 Interrupters(中断器) 可以 “直接分配” 给 Virtual Functions (虚拟功能)。VMM 应始终拥有 PF0。并且只有 PF0 应提供 SR-IOV 和 xHCI-IOV 扩展功能结构。
8.1.1.1 MMIO 空间(MMIO Space)
PCI 配置空间 BAR0 和 BAR1 字段包含指向 xHC PF0 MMIO 空间基址的 64 位地址。此指针将被称为 PBAR0。
SR-IOV VF Enable 字段应设置为 “1”,以启用 xHC 虚拟化支持。
SR-IOV TotalVFs 字段标识可与 PF 关联的 VF 的最大数量。
SR-IOV NumVFs 字段标识在 NumVFs 都设置为有效值且 VF Enable 设置为 “1” 后,MMIO 空间中可见的 VF 数量。NumVFs 的有效值为 1 到 TotalVFs,SR-IOV VF BAR0 和 VF BAR1 字段包含指向 xHC VF MMIO 空间基址的 64 位地址。此指针将被称为 VFBAR0。这些字段的行为与 PCI 规范第 6.2.5 节中描述的普通 PCI BAR 相同。它们的大小可以通过写入所有 1 并读回 BAR 的内容(如 PCI 规范中所述)来调整,并符合定义 BAR 类型字段的低位。VFBAR0 解码的大小称为 VFBAR0.Size。VFBAR0 解码的地址空间数量应为 SR-IOV System Page Size(系统页面大小)字段的整数倍。VFBAR0 确定单个 VF 的对齐要求和大小(VFBAR0.Size)。xHC 占用的总 MMIO 空间为 V F B A R 0. S i z e ∗ N u m V F s VFBAR0.Size * NumVFs VFBAR0.Size∗NumVFs。与每个 VF 关联的 MMIO 空间从页面边界开始,如 SR-IOV 扩展功能结构的系统页面大小字段所定义。
也就是说,如果 VFBAR0.size = 16 KB 且 NumVFs = 4,那么分配给所有 VF 的 MMIO 空间为 64 KB(16K * 4)字节。
PF0 MMIO 寄存器位置:
- 功能寄存器位于 PBAR0。
- 操作寄存器位于 PBAR0 + CAPLENGTH。
- 运行时寄存器位于 PBAR0 + RTSOFF。
- 门铃寄存器阵列位于 PBAR0 + DBOFF。VFn MMIO 寄存器位置,其中 n = 1 到 NumVFs:
- 功能寄存器位于 VFBAR0 + (VFBAR0.Size * (n-1))。
- 操作寄存器位于 VFBAR0 + (VFBAR0.Size * (n-1)) + CAPLENGTH。
- 运行时寄存器位于 VFBAR0 + (VFBAR0.Size * (n-1)) + RTSOFF。
- 门铃寄存器阵列位于 VFBAR0 + (VFBAR0.Size * (n-1)) + DBOFF。
图 8-1 展示了支持两个 VF 的 xHC 实现。请注意,分配给 VF 的 MMIO 地址空间是一个连续的数组。每个 VFBAR0.Size 空间也可以称为“孔径”。
注意:SR-IOV VF MSE 字段应设置为 “1” ,以便 xHC 响应 VF MMIO 内存空间访问。
☆