Virtualization(虚拟化)技术详解

日期: 2008-04-09 作者:wkkii 来源:TechTarget中国

  一 背景


  有些时候我们希望在一台机器上同时运行不同操作系统下的应用程序,这种需求可以有三种实现方式(需要强调,这里是指运行不同操作系统的应用,而不是运行另一种体系的应用,比如在x86上运行Apple Mac上的应用)


       1. 纯仿真方式,比如bochs,缺点是运行速度太慢,


       2. OS/API仿真方式,比如wine,


       3. virtualization方式,对于一般的应用,有时可以达到”natively”。


  二 Virtualization


  virtualization并不是一个新技术,早在60/70年代,IBM就已经在360/67、370等硬件体系实现上virtualization。Virtualization通过VMM(Virtual Machine Monitor)把一个硬件虚拟成多个硬件(VM,Virtual Machine),各VM之间可以认为是完全隔离的。这个隔离不同于各进程之间的地址空间隔离。无论是内存,设备,还是处理器等对各VM来讲,都被认为是自已独一套的。在VM上可以运行”任何”的操作系统(称为Guest OS)而不会对其它的VM产生影响。


  1.内存


  通过MMU已经可以将用户地址空间与系统进址空间完全分离了,VM也是通过同样的方法将真实的物理内存与VM中的“物理内存”分开,VM上运行的操作系统对MMU的操作将被VMM捕获,经过变换后替代VM进行真正的MMU操作。


  2.外设


  a)VMM用假的设备“欺骗”VM。


  VM对该设备的操作被VMM捕获并解释执行


  b)该外设被某个VM独占,VMM捕获方式


  VM对该设备的操作被VMM捕获,VMM将这个操作传递给真正的外设


  c)该外设被某个VM独占,直接使用方式


  VM对该设备的操作不需要通过VMM,直接传给真正的外设


  3.处理器
 
  VMM需要对处理器监控,从而达到在不能让VM的指令影响系统的情况下,又要确保指令对VM的正确性。


  比如执行如下指令(X86)


  cli


  pushfl


  popl %eax


  对VMM来讲,是不允许VM的关闭中断指令使真正的CPU关闭中断的,但之后push/pop结果,必需确保(%eax中)对应的位被清零。


  因此VMM需要捕获cli, pushfl等指令的执行,相应的cli只是关闭该VM对中断的响应,而pushfl则需要将EFLAGS和对应该VM的中断屏蔽位(实际上还有其它一些特殊标志位)结合后的数据压栈。


  三 Sensitive Instruction(敏感指令)和内存/IO保护


  从上面可以看到,要想实现virtualization,系统必需能做到:


  1.在内存读写操作时,能够进行地址变换.


  2.对某些特殊内存(比如MMU使用的页表内存)和一些IO口的操作不能被直接执行,而是被VMM捕获


  3.一些处理器指令不能直接执行,而需要被VMM捕获。


  在Virtualization中,如果某个指令不能被VM直接执行,必需被VMM捕获,那么称这个指令为sensitive-instruction。为了能够实现VM,要求任何一个sensitive-instruction指令都要产生TRAP,从而被VMM捕获得。


  不过,对内存/IO操作需要特殊考虑,限制某些内存的读写一般是通过MMU提供的页R/W保护机制实现的(当访问禁止读写的地址时,也需要产生TRAP,而不是忽略),因此不把读写内存操作看成是sensitive-instruction。


  对于IO操作,有些IO地址直接占用的物理地址,可通过MMU的保护机制实现,有些IO地址是独立的,一种方式是把这种IO归类到sensitive-instruction,另一种情况,比如X86系统,可以使用IO操作允许BITMAP,起到MMU类似的保护机制。


  四 Privleged (特权)


  现在大多数处理器为了防止应用程序的错误代码破坏整个系统,把处理器分成了两种或多种状态,某些指令只有在高级别的状态(内核态,RING0等)下才能正确执行,操作系统的代码通常运行在该状态下;而一般的应用程序运行在低级别的状态(用户态),某些指令是禁止执行的。对于指令,通常可分为三类:


  1.普通指令,在各种状态下的执行效果是一样的,Non-Privileged Instruction,(MMU的内存保护不属于指令体系范围,所以读写内存也是普通指令)


  2.特殊指令,在不同状态下,指令的结果不一样,但程序不会产生TRAP,而是继续执行。(Privileged Instruction??? Non- Privileged Instruction???)


  3.特殊指令,在低级别状态下,执行该指令会产生TRAP,中止当前程序的执行,Privileged Instruction。


  五 Virtualizable(可虚拟化)


  对照sensitive的定义,指令可以分成:


  a)non-sensitive/non-privileged instruction


  b)sensitive/non-privileged instruction


  c)sensitive/privileged instruction


