I/O虚拟化

目标

  • 性能: 接近于无虚拟化环境的性能
  • 通用性: 对客户机os越透明,设备驱动的支持情况

软件完全虚拟化–设备模型

在软件完全虚拟化中,虚拟机中检测和驱动的设备一般不是直接对应于硬件设备,而是VMM抽象出来的虚拟设备
然后客户机os发现和驱动这个虚拟设备,驱动发出的请求被VMM拦截后,VMM会模拟真实设备的响应返回给客户机os

设备模型
在宿主机模型的可能实现是,VMM是宿主机内核模块,设备模型是一个用户态进程,VMM拦截客户机IO,然后通过内核态-用户态接口发给设备模型处理。
在Hypervisor模型中,设备模型是位于虚拟机设备驱动与实际设备驱动之间的模块。 设备模型把客户机IO转换为物理IO设备的请求

设备模型的软件接口

硬件辅助虚拟化–Intel VT-d

问题

  • 如何让客户机直接访问到设备真实的IO地址空间(IO端口或者MMIO): Intel VT-x已经解决这个问题,允许客户机直接访问物理的IO空间(EPT)
  • 如何让设备的DMA操作直接访问到客户机的内存空间: Intel VT-d提供的DMA重映射技术

Intel VT-d原理

VT-d通过在北桥引入DMA重映射硬件,提供设备重映射和设备直接分配的功能。
在启用VT-d的平台上,设备所有的DMA传输都会被DMA重映射硬件截获。 根据设备对应的I/O也表,硬件可以对DMA中的地址进行转换。

找到PCI设备对应IO页表的地址

VT-d架构

  • 通过PCI的BDF可以索引到任何一条总线上的任何一个设备
  • VT-d用根条目来描述PCI总线,每条总线对应一个根条目,由于PCI架构支持256条总线,因此根条目表有256个根条目
  • 根条目的结构
    VT-d根条目
    P: 存在位,为0表示无效,该总线所有DMA传输被屏蔽
    CTP: 指向上下文条目表

  • 上下文条目表: 一条PCI总线可以有256个设备,因此上下文表有256项
    VT-d上下文条目
    P: 存在位,为0表示该设备所有DMA传输被屏蔽
    T: 0, 表示多级页表
    ASR(Address Space Root): 指向IO页表
    DID(Domain ID): 可以认为是客户机ID,唯一标识客户机

VT-d IO页表

VT-d的IO页表与内存页表类似,也支持几种粒度的页面大小,
同时也有硬件IOTLB和上下文条目表的缓存, 并支持三种粒度的刷新操作: 全局刷新,客户机粒度刷新,局部刷新
通过IO页表中GPA到HPA的映射,DMA重映射硬件可以将DMA传输中的GPA转换成HPA,从而使设备直接访问客户机的内存区域