Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8241
  • 博文数量: 1
  • 博客积分: 45
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-24 14:25
文章分类
文章存档

2012年(1)

我的朋友
最近访客

分类: LINUX

2012-09-26 18:19:44

    虚拟化技术近来又成为研究的热点,随着芯片处理能力的提高,而虚拟化能带来一些显而易见的好处,比如低功耗,安全性等等,在嵌入式领域中也越来越受到重视,arm就在最新的cortex-A7/A15中加入了虚拟化的扩展。本文简要的分析介绍虚拟化的一些基本概念和实现手段。

1 传统计算机系统与虚拟化系统对比

  我们首先通过1对虚拟化(本文讨论的是系统虚拟化,其他比如java虚拟机等等不再讨论之列)有个直观的认识,左边的是传统的计算机系统,一台物理机上运行一个os,这个os拥有全部的硬件资源,而右边的是支持虚拟化的系统,在一个物理机上运行了多个VMvirtual machine),每个VM上的guest os都认为自己拥有一个完整的硬件环境,而实际上它们是共享了底层物理机的资源,虚拟化技术通过虚拟机管理器,也就是VMM使得在一台物理机上虚拟和运行一台或多台虚拟机,vmm进行资源的分配与调度,VMM主要有两种形式,一种是Hypervisor方式,它直接运行在硬件之上,能够取得较高的性能,知名的产品有KVMXEN等等,另外一种就是Hosted方式,它运行在物理机的操作系统之上,虽然本身的性能不如Hypervisor方式,但是安装使用比较方便,同时功能也比较丰富。

下面我们讨论虚拟化的具体实现技术,首先是CPU的虚拟化,一个CPU架构是否是可虚拟化的必要条件是它的sensitive 指令是否是特权指令的子集,这里有个重要的概念就是sensitive 指令,在有关虚拟化的一篇经典论文中是这样定义的,敏感指令就是执行效果与处理器模式有关的指令,换句话说,就是敏感指令在不同的特权级别下执行的结果是不同的,在操作系统的特权模式下能正确执行,在用户模式可能执行的结果是无法预测的。回到上一个条件,如果敏感指令同时也是特权指令,那么它在用户模式下执行就会产生trap,然后可以在特权模式下模拟它的执行效果,那么就可以使得这个敏感指令在用户模式下能够正确的执行,也就是guest os能够跑在用户模式的基本条件。arm在支持虚拟化之前,它的指令集中有sensitive privileged指令,也有sensitive non-privileged指令,比如LDM,STM等等,所以不能对它直接进行虚拟化。

CPU虚拟化也就是指令虚拟化有三种方式,第一种是软件模拟的方法,属于hosted模式,在物理机的操作系统上创建一个模拟硬件的程序来仿真所想要的硬件,然后在上面跑虚拟机,指令虚拟化主要采用动态二进制翻译的方式,这种方式中guest os不需要修改,知名的产品有bochsqemu等等,缺点是速度较慢。 

第二种是全虚拟化技术,这种技术VMM可以用hosted方式,也可以使用hypervisor方式,这种方式下guest os执行敏感指令的时候会traphypervisor中,hypervisor对指令进行仿真执行,这样guest os可以不用修改就能运行,这种方式是业界最成熟和常见的,比如virtualboxkvmvmware workstation等等

最后一种是半虚拟化技术,它与全虚拟化有一些类似,但是它的guset os是需要经过修改的,比如将敏感指令进行一些替换等等,使得guset os能够非常好的配合hypervisor来实现虚拟化,因为这种方式不需要捕获敏感指令,性能很好,经典的产品有xen还有微软的hyper-v

2arm最新加入的虚拟化扩展,它增加了一个hyp mode,使得VMM运行在这个模式下,guest os执行一些特权指令的时候会trapVMM中进行相应的处理,guest os的应用程序还是跑在user mode,内核跑在supervisor mode

2 ARM虚拟化扩展

下面介绍内存的虚拟化,内存虚拟化的挑战在于guest osTLB和页表都不再可用,因为它们都是虚拟的,我们需要为guest os物理地址和真实的物理地址做一个映射。

