本文话题:
IO虚拟化概述
设备发现 访问截获 设备模拟 设备共享
基于软件的IO虚拟化
基于前端后端的IO虚拟化
基于硬件的IO虚拟化
概述
从处理器的角度看,外设是通过一组I/O资源(端口I/O或者是MMIO)来进行访问的,所以设备的相关虚拟化被称为I/O虚拟化。其思想就是
VMM截获客户操作系统对设备的访问请求,然后通过软件的方式来模拟真实设备的效果。基于设备类型的多样化,I/O虚拟化的方式和特点纷繁复杂。
一个完整的系统虚拟化方案在I/O虚拟化方面需要处理以下几块
虚拟芯片组
虚拟PCI总线布局,主要是通过虚拟化PCI配置空间,为客户机操作系统呈现虚拟的或是直接分配使用的设备。
虚拟系统设备,例如PIC、IO-APIC、PIT和RTC等。
虚拟基本的输入输出设备,例如显卡、网卡和硬盘等。
I/O虚拟化主要包含以下几个方面的虚拟化
I/O端口寄存器
MMIO寄存器
中断
IO虚拟化
下面具体的描述IO虚拟化需要做的工作
设备发现
设备发现就是要让VMM提供一种方式,来让客户机操作系统发现虚拟设备,这样客户机操作系统才能加载相关的驱动程序,这是IO虚拟化的第一步。设备发现取决于被虚拟的设备类型。
模拟一个所处物理总线的设备,这其中包含如下两种类型。
1)模拟一个所处总线类型是不可枚举的物理设备,而且该设备本身所属的资源是硬编码固定下来的。比如ISA设备、PS/2键盘、鼠标、RTC及传统
IDE控制器。对于这类设备,驱动程序会通过设备特定的方式来检测设备是否存在,例如读取特定端口的状态信息。对于这类设备的发现,VMM在给定端口进行
正确的模拟就可以了,即截获客户机对该端口的访问,模拟出结果交给客户机。
2)模拟一个所处总线类型是可枚举的物理设备,而且相关设备资源是软件可配置的,比如PCI设备。由于PCI总线是通过PCI配置空间定义一套完备
的设备发现方式,并且运行系统软件通过PCI配置空间的一些字段对给定PCI设备进行资源的配置,例如允许或禁止I/O端口和MMIO,设置I/O和
MMIO的起始地址等。所以VMM仅模拟自身的逻辑是不够的,必须进一步模拟PCI总线的行为,包括拓扑关系和设备特定的配置空间内容,以便让客户机操作
系统发现这类虚拟设备。
模拟一个完全虚拟的设备
这种情况下,没有一个现实中的规范与之对应,这种虚拟设备所处的总线类型完全由VMM自行决定,VMM可以选择将虚拟设备挂在PCI总线上,也可以完全自定义一套新的虚拟总线协议,这样的话客户机操作系统必须加装新的总线驱动。
访问截获
虚拟设备被客户机操作系统发现后,客户机操作系统中的驱动会按照接口定义访问这个虚拟设备。此时VMM必须截获驱动对虚拟设备的访问,并进行模拟。
非直接分配给客户机操作系统的设备
对于端口I/O,IO指令本身是特权指令,处于低特权的客户机访问端口I/O会抛出异常,从而陷入到VMM中,交给设备模拟器进行模拟。
对于MMIO,VMM把映射到该MMIO的页表设为无效,客户机访问MMIO时会抛出缺页异常,从而陷入到VMM中,交给设备模拟器进行模拟。
对于中断,VMM需要提供一种机制,供设备模拟器在 接收到物理中断并需要触发中断时,可以通知到虚拟中断逻辑,然后由虚拟中断逻辑模拟一个虚拟中断的注入。
直接分配给客户机操作系统的设备
对于端口I/O,可以直接让客户机访问。
对于MMIO,也可以直接让客户机进行映射访问。
对于中断,VMM物理中断处理函数接收到物理中断后,辨认出中断源属于哪个客户机,直接通知该客户机的虚拟中断逻辑。
设备模拟
上一步中我们已经多次提到,下面分类介绍下设备模拟。
基于软件的全虚拟化
虚拟设备与现实设备具有完全一样的接口定义。这种情况下,VMM的设备模拟器需要仔细研究现实设备的接口定义和内部设计规范,然后以软件的方式模拟
真实逻辑电路来满足每个接口的定义和效果。现实设备具有哪些资源,设备模拟器就需要呈现出同样的资源。这种情况下,客户机操作系统原有的驱动程序无需修改
就能驱动虚拟设备。设备访问过程中,VMM通过截获驱动程序对设备的访问进行模拟。
举例:qemu VMware Workstation
半虚拟化
给客户机操作系统提供一个特定的驱动程序(称为前端),VMM中的模拟程序称为后端,前端将请求通过VMM提供的通信机制直接发送给后端,后端处理
完请求后再发回通知给前者。与传统设备驱动程序流程(前一种方式)比较,传统设备程序为了完成一次操作要涉及到多个寄存器的操作,使得VMM要截获每个寄
存器访问并进行相应的模拟,就会导致多次上下文切换。这种方式能很大程度的减少上下文切换的频率,提供更大的优化空间。
举例:xen virtio (virtio接下来我会继续研究,主要包括virtio框架、virtio前端驱动、后端实现方式及原理、前端后端共享内存的方式)
基于硬件的直接分配(实际上已经不是设备模拟了)
直接将物理设备分配给客户机操作系统,由客户机操作系统直接访问目标设备。这种情况下实际上不存在设备模拟,客户机直接通过原有的驱动操作真实硬件。这种方式从性能上说是最优的,但这种方式需要比较多的硬件资源。
基于硬件的直接分配还有一种方式,硬件本身支持虚拟化,本身可以向不同的虚拟机提供独立的硬件支持,设备本身支持多个虚拟机同时访问。比如SR-IOV。(这种方式接下来我会继续研究)
举例:intel vt-d SR-IOV
一个VMM中,常常是多种虚拟化方式并存。
不同的IO虚拟化方式对比
设备共享
设备虚拟化中,有些设备可以被软件模拟器完全用软件的方式模拟而不用接触实际物理设备,比如CMOS,而有些设备需要设备模拟进一步请求物理硬件的帮助。一般输入输出类设备,如鼠标、键盘、显卡、硬盘、网卡。这些设备都涉及到从真实设备上获取输入或者输出到真实设备上。
对于多个客户机,每个客户机拥有自己的设备模拟器,多个设备模拟器需要共享同一个物理设备,这种情况下,VMM中的真实设备的驱动程序需要同时接收并处理多个客户或进程的请求,达到物理资源的复用。
点击下面的链接可以进入我自己搭建的博客,查看更多关于虚拟化的文章。
原文链接:http://itblogs.ga/blog/20150111003133/ 转载请注明出处