Virtualization(虚拟化)技术简介

上一篇 / 下一篇  2007-12-11 23:20:12 / 个人分类:Virtualization

一 背景51Testing软件测试网,JzL;xJ~rc8A%MT
51Testing软件测试网/G#c#`:ue'tA i0pG$W,^J
有些时候我们希望在一台机器上同时运行不同操作系统下的应用程序,这种需求可以有三种实现方式(需要强调,这里是指运行不同操作系统的应用,而不是运行另一种体系的应用,比如在X86上运行Apple Mac上的应用)51Testing软件测试网V;Z4H!gl$_1SRo9{

6a9X"j({-w8S'U01. 纯仿真方式,比如bochs,缺点是运行速度太慢
Z)Tu~o1n0
a!^#^T!~TW02. OS/API仿真方式,比如wine,51Testing软件测试网^4ao\4uO(or'sq
51Testing软件测试网#K$X.k B7s\ s
3. virtualization方式,对于一般的应用,有时可以达到”natively”。
1?3x gr9i#Z)lB0
PC Q`^H8C0二 Virtualization51Testing软件测试网0Nk%Opu5{/}B+?8T

2W*Be8u:OT2U0Virtualization并不是一个新技术,早在60/70年代,IBM就已经在360/67,370等硬件体系实现上Virtualization。Virtualization通过VMM(Virtual Machine Monitor)把一个硬件虚拟成多个硬件(VM,Virtual Machine),各VM之间可以认为是完全隔离的。这个隔离不同于各进程之间的地址空间隔离。无论是内存,设备,还是处理器等对各VM来讲,都被认为是自已独一套的。在VM上可以运行”任何”的操作系统(称为Guest OS)而不会对其它的VM产生影响。51Testing软件测试网t C$q2CG%h @'Lk'~B X
51Testing软件测试网!S7l7R4\%Q*B"D$D&~/T:D+A-pt
1.内存51Testing软件测试网0N-hN$C:sa$L

t#w}g%y5IN,w0通过MMU已经可以将用户地址空间与系统进址空间完全分离了,VM也是通过同样的方法将真实的物理内存与VM中的“物理内存”分开,VM上运行的操作系统对MMU的操作将被VMM捕获,经过变换后替代VM进行真正的MMU操作。51Testing软件测试网]-O+U3M2_A

rG7W7jM!y|6]02.外设
ZM#zb%C051Testing软件测试网 zF(O bxy'f9a~
a)VMM用假的设备“欺骗”VM。51Testing软件测试网{&m/{7E6N+Z

!EcCfs0VM对该设备的操作被VMM捕获并解释执行
KJ#ht z8}051Testing软件测试网+Cdp"Q#{|C
b)该外设被某个VM独占,VMM捕获方式
+B6N.ssZ}5NQj0
5NWW&|&{e*bM%PF0VM对该设备的操作被VMM捕获,VMM将这个操作传递给真正的外设51Testing软件测试网pO%i;{}w
51Testing软件测试网R[6ZJW
c)该外设被某个VM独占,直接使用方式51Testing软件测试网/~-n}7J1@%oS;g w
51Testing软件测试网6[n;{H d#bD(~'o`N
VM对该设备的操作不需要通过VMM,直接传给真正的外设51Testing软件测试网:q`;?v~

j7g:r _wOGA03. 处理器51Testing软件测试网8Fj#~e*\A
51Testing软件测试网 Jhw0L s4C!K
VMM需要对处理器监控,从而达到在不能让VM的指令影响系统的情况下,又要确保指令对VM的正确性。
$x3W"j1G2u1^0
S ZsFCNR0比如执行如下指令(X86)51Testing软件测试网.D6q;U;EY.Oi

%~&b4lo xy r^#?0cli
:}V+z6E)e,B]051Testing软件测试网 e5YDyv
pushfl
mfVj cvx},V e0
WQ9YiLio(u_x(w E0popl %eax51Testing软件测试网dKJ&|F B \

w0zg^H!M"o0对VMM来讲,是不允许VM的关闭中断指令使真正的CPU关闭中断的,但之后push/pop结果,必需确保(%eax中)对应的位被清零。51Testing软件测试网eH ya4_
51Testing软件测试网X6u i` z {2R2}-Z*A#\4i
因此VMM需要捕获cli, pushfl等指令的执行,相应的cli只是关闭该VM对中断的响应,而pushfl则需要将EFLAGS和对应该VM的中断屏蔽位(实际上还有其它一些特殊标志位)结合后的数据压栈。51Testing软件测试网~N(C f&B;wz&Vf[
51Testing软件测试网 p)l0X&U#A B^8[{"v
三 Sensitive Instruction(敏感指令)和内存/IO保护
xd&oc8fzr051Testing软件测试网:L4k[/ze
从上面可以看到,要想实现virtualization,系统必需能做到:51Testing软件测试网&R+V(mpu.|g.P.U

'y'ftZM ke01. 在内存读写操作时,能够进行地址变换.
D n-uo7W6[/Z?5@0
h*]i.? lO02. 对某些特殊内存(比如MMU使用的页表内存)和一些IO口的操作不能被直接执行,而是被VMM捕获51Testing软件测试网*kg']-h%v0b#D:l i}

q:Y1g!_*g$J&N03. 一些处理器指令不能直接执行,而需要被VMM捕获。
$Hf1ier0
'_2tI)yei8H3QP"Wv0在Virtualization中,如果某个指令不能被VM直接执行,必需被VMM捕获,那么称这个指令为sensitive-instruction。为了能够实现VM,要求任何一个sensitive-instruction指令都要产生TRAP,从而被VMM捕获得。51Testing软件测试网I"m Ggts
51Testing软件测试网6gc,oux_O
不过,对内存/IO操作需要特殊考虑,限制某些内存的读写一般是通过MMU提供的页R/W保护机制实现的(当访问禁止读写的地址时,也需要产生TRAP,而不是忽略),因此不把读写内存操作看成是sensitive-instruction。
Mqo*i$t6XK}fa0
@r9Bk3zx w0X"h0对于IO操作,有些IO地址直接占用的物理地址,可通过MMU的保护机制实现,有些IO地址是独立的,一种方式是把这种IO归类到sensitive-instruction,另一种情况,比如X86系统,可以使用IO操作允许BITMAP,起到MMU类似的保护机制。51Testing软件测试网 x[AU9k_
51Testing软件测试网;w.B.?;Vb9g4oL
四 Privleged (特权)51Testing软件测试网[,Y I.^E*p v
51Testing软件测试网!vpm&Z2~3gjE&d@
现在大多数处理器为了防止应用程序的错误代码破坏整个系统,把处理器分成了两种或多种状态,某些指令只有在高级别的状态(内核态,RING0等)下才能正确执行,操作系统的代码通常运行在该状态下;而一般的应用程序运行在低级别的状态(用户态),某些指令是禁止执行的。对于指令,通常可分为三类:
7g1f1h#G5zfE'sw.{0
yp:h2jy5t M01.普通指令,在各种状态下的执行效果是一样的,Non-Privileged Instruction,(MMU的内存保护不属于指令体系范围,所以读写内存也是普通指令)
K2v.\9uD4h_q,t051Testing软件测试网)zw[K4{"G
2.特殊指令,在不同状态下,指令的结果不一样,但程序不会产生TRAP,而是继续执行。(Privileged Instruction??? Non- Privileged Instruction)
F]9g(b1U0
#O[V^n8r.u'A g+W03.特殊指令,在低级别状态下,执行该指令会产生TRAP,中止当前程序的执行,Privileged Instruction。
9y tvp#nt TR051Testing软件测试网Aw*Z4P3M*rU%_
五 Virtualizable(可虚拟化)51Testing软件测试网C;s9GdHo)V

z8|:MS9u7P~y0对照sensitive的定义,指令可以分成:51Testing软件测试网/D;K+na0~

*gz-AU"N w{ n/Q0a)non-sensitive/non-privileged instruction
u$h-v"aP,p!J cv0
qa"\4A/K0b)sensitive/non-privileged instruction51Testing软件测试网YhpLG{w-{o+n
51Testing软件测试网.]fTabh}Wbn
c)sensitive/privileged instruction
4Rjy*T*f)w0
^!x!z[m0(non-sensitive/privileged的指令好象很少见)51Testing软件测试网 hZ1}oYq_#K,k