(non-sensitive/privileged的指令好象很少见)


  如果一个系统支持特权指令,并且不存在(b)类型的的指令,那么我们称之为”NATURALLY VIRTUALIZABLE”(当然,MMU的保护机制也是必需的)。通常这种系统的处理器在设计时就考虑到了VM机制,因而还会为Virtualization提供一些硬件指令级的支持,以提高性能。


  对于每个VM,只会运行在低级别状态(用户态)下,这样所有的sensitive指令会被VMM捕获,并由VMM分析指令后返回给VM一个”虚假”的结果,从而把自已看成是一个完整的硬件系统。


  如果处理器含有(b)类指令,也可以实现Virtualization,但需要某种技术使(b)类指令产生TRAP。
  
  六 Dynamic Scan-Before-&#101xecute


  很多处理器,包括X86,属于不幸的那种,这些处理器存在(b)类指令(X86有17个指令),所以实现虚拟化需要其它的方法,通常采用的方法就是SCAN-BEFORE-&#101xecute。


  对于要执行的指令,先进行扫描,如果找到(b)类指令,就会用特殊的陷阱指令(比如X86的brk)替换或设置成硬件调试地址,通过这种方式将处理器转交到VMM手中。


  静态的SBE几乎是不现实的,而是采用动态扫描法,而且也不会大范围的扫描,通常扫描到一个(b)类指令或扫描到一个跳转指令(扫描到跳转的行为在实际实现上因为性能等考虑会复杂一些,通常是在分支跳转指令时设置断点)或指令会跨页时设置陷阱,把执行权交给VMM,另外,扫描结果通常会有记录,可以在重复调用时起到加速作用。     为了对付SEC,SMC,以及在有代码扫描记录时,还需要将正在执行的(或扫描过的)代码空间进行读写保护。


  七 VMM


  VMM是一段监控代码,运行在最高级别状态下,用来实现以下功能:


  1.替VM“执行”所有的sensitive指令。


  2.在VM地址和真实地址之间进行变换,并实现Guest OS的PAGE TABLES功能。


  3.Virtualization各VM的中断向量表,并实现VM中的中断


  4.Virtualization被VMM(各低层HOST OS)占用的各种处理器资源(比如LDT,GDT,IDT,TSS等)


  5.提供”真实的”Timing.


  6.Virtualization 各种设备/硬件接口


  7.BIOS(?)


  8.其它等等


  VMM一般分成VMM over HW或VMM over HOST OS两种。


  1.VMM over HW: 在硬件上的核心只有VMM,VMM本身就是一个多任务(分时)系统,但不会直接运行应用程序,或者说每个应用程序都是一个VM。


  2.VMM over HOST OS,比如VMWare, VirtualPC,这时候VMM也只是一个应用(或内核功能模块),VMM运行(加载)后,会载获各种sensitive指令导致的TRAP向量,如果产生TRAP的不属于VM,再传递给原来的处理函数。


  八 Full System Virtualization vs Paravirtualization


  Full System Virtualization就是指完全的虚拟化,但对于通常的情况(比如各VM都运行LINUX),完全虚拟化性能不够理想,以下面的代码为例:


       unsigned int back_flags;


       save_flags(back_flags);


       cli();


       *bitsp |= value;


       restore_flags(back_flags);


  译成汇编码(X86)是


  (假设back_flags分配到寄存器ecx,,value存在eax中,bisp地址存放在edx中)


       pushfl(*)


       popl %ecx


       cli(*)


       orl %eax, (%edx)


       pushl %ecx


       popfl(*)


  六条指令(如果用汇编写是四条指令)就会产生三次TRAP,性能可想很知。


  对于通常的使用情况,导致性能下降的代码都是操作系统的代码。而操作系统恰恰可以认为是安全的(可信任的)。因此通过适当修改操作系统(Guest OS)的代码,提高Guest OS代码运行时的级别等手段,可以让VM的性能再次提高。


  在这种情况下,各VM在OS级别并不是完全的隔离,但对应Guest OS上的应用来讲,表现的结果还是完全隔离的。这种方式被称为paravirtualization。Paravirtualization的局限性就是只能运行通用的操作系统。范围受到很大限制。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

作者

wkkii
wkkii

相关推荐

  • VMware快照工作原理以及如何运用

    当你更新或修复应用程序和服务器时,VMware快照无疑是你的救星。而如果你负责监管虚拟环境,你更是应该知道什么 […]

  • 配置ESXi Autostart,自动打补丁

    顾名思义,VMware ESXi Autostart能够实现自动开启、关闭ESXi服务器上的虚拟机,让虚拟机管理变得更轻松。如果运行了多个虚拟机并且给主机打补丁后需要重启主机,那么ESXi Autostart的作用就更大了,没有Autostart的话,你需要在给主机打补丁后,手动重启每个虚拟机。

  • 推荐一款好的虚拟主机提供商

    推荐一款好的虚拟主机提供商 推荐理由:   第一:种类多:有经济型,全能型,功能型等   […]

  • 哪里的虚拟主机最便宜?

    鱼和熊掌不可兼得, 想要找即便宜又好用的虚拟谁有办法? 我来推荐一款,可以了解 新网云虚拟主机一年只要1元钱 […]