内存虚拟化常用的方法有direct page table, xen就采用了这种方式,内存虚拟化通过内存分段保护机制,使得xenguest os共存在同一内存地址空间,利用内存分页机制,xen可保证guest os在内存上的有效隔离,每个guest os中页表的变化都需要经过xen的确认,以确保guest os的地址空间不会与其他guest os或者xen本身的地址空间发生冲突,这种方式下每个guest os都是参与整个内存的管理的,所以它的源码是需要修改的。

另外一种就是影子页表的方式,由于宿主机MMU不能直接通过guest os的页表来进行内存访问,所以当guest os访问宿主机物理内存时,需要经过多次地址转换,从图3中可以看到,首先根据guest page table把客户机虚拟地址转换成guest physical address,然后通过guest physical addresshost virtual address的映射关系转换成host virtual address,最后通过host page table转换成最终的host physical address,而通过影子页表,可以实现guest virtual addresshost physical address的直接转换,提高了效率。(KVM中为guest os的每个进程页表维护一套相应的影子页表,guest os访问内存时,真正被装入MMU的是影子页表,当客户机访问内存需要转载CR3寄存器时,KVM会捕获这一特权指令,根据hash表找到与客户页表对应的影子页表,装入CR3中,如果影子页表没有建立,则KVM根据映射关系进行重新建立)。

3 GVA-HPA转换图

ARM的虚拟化扩展中加入了LPAE的特性,也就是大物理地址扩展,将地址线扩展到40位,也就是物理内存最大支持到1TB,同时也支持2 stage的地址转换,stage 1是将32位的guest os32位的虚拟地址转换成了40位的IPA,也就是中间物理地址,然后stage240位的IPA转换成40位的真实的物理地址,如图4所示。(为什么不采用影子页表,因为这个2 stage的转换过程是arm支持虚拟化之后的MMU处理的,性能很好,而影子页表是在没有硬件特性支持的情况下,为了提高性能想出的对策,属于软件策略)

4 ARM虚拟化2-stage转换

接下来介绍I/O虚拟化技术,I/O设备包括网络设备,硬盘,USB设备,等等,I/O虚拟化需要能将虚拟设备的IO请求转发到真实硬件上进行处理,第一种是软件模拟的方式,guest OSIO设备由VMM比如qemu软件模拟出来,guest os本身包括设备驱动都不需要修改,应用提交IO请求经过驱动到达虚拟的设备,虚拟设备在转发给真实的I/O设备进行处理,我们以串口设备为例来说明I/O处理的过程,在qemu启动虚拟机的时候,我们可以通过命令行参数指定将虚拟机中的串口设备映射,比如就映射到真实的物理串口ttyS0上,那么qemu在初始化硬件环境的时候会创建一个设备结构体来代表虚拟的串口设备,这个结构体的成员包括串口的各种寄存器等等,还有一个重要的成员就是刚刚提到的ttyS0的文件描述符,并且设置回调函数,对虚拟串口的读写操作就实现为对ttyS0文件的读写,这样也就实现了IO请求的转发。

第二种是半虚拟化,采用分离设备驱动模型的方式,该模型将设备驱动分为前端驱动,后端驱动,其中前端驱动运行在guest os中,而后端驱动运行在hypervisor中,前端通过共享内存的I/O环形队列将请求提交给后端进行处理,能够提高效率。

第三种方式是pass through方式,特点是虚拟机不再需要提供设备模拟,而是让guest os直接看到并操作真实设备而不需要经过VMM的管理,pass through方式将设备独占性的分配给指定的客户机,优点是:由于不需要模拟设备进行请求转换,所以访问速度高,提高了I/O性能,这种方式的缺陷在于它牺牲了设备的共享能力,而且需要硬件的虚拟化支持,以便隔离和保护硬件资源。支持硬件IO虚拟化的平台主要做了2件事,一个是DMA remapping, 将DAM请求中的guest物理地址映射到host的物理地址上,另外一个中断remapping,将物理中断映射为虚拟中断。

 

阅读(1840) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~