(_C%n!N{T(v0如果一个系统支持特权指令,并且不存在(b)类型的的指令,那么我们称之为”NATURALLY VIRTUALIZABLE”(当然,MMU的保护机制也是必需的)。通常这种系统的处理器在设计时就考虑到了VM机制,因而还会为Virtualization提供一些硬件指令级的支持,以提高性能。51Testing软件测试网VyY*V V[7pix.t

.aa v O H.B \sP)Al/B0对于每个VM,只会运行在低级别状态(用户态)下,这样所有的sensitive指令会被VMM捕获,并由VMM分析指令后返回给VM一个”虚假”的结果,从而把自已看成是一个完整的硬件系统。
;R,z-\z(t5M0
1u'JI3EV2kU0如果处理器含有(b)类指令,也可以实现Virtualization,但需要某种技术使(b)类指令产生TRAP。
$bZL)v3I,e0
j N k(J2d~K0六 Dynamic Scan-Before-Execute51Testing软件测试网Sb.ogFHPI

l3U!C,d^0r2zG0很多处理器,包括X86,属于不幸的那种,这些处理器存在(b)类指令(X86有17个指令),所以实现虚拟化需要其它的方法,通常采用的方法就是SCAN-BEFORE-EXECUTE。
w9K0UR_[0
a3d.|MM*?i0对于要执行的指令,先进行扫描,如果找到(b)类指令,就会用特殊的陷阱指令(比如X86的brk)替换或设置成硬件调试地址,通过这种方式将处理器转交到VMM手中。
;?2z O.L5Di;J e!o+I(g#Vng051Testing软件测试网 kY ua7Tq8Y'R
静态的SBE几乎是不现实的,而是采用动态扫描法,而且也不会大范围的扫描,通常扫描到一个(b)类指令或扫描到一个跳转指令(扫描到跳转的行为在实际实现上因为性能等考虑会复杂一些,通常是在分支跳转指令时设置断点)或指令会跨页时设置陷阱,把执行权交给VMM,另外,扫描结果通常会有记录,可以在重复调用时起到加速作用。 为了对付SEC,SMC,以及在有代码扫描记录时,还需要将正在执行的(或扫描过的)代码空间进行读写保护。51Testing软件测试网LW;sX0j$l

2D)h7q}&k#\t0
J o+y*Re7L+v0七 VMM51Testing软件测试网#Wq&m/X{o;TA
51Testing软件测试网q9o.sM F {:j([6Y5K:s
VMM是一段监控代码,运行在最高级别状态下,用来实现以下功能:51Testing软件测试网(M#A&t'DoV s
51Testing软件测试网,d_t_ n%Jj
1.替VM“执行”所有的sensitive指令。
7N*TN7K Ib,S051Testing软件测试网Wx#Hs`-Gc{`6_
2.在VM地址和真实地址之间进行变换,并实现Guest OS的PAGE TABLES功能。
lH q$s9g9X[0
s x1\.@'o H Eh03.Virtualization各VM的中断向量表,并实现VM中的中断51Testing软件测试网p4d+L7U^d.c

-sUZe2~el2ZR04.Virtualization被VMM(各低层HOST OS)占用的各种处理器资源(比如LDT,GDT,IDT,TSS等)
Zo(\+No0j,fF9V0
;P&S `s&zf!|1?0z2n05.提供”真实的”Timing.51Testing软件测试网#\:Gz8y Z{'b N3a
51Testing软件测试网eOc3T@ U!qT
6.Virtualization 各种设备/硬件接口51Testing软件测试网eS6e[ z}p

oKd8s2f1aKPMg)J#Y07.BIOS(?)
(i Q8`qeW7K0
4n`9Qg(PQ@ ^08.其它等等
yt#[\+x0C051Testing软件测试网b{:GKRQjC#I
51Testing软件测试网S*R \)zg9^)EK
VMM一般分成VMM over HW或VMM over HOST OS两种。
$vkgoi6I{9e_ e0
[MS h.Jvyj01.VMM over HW: 在硬件上的核心只有VMM,VMM本身就是一个多任务(分时)系统,但不会直接运行应用程序,或者说每个应用程序都是一个VM。51Testing软件测试网)Z-\5Ls!u8SC^F

v#V@ V"w[G%q/h02.VMM over HOST OS,比如VMWare, VirtualPC,这时候VMM也只是一个应用(或内核功能模块),VMM运行(加载)后,会载获各种sensitive指令导致的TRAP向量,如果产生TRAP的不属于VM,再传递给原来的处理函数。
D na$V n7mh"t0
+g0|`;^ Mj0八 Full System Virtualization vs Paravirtualization
a(d[? j+A0
!KFfc7k6y;~0Full System Virtualization就是指完全的虚拟化,但对于通常的情况(比如各VM都运行LINUX),完全虚拟化性能不够理想,以下面的代码为例:
-gr Zh+|(n)y051Testing软件测试网{M9a,u }`:wnS
unsigned int back_flags;
6fty#W }s051Testing软件测试网8p*?4ij6o
save_flags(back_flags);
5|+afq~051Testing软件测试网L:^:k4d Zf^6Q%E
cli();51Testing软件测试网yyz.Em }

1]nR(e3}~8X0*bitsp |= value;51Testing软件测试网k&A b7y3g!u4w z9XA)r[
51Testing软件测试网4[KF/S#q1I0MKA
restore_flags(back_flags);51Testing软件测试网?.v+wTQ\.s3a
51Testing软件测试网*E~Y Aw7J)o`
译成汇编码(X86)是
tL`K[!VO6]0
6yY hd$G1W5_0(假设back_flags分配到寄存器ecx,,value存在eax中,bisp地址存放在edx中)51Testing软件测试网U3I8i-P8x e&T/k"z@X1N$t

K(B|2ZZZ I9|*Et0pushfl(*)51Testing软件测试网^&vR EdzA:Q

/pZ(F F"H so[ _U0popl %ecx51Testing软件测试网-i h*W7^+Zb| PC
51Testing软件测试网 NQ"j4Ri1g
cli(*)51Testing软件测试网 jXK E~8_}wD

;n\T6W bv ^,o:]&~.q0orl %eax, (%edx)
jkafd,O0
8g8I-VN wq0pushl %ecx
u.ZL m/h!S0
+a\ Q_+hc p0popfl(*)
3IPR:[}+|S*L%p0
wK ]"u-P0六条指令(如果用汇编写是四条指令)就会产生三次TRAP,性能可想很知。
_\k Wz ?$K9zl0
9v MGn DcN[0对于通常的使用情况,导致性能下降的代码都是操作系统的代码。而操作系统恰恰可以认为是安全的(可信任的)。因此通过适当修改操作系统(Guest OS)的代码,提高Guest OS代码运行时的级别等手段,可以让VM的性能再次提高。51Testing软件测试网gT ov2Z Ql

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

TAG: virtualization 虚拟化 Virtualization

lsyhzw的个人空间 引用 删除 lsyhzw   /   2012-05-28 11:50:05
5
 

评分:0

我来说两句

Open Toolbar