谈虚拟环境中设备访问的实现方法(中)

原创 2007年09月13日 16:37:00

谈虚拟环境中设备访问的实现方法(中)

康华 :主要从事 Linux 操作系统内核、虚拟机、Linux 技术标准、计算机安全、软件测试等领域的研究与开发工作,曾就职 MII-HP 软件实验室 、瞬联软件公司/MOTOROLA,现就职于Lenovo研究院 。其所合写的Linux专栏见http://www.csdn.net/subject/linux/。 如果需要可以联系通过 kanghua151@msn.com (MSN)联系我. 

摘要 上期我们对虚拟机中各种设备访问方式进行介绍与分析归纳。在继续具体介绍虚拟机种光驱刻录实现之前,先占用一些篇幅介绍一下设备虚拟化中的一个关键问题:I/O截获。

什么是I/O截获?

VMM截获I/O操作是指:guest 系统发送的I/O访问请求被VMM拦截,而不是像native环境下那样被直接写入到物理设备中。原因是显而易见的,因为不能让guest系统直接修改硬件状态,否则有可能会造成系统故障(轻则影响其他guest运行,重则会让整个系统宕机)。所以VMM会将截获的I/O指令进行分析后模拟执行,也就是将“伪造”的数据返回给Guest系统。

       目前所有虚拟机软件的I/O虚拟化原理都如上所说,过程大同小异。不过具体的截获方式又有所差别。这里就几种典型的I/O截获方式进行介绍和分析。

 

1ISA层的虚拟化技术中的I/O截获方法

      ISA层的虚拟化技术是指采用软件模拟指令集的方式进行指令虚拟。具体的实现方式是截获客户操作系统发出的指令,并把它们翻译Host平台上的可用指令进行执行,其中所说的指令既包括处理器内部指令,也包含IO指令。因此I/O的截获和其他处理器指令截获方式一样,都是在虚拟机模拟CPU取指令过程中被发现并被进而模拟处理的。这种虚拟机的代表是BochsQEMU,都是运行在用户空间的进程虚拟机。

 

2 .  硬件抽象层的虚拟化技术的I/O截获方法

硬件抽象层的虚拟化技术是指在guest host系统ISA相同的情况下,尽可能避免翻译和模拟guest指令,而是让其直接运行;仅仅在guest系统执行特权指令(修改系统资源或执行结果受资源状态决定)时,虚拟机才会截获并接管处理,以免系统发生异常或冲突。

虚拟机为了能截获特权指令,要求执行于高特权级别,属于内核程序。这样每由用户态运行的guest系统产生trap时,就能被VMM捕获到。而I/O指令(x86 in/out等)属于典型的特权指令,在用户空间使用将产生trap

如果出现特权指令在特权级不够的情况下执行,并不能方便地产生trap的情况。对这一问题的解决方案有3种:一种是指令扫描结合动态指令修改的软件技术,有许多商业的虚拟化产品采用了这种方案。此种虚拟化技术的代表产品是VMware;另一种是对guest 系统进行修改,使得修改资源时能产生必要的trap,以便能被VMM截获。代表软件是xen(其中的modify方式)。最后一种方案是修改x86 CPU,使它支持虚拟化(即让所有敏感特权指令都能产生trap),也就是IntelVanderpool技术和AMDPacifica技术的目标,具体代表是KVM 和Xen (unmodify方式)。 

I/O截获后如何模拟?

       I/O请求或读或写在被VMM截获后都需要模拟执行。模拟即可以在VMM内部完成,也可以在host中完成。VMM内部完成的好处是速度快,缺点是需要在VMM中实现模拟设备,工作量大;且使得VMM变的臃肿,降低了VMM的可靠性。在host中完成虽然需要将I/O请求从VMM转发到host中的设备模拟进程,增加了上下文切换和调度时间。但是优点更突出:1 可以利用已存在的设备模拟代码(如qemu);2于宿主性设备模拟可以借助host系统的设备驱动。3 保持了VMM尽量精简。鉴于以上原因多数虚拟化软件都采用将设备模拟纺在host中进行。

