浅谈Hypervisor Type 1
传统虚拟化软件台为 Hypervisor Type 2(基于Host OS 的虚拟化)
如Virtual PC,VMware GSX Server .VMware workstation ,QMEU.缺点则是性能不佳.并且资源配置性不好.
主要讨论的虚拟化技术以Hypervisor Type 1 (底层虚拟化技术)为主,所谓的Hypervisor Type 1 ,是指虚拟化主控平台与作业系统结合为一的结构.好处是能够100%控制硬件并且获得最佳性能.尽管Hypervisor Type 1 性能佳.但是下面应用用途不能应用.
1.没有当地终端显示,所以不能使用需要当地终端 单机多OS用途.(比如说玩游戏)
2.大部份Hypervisor Type 1 对本地 USB设备、 声卡 等硬件支持不佳
Hypervisor Type 1 又分为全虚拟化跟半虚拟化
Ring
还未解说 CPU 虚拟化之前先解释一个东西就是 Ring(环),
在 Intel CPU 的系统运行下可以区分成 Ring 0,Ring 1,Ring 2 和 Ring 3.
Ring 0 拥有最高的权限,通常是由系统核心才会有 Ring0 的权限,Ring 0 可以直接和硬件沟通读入 IO,CPU,Memory 与周边设备
.其次是 Ring 1,以此类推.一般 Kernel,driver 会存在 Ring 0.
一般 AP 存在 Ring 3,一般的作业系统也只运用到 Ring 0 和 Ring3.
采取这种方式的优点是一般运行的程序没有办法直接与硬件沟通,所以不会有像 Window 3.1 时一样的状况发生,一个程序就能把整个系统摧毁(Crash)掉
VMM(Virtual MachineMonitor)
一个机台要能同时执行很多作业系统时不能像是传统的方式让OS 的核心存放在Ring0.取而代之的就是VMM((Virtual Machine Monitor)也可以称作Hybervisor.也为了虚拟化的资源配置管理,所以必须有一个东西来管理所有虚拟化的作业系统(GuestOS).也就是所谓的 VMM(VirtualMachine Monitor).
此时的 VMM 主要工作为
‧仿真出一个完整的硬件环境给每一个 GuestOS
‧ 配置硬件支持给每一个 GuestOS
‧ 每一个 GuestOS 都是独立出来不会被彼此影响的
1 - FullVirtualization 使用的是 -Binary Translation
也正因为 IntelCPU 结构的关系,不少的CPU 指令必须执行在Ring 0 底下,而传统的作业系统核心也必须放在Ring 0 让他们能直接访问硬件.所以一开始的虚拟化几乎不能在X86的系统上使用.
但是VMware 使用了一种方式让虚拟化能够执行在X86 的系统上.他们使用一种称为Binary Translation 加上direct execution 的方式,所谓的Binary translation就是将原本要执行不能虚拟化的指令(nonvirtualizableinstructions)VMM 会转换成另一种语法,然后再交由VMM 去执行.就像是Guest OS 要将数据写入硬盘中,但是其实Guest OS的硬盘可能只是硬盘中的一块磁盘块(partition)或是文件(Loopfile),所以 VMM会把他的请求转换成另一种方式再来向硬件提出要求.而不再是用原本的指令去执行了.至於direct execution 是一般性的指令不需要在Ring0 才能执行就直接可以向硬件提出请求.
这样的缺点是会造成效率的低落,但好处是虚拟出来的作业系统(GuestOS)并不知道有 VMM的存在,他会以为自己拥有整个机器,而且虚拟出来的作业系统(GuestOS)也不需要修改核心去配合 VMM.加上VMM 会去虚拟整个机器包括了虚拟化的BIOS,devices 和memory的管理,.而且每一个虚拟出来的作业系统(GuestOS)都是独立而且安全性高不会受到其它虚拟出来的作业系统(GuestOS)影响.
当前采用这种方式的有 VMware’s全系列virtualizationproducts 和 MicrosoftVirtual Server.
2 -另一种需要修改作业系统的核心才能支持-Paravirtualization
刚才有说明为什么在一般x86系统下没有办法做虚拟化,大部分的原因是不能虚拟化的指令(nonvirtualizableinstructions)必须直接在 Ring0 执行.但是Paravirtualization使用了另一种方式,修改虚拟化作业系统(GuestOS)的核心,让虚拟的作业系统(GuestOS)可以直接将不能虚拟化的指令(nonvirtualizableinstructions)自动转换成 VMM可以执行的指令(hypercall),再由VMM 去向硬件提出请求.所以像是(Windows2000/XP)不能去修改它的核心(Microsoft也不愿意让别人来修改它的核心),所以无缘使用Paravirtualization.而所谓的hypercall 就像是 OSkernel 的 syscall 只不过hypercall 是针对hypvisor(VMM)的.
当前采用这种方式的有 Xen,KVM,HyperV
3 -Paravirtualization + Intel VT 或者AMD-V
在没有VT 的时代 VMM是直接装入在 Ring 0里面,Dom0 的kernel 则是被放在Ring1(Dom0 是第一个在Xen 底下运行的虚拟机器).后来产生出的DomU 也是存放在Ring1(需为Para-Virtualized,没有VT 的支持 Xen不支持 full-Virtualized).不过一般的AP 还是运行在 Ring3.也正因为如此 Para-Mode的 Guest OS 必须知道VMM 的存在.此时是不支持Full-Mode 的.后来有了VT 这一项技术.VMM和GuestOS(Para/Full-Mode)都可以直接执行在 Ring0运行.不过 VMM是存在比 Guest OS还要低的一层.
RootMode Privilege Levels.不能虚拟化的指令(nonvirtualizableinstructions)会自动被 hypervisor截取不需要再经过 binarytranslation 或 paravirtualization的模式转换.