虚拟化--IO虚拟化基本原理
本文话题:
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/ 转载请注明出处
虚拟化--IO虚拟化基本原理的更多相关文章
- [原] KVM 虚拟化原理探究(6)— 块设备IO虚拟化
KVM 虚拟化原理探究(6)- 块设备IO虚拟化 标签(空格分隔): KVM [toc] 块设备IO虚拟化简介 上一篇文章讲到了网络IO虚拟化,作为另外一个重要的虚拟化资源,块设备IO的虚拟化也是同样 ...
- [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化
KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...
- 四种主要网络IO虚拟化模型
本文主要为大家简要介绍VMware.Redhat.Citrix.Microsoft主要虚拟化厂商使用的4种主要的虚拟化IO模型 (emulation.para-virtualization.pass- ...
- 基于SR-IOV的IO虚拟化技术
服务器配置要求 x86服务器内存不能低于32GB 服务器CPU需要支持虚拟化和设备虚拟化 VT-x VT-d,SR-IOV 功能,并且在BIOS中能启用了SR-IOV 网卡配置最起码为千兆配置 支持 ...
- CPU、内存、IO虚拟化关键技术及其优化探索
https://yq.aliyun.com/articles/71295?spm=5176.8091938.0.0.3LQ7NM
- CentOS 7下KVM支持虚拟化/嵌套虚拟化配置
开启虚拟化: cat << EOF > /etc/modprobe.d/kvm-nested.conf options kvm-intel nested=1 options kvm- ...
- KVM上如何让虚拟机支持虚拟化(kvm虚拟化的嵌套)
http://blog.csdn.net/swimming_in_it_/article/details/53320141http://blog.csdn.net/wickedglory/articl ...
- dpdk对虚拟化的支持调研
目录: 虚拟化 dpdk的实现研究 virtio vhost SR-IOV 热迁移相关 研究拓展 本文记录近期对dpdk在虚拟化和云计算领域应用的研究成果,内容梳理如下. 虚拟化 虚拟化,抽象来说,就 ...
- 网络IO的虚拟化模型小结
网络IO的虚拟化模型随着技术发展,出现了多种方式,例如emulation.para-virtualization.pass-through和SR-IOV等,本文试图对其做一个简单的总结. Emulat ...
随机推荐
- HTTP/TCP
转:http://blog.csdn.net/sundacheng1989/article/details/28239711 http://blog.csdn.net/sundacheng1989/a ...
- Dynamics AX 2012 R2 无法创建类"Excel.Application"的COM对象
Reinhard在做一个Excel导入项目时,发现X++代码一旦执行到Excel组件部分,就会报如下错误: 无法创建类"Excel.Application"的COM对象.请 ...
- Linux:-防火墙iptables如何个性化定制?
身份标签/usr/local/etc/identity,主脚本iptables.sh,附属目录functions/iptables.d ├── iptables.sh ├── functions│ ...
- 反射 __import__
__import__ 根据字符串导入模块 def run(): inp = input('请输入URL:') m,p = inp.split('/') obj = __import__(m) if h ...
- Ajax开发中服务端Response的Content-Type
转自http://www.cnblogs.com/hyl8218/archive/2010/03/10/1681484.html ajax开发中在请求服务器端的响应时, 对于每一种返回类型 规范的做法 ...
- CSS零基础学习笔记.
酸菜记 之 CSS的零基础. 这篇是我自己从零基础学习CSS的笔记加理解总结归纳的,如有不对的地方,请留言指教, 学前了解: CSS中字母是不分大小写的; CSS文件可以使用在各种程序文件中(如:PH ...
- 市面上主流服务器简单介绍(apache、IIS、tomcat..)
apache:apache(阿帕奇)的具体介绍可以参看apache的网站(http://www.apache.org/),或者在网上随便搜搜吧.apache是世界使用排名第一的web服务器软件:它可以 ...
- ListView的基础入门
1.先在XML中定义一个ListView视图 2.获得ListView,在Mainactivity中声明 3.创建一个类继承适配器BaseAdapter,实现四个方法 public class MyL ...
- IOS监听屏幕状态
一.定义两个宏 //锁屏通知 #define NotificationOff CFSTR("com.apple.springboard.lockcomplete") //解 ...
- 1、启动oracle的步骤
1.启动oracle的步骤 Linux下启动oracle分为以下两步: 1.1.启动lsnrctl监听. 1.2.启动数据库实例. 2.启动oracle监听 首先登陆服务器,切换到oracle用户. ...