iommu-spec 要点
iommu-spec 要点
术语和硬件结构
Context
状态的硬件表示,用于标识设备和设备分配到的domain.
PCI-E连接在北桥上,北桥内部也有可能集成设备. PCI legacy设备连接在南桥上.
DMA & Interrupt Remapping就发生在北桥中,PCI-E & 南桥与处理器之间.
Overview
VMM支持的4种IO虚拟化model:
- 纯软件模拟,兼容性很好,性能很差
- 类似于virtio,兼容性很差(需要host和guest都有特定的驱动支持),性能有所提升
- 类似于VFIO的透传设备方式,minimal or no VMM involvement,性能最好
- 将IO设备的不同function分配给不同的VM,能提供比物理硬件更多的虚拟IO设备
VT-D为VMM提供了以下硬件支持:
- IO设备透传,支持分离和保护设备
- DMA重映射,即来自设备的DMA访问会经过地址翻译
- 中断post,即将中断传送给特定vcpu
- 稳定性,记录DMA和中断的严重错误,方便恢复系统
该spec中,domain指的Platform抽象的隔离环境,是host 物理内存分配的一个独立区域。
DMA重映射为隔离设备访问memory提供了硬件支持,并且DMA重映射允许每个设备都透传到specific domain,domain和设备之间的联系为独立的,一系列的page_tables.当设备尝试访问system memory时,DMA重映射硬件利用这些page_tables翻译出需要访问的实际物理地址,并确定设备是否有权限访问这部分memory. 频繁使用的页表会在硬件中cache.DMA重映射可以为每个设备单独配置,也可以为一些设备统一配置。
OS对DMA重映射的利用方式
- 保护OS: 操作系统可以定义一个domain,将自己的核心代码和数据结构放进去,限制系统中所有IO设备的访问,这样可以防止错误或无意的设备驱动错误导致系统崩溃,可以提高操作系统的稳定性.
- 支持传统PCI设备访问高端内存: 操作系统可以利用domain更好的管理legacy devices对高端内存(大于4G)的访问,这种管理原理就是利用IO page table将这些设备的DMA映射到高端内存中。如果不使用这种方法,想要legacy devices想要访问高端地址,只能依赖于操作系统提供的“bounce buffer 机制”。
- DMA隔离: 操作系统可以创建多个domain,为每个domain透传一个或多个设备,每个设备驱动将自己的io-buffer显式地注册到OS,OS将这些io-buffer透传到特定的domain,使用硬件强制完成DMA domain的保护。
- 对于支持PCI-E功能的设备,OS可以使用DMA重映射硬件功能与I / O设备共享应用程序进程的虚拟地址空间。 共享的虚拟内存以及对I / O page-fault的支持,使应用程序可以将任意数据结构自由地传递到图形处理器或加速器等设备,而无需进行数据固定和编组的开销。
VMM对DMA重映射的利用方式
如果使用设备直接透传的方式,一方面可以提高虚拟机的IO性能,另一方面,虚拟机中的设备驱动也不需要特地为虚拟IO设备设计,只使用普通设备驱动即可。
设备直接透传相比于纯软件模拟,虚拟机无需在每次IO访问时都exit到VMM处理,而只需要在访问被保护的IO资源时才由VMM接手,被保护的资源类似于: 配置设备时的IO访问,中断管理等。因为被保护的资源会影响系统功能和隔离功能。
为了支持设备直接透传,VMM必须强制使用DMA Request的隔离。IO设备能被透传给domain,重映射硬件能将来自该domain中的IO设备的DMA(access)限制在该domain的memory中。对于可能在分配后变换位置的domain,可以通过配置硬件实现在该情况下的地址翻译。
IO设备透传允许其它IO共享用途。例如,将IO设备透传到为其它用户partition提供IO服务的partition中,重映射硬件使虚拟化软件可以选择正确的透传设备+纯软件模拟的虚拟化解决方案。
DMA 重映射也使能了基于SR-IOV和Scalable IOV的硬件,SR-IOV支持将单设备物理功能配置为能透传到不同partition的多虚拟功能。Scalable IOV功能也类似,一个单功能设备可以被配置为支持多虚拟功能,这些虚拟功能能被透传到不同的partition.
Guest对DMA重映射的利用方式
spec的这部分讲了Remapping Hardware的虚拟化思路,也就是向Guest提供vIOMMU。
VMM可以将重映射硬件虚拟出来给Guest,VMM将Guest对重映射的访问传递给重映射硬件寄存器,VMM管理一份对重映射硬件的访问的数据结构的shadow备份即可。在更新Guest IO page-tables时,Guest软件执行适当的虚拟无效操作,虚拟无效请求可以被VMM拦截,以更新相应的影子页表并执行重新映射硬件的无效(以使重映射硬件执行影子页表配置的重映射需求)。
由于错误DMA操作无法重启,VMM不能使用lazy模式更新shadow 重映射数据结构。为了维持shadow重映射数据结构与Guest重映射数据结构的一致性,VMM需要将虚拟重映射硬件的请求级别提到最高,或者使用处理器内存管理机制对Guest重映射数据结构进行写保护(可以提高该数据结构的同步频率)。
重映射的硬件支持包含2级地址翻译,第一级地址翻译将GVA转换为GPA,第二级地址翻译将GPA转换为HPA,VMM可以对Guest OS对第一级地址翻译的使用进行虚拟化,不使用shadow IO页表,但是通过配置硬件来执行第一级和第二级的地址翻译嵌套操作。
DMA重映射和处理器memory虚拟化的联系
DMA重映射和处理器memory虚拟化都由VMM提供,也就是说,DMA重映射时,被重映射的地址有可能是memory虚拟化之后的地址GPA,也有可能是虚拟化之前的地址HPA,具体由VMM的实现决定。
DMA重映射细节
DMA请求的类型
重映射硬件将来自Root-complex集成设备和来自PCI-E独立设备的输入memory请求分为2类:
-
不带address-space-identifier的请求
这类请求是来自endpoint devices的普通memory请求。这类请求的数据结构中会包含请求类型(read/write/atomic)、目标DMA地址/大小、发起请求的设备source_id(Bus/Device/Function).
-
带address-space-identifier的请求
这类请求是带有额外信息的来自endpoint devices的memory请求,额外信息为目标地址空间标识。这类请求与上面的普通请求不同的是,含有很多额外属性,有:目标进程地址空间标识符(PASID- target process address space identifier),还有可选的属性,如执行请求标志(Exectue-Requested. ER),用来说明此次取的数据用于执行这些数据中的指令;特权模式请求标志(Privileged mode Requested. PR),用来说明此次请求由用户还是超级管理员发起。具体需要看PCI-E spec里的Process Address space ID Capability.
为简单起见,该spec将这些类别称为没有PASID的请求和带有PASID的请求。 使用唯一的PASID标记DMA流请求,可实现I / O设备的可扩展且细粒度的共享,以及具有主机应用程序的虚拟内存的设备的操作。 后面的部分描述带PASID的请求的这些用法。 在2.0版之前的本规范版本仅支持重新映射请求,而无需PASID。
Domains和地址翻译
domain被定义为platform上的一个抽象环境,host物理内存的一个子集被分配到该domain中.允许访问物理memory的IO设备会被分配给一个domain,并且以domain的设备来标识。对于虚拟化应用,软件会将每个vm当做一个domain.
domain的隔离特性是通过禁止domain内的device访问domain外的memory来实现的。多个相互隔离的domain在以下情况支持,即当所有IO设备都被透传到一些domain,domain内的设备只能访问domain内的物理资源。DMA重映射架构使包含任意数量domain的复杂IO透传方案成为可能。每个domain都拥有自己的address space。重映射硬件将接收到的DMA请求的地址看做DMA Address.取决于软件应用模型,一个设备的
DMA地址空间可能是device被透传到的vm的GPA地址空间,可能是host应用中DMA请求时的VA地址空间,可能是vm内的客户端应用的GVA地址空间,被host软件管理的IOVA地址空间,Guest软件管理的GIOVA地址空间。以上这些情况下,DMA重映射将device发起的DMA请求中的地址转换为对应的HPA.
上面的这张图说明了DMA地址翻译的情况。IO设备1和2分别被透传到domain1和domain2,负责创建和管理domain的软件(如qemu)为2个domain分配了物理memory,并且建立起DMA地址翻译功能,由设备1和设备2发起的DMA请求中的地址由重映射硬件翻译成对应的HPA.
可以看到,在domain1和domain2内部的软件使用的VA都是一样的,这个VA由CPU内存管理单元维护,但是2个domain对应的物理地址不同,收到domain内的DMA请求后,重映射硬件会将请求中的地址翻译为Host物理地址。
Host platform可能支持一个或多个重映射硬件单元。每个硬件单元支持重映射在自己的硬件视野中看到的DMA请求地址。例如,一个桌面平台会将一个硬件重映射单元分配给处理器,以翻译所有的DMA传输。具有一个或多个核心组件的服务器平台可以在每个组件中支持独立的硬件转换单元,每个转换模块都在其I / O层次结构(例如PCI Express根端口)中转换DMA请求。该体系结构支持以下配置:根据软件编程,这些硬件单元可以共享相同的转换数据结构(在系统内存中)或使用独立的结构。
重映射硬件在进一步的硬件处理(例如地址解码,侦听处理器缓存和/或转发到内存控制器)之前,将请求中的地址转换为主机物理地址(HPA)。
重映射硬件-软件视野
重映射架构允许硬件实现支持单个PCI段组,以将重映射功能暴露给单个硬件单元覆盖整个CPI段组,或作为多个硬件单元,每个支持互相排斥的PCI段组中的设备子集。例如,一种实现可能将一个硬件单元暴露出来以支持root bus上的单个或多个集成设备,其余硬件单元给一系列的PCI-E root ports上的设备用。BIOS将每个硬件单元报告给软件。对于支持多个PCI段组的的硬件实现,重映射架构需要将独立的重映射硬件单元(一个PCI段组至少一个)暴露出来,以处理每个段组中的请求。
将设备映射到domain
出现在地址转换硬件上的每个inbound请求都需要标识发起该请求的设备。标识IO事务的发起者的属性在本文档中称为“source-id”。重映射硬件可以以implementation-specific的方式确定事务的源ID。例如,某些IO总线协议可以提供原始设备身份作为每个IO事务的一部分。在其他情况下(例如,对于Root-Complex集成设备),可以基于Root-Complex内部实现中继承source-id。
对于PCI Express设备,source-id是PCI Express事务层header中的请求者标识符。设备的请求者标识符由其PCI Bus/Device/Function编号组成,由配置软件分配,并唯一标识发起请求的硬件功能。图3-6说明了PCI Express规范中定义的Requester-id。
重映射数据结构
重映射硬件有2种地址翻译模式,legacy和scalable模式,两种模式的区别在于,scalable模式会将不带PASID的请求转换为带PASID的请求,而legacy模式没有该功能,其余功能差不多,均是利用多级table思想,进行地址翻译。
- Legacy Mode
下图显示了legacy模式下的多级Table思想。
Root Table的功能就是将设备映射到对应domain。Root Table的地址可以从 Root Table Address Register (RTADDR_REG)中读取,Root Table含有256个entry,因为PCI bus number space是0-255,Root Table中的每个entry都指向对应的Context Table,后者代表的是该bus上的所有device,Context Table一共256个entry,而每个PCI device最多有8个function,一条PCI bus上最多有32个device,所以256个entry正好可以实现device[i]_function[j]的全映射,Context Table中的每个entry都将一个device 映射到对应的domain,source_id中的device和function_number就是用来在Context Table中找到对应entry的。可以通过编辑device对应的Context Table中的entry,使多个device映射进一个domain.
- Scalable Mode
Scalable模式下的多级table与legacy模式类似,用Root Table来index PCI总线,但是Context Table分为lower和upper context table,分别用于index某PCI总线上的0-15号设备和16-31号设备,每个context table的entry指向Scalable mode下的PASID Directory,PASID Directory中的entry中包含指向一级页表和二级页表的指针。一二级页表用于翻译DMA地址。