最后,为了让大家能更清楚认识I/O虚拟化过程。我举Xen中完成I/O虚拟化的过程进行说明:

首先guest 系统执行I/O请求命令(如out xxx; 由于guest处于用户空间,I/O访问会引发trap,这时处于特权级运行的VMM会将捕获该trap, 然后VMM可能在自己内部模拟执行该I/O请求(如对中断控制器的请求或简单的pit模拟等都实现在VMM内部),或者将I/O请求向上发送给处于Domain0中运行的Qemu进程模拟I/O操作(具体是通过event channel发送模拟中断通知domain0中的qemu)。Qemu进程当监听到上发的I/O请求后,会调对应端口注册的处理函数进行I/O模拟处理,并将模拟结果送回VMM,从而返回给guest系统。

 

Mac下PyCharm切换虚拟环境

1.项目设置默认编译环境PyCharm–>Preferences Apply–>OKApply–>OK2.切换虚拟环境每个文件单独修改 Apply–>OK...
  • tymatlab
  • tymatlab
  • 2017年11月02日 12:02
  • 331

让天堂的归天堂,让尘土的归尘土——谈Linux的总线、设备、驱动模型

转自宋宝华老师csdn 公元1951年5月15日的国会听证上,美国陆军五星上将麦克阿瑟建议把朝鲜战争扩大至中国,布莱德利随后发言:“如果我们把战争扩大到共产党中国,那么我们会被卷入到一场错误的时...
  • bingqingsuimeng
  • bingqingsuimeng
  • 2017年06月29日 14:16
  • 277

Linux硬件设备访问

mmap设备操作 mmap系统调用(功能) 实例分析:mmap系统调用 虚拟内存区域:虚拟内存区域是进程的虚拟地址空间中的一个同质区间,即具有同...
  • qq_27522735
  • qq_27522735
  • 2017年02月14日 19:24
  • 341

virtualenv和它的原理

一起研究一下virtualenv是如何做到隔离各个版本的python环境的!
  • Jacketinsysu
  • Jacketinsysu
  • 2017年02月09日 10:52
  • 1526

Spring Mobile是如何判断访问设备的类型的

Spring最近换域名了,去转转,发现了一个有意思的项目:spring mobile。 http://projects.spring.io/spring-mobile/ 这个项目有很多实用的功...
  • hengyunabc
  • hengyunabc
  • 2013年11月17日 08:04
  • 6121

python虚拟环境安装和配置

http://blog.csdn.net/pipisorry/article/details/47008981python虚拟环境virtualenvVirtualEnv用于在一台机器上创建多个独立的...
  • pipisorry
  • pipisorry
  • 2014年10月11日 19:11
  • 30964

Linux——Python虚拟环境

Command Line Python 在前面一篇中,我们直接在python命令行中运行代码,虽然简单明了,但是命令行是不能保存文件的。因此在开发python程序时,我们需要将python代码存为文件...
  • zm714981790
  • zm714981790
  • 2016年05月04日 21:23
  • 1002

python安装虚拟环境

转自:点击打开链接 虚拟环境 虚拟环境是一个将不同项目所需求的依赖分别放在独立的地方的一个工具,它给这些工程创建虚拟的Python环境。它解决了“项目X依赖于版本1.x,而项目Y需要项目4.x”...
  • muyimo
  • muyimo
  • 2017年04月12日 17:57
  • 551

Windows:使用virtualenv创建虚拟环境,安装pip

介绍Windows下Python3.4安装virtualenv创建虚拟环境、pip;本次配置的是Python3.x版本。 工具/原料 Python3.4,这里就不介绍怎么安装了...
  • baidu_21833433
  • baidu_21833433
  • 2016年10月23日 21:38
  • 443

linux中设备的访问

1.设备的访问    1)设备的发现    fdisk -l                           ##查看真实存在被识别的设备    cat  /proc/partitions ...
  • sumin1118
  • sumin1118
  • 2017年04月17日 21:40
  • 148
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:谈虚拟环境中设备访问的实现方法(中)
举报原因:
原因补充:

(最多只允许输入30个字)