宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

1、虚拟化基本知识

计算机的基本部件

控制集:CPU

存储:mem,

I/O:

  keyboard,moitor

虚拟化就是将一组物理平台,虚拟化为多组不同的,彼此之间隔离的平台。

CPU在OS安装以后就已经被虚拟化了,每个进程认为自己是独占CPU,内存的。CPU的虚拟化就是将其分为时间片

用户空间的进程需要使用硬件,

cpu执行方式:

最外层运行普通指令环3,用户空间的执行运行在这里

最内存环0:也叫特权环,所有特权指令,cpu中敏感寄存器,尤其是硬件管控寄存机需要由环0中指令才能执行,也就是内和空间在环0

环1与环2 (但是在x86平台上有些敏感指令也运行在这些环上运行)

运行在环3上的guest内核如何调用硬件? 

虚拟化技术-风君雪科技博客

guest的cpu实现方式:

3、软件模拟,创建一个进程或者一个线程模拟的cpu,让guest使用

X86虚拟化面临的常出的问题:

   1、特却集压缩:某些敏感指令,放在环1,环2上, 内核运行在环0上,但是兼顾环1,环2,如果运用虚拟化,guestOS需要运行在环1,环2上。从而可以直接运行敏感指令,所以这些指令需要自行捕获,
    才会避免guestOS避免执行这些指令。
2、特却集别名:guestOS操作系统实际运行在环1,环2上,但guestOS认为自己运行在环0,所以我们需要将环1,环2将其虚拟为环0.因此我们需要将其起名为环0 3、非特权敏感指令:x86平台上有些敏感指令运行在环1,环2上。
4、地址空间压缩:每一个虚拟机所得到的内存地址空间中必须保留一部分给vmm(虚拟机监控器,比如关闭虚拟机之类的命令)使用。说明有些vmm直接运行在GuestOS当中的。HOST主机中。vmm会进入虚
    拟化和退出虚拟化。所以guestOS使用的内存需要给vmm保留一部分,实际使用要比看上去少,使用的地址被压缩了。  
5、静默特权失败:X86的某些特却指令在执行失败后不会返回错误的。所以vmm不能捕获这些错误。我们就不知道各个虚拟机实例运行的状态。  6、屏蔽虚拟化:在虚拟化场景中,屏蔽中断,和非屏蔽中断,guestOS对于特权资源的每次访问都会触发处理器异常,(中断发生,处理器必须要要处理)都需要在中断时异常需要由vmm处理,
然后再把结果送个guest中。来回切换导致性能降低。

  

4、CPU实现虚拟化方式:

  1、完全虚拟化

  BT技术提升虚拟化性能                二进制翻译

    硬件层 —> 环0(vmm) —-> 环1 (guestos 内核)—-> 环2 空闲  —->环3(应用程序)

    guestOS与vmm之间使用的二进制翻译

虚拟化技术-风君雪科技博客

 这个平台为完全虚拟化,guestOS不知道自己是虚拟化。这种虚拟化需要给每个guestOS虚拟机模拟一个环0,所以性能确实很厉害

  2、 半虚拟化:

       硬件层 —> 环0(vmm 与 guestos 内核)) —-> 环1 、 环2 空闲  —->环3(应用程序)

   guestOS不会直接调用环0,特权指令需要使用VMM,这时guestOS知道自己是虚拟化。(hypercall调用请求)

      guestOS的内核被修改了。知道自己是虚拟化。windows不能运行在半虚拟化环境,因为不能修改close的操作系统

  虚拟化技术-风君雪科技博客

3、硬件虚拟化 hvm

cpu虚拟化

  硬件层 —>环 -1 (vmm )—–>  环0( guestos 内核) —-> 环1 、 环2 空闲  —->环3(应用程序)

  guestos内核直接安装在环0上,不用做修改,cpu设计时直接支持虚拟化,但是环0上没有特权指令上,只能捕获操作特权指令,然后交给环-1上的vmm来执行。

  但是由于还是需要环-1 环0 来回切换,还是性能比半虚拟化要差一些

5、内存虚拟化:

  正常的内存使用就是被虚拟化的。

  指令和数据都是由内存中获取的。内存本身就是由物理地址转换成线性地址,(MMU来处理的)

MMU 工作原理:

  线性空间转换成物理空间的关系存在页表当中的。 (page table)

  每个进程给cpu发送指令时,cpu要将 page table 及时的加载到mmu,然后通过mmu va —> pa的转换

  虚拟化后的内存虚拟化:

    GVA —> GPA —> HPA

    guestOS线性地址空间 —–> guestOS的物理地址空间  —–> HostOS的物理地址空间

        当guestOS中用户空间访问内存中数据,直接发送给HostOS cpu,此时由VMM捕获到,HCPU通过MMU找到对应的物理内存地址后会把地址结果给到VMM,VMM在通知guestOS

    GPA的位置,然后guestOS到gpa中查找。

  后来inter X86 硬件支持(影子mmu),有2个MMU,每次访问内存地址会同时发给这两个mmu,如果是虚拟机访问的就直接返回给虚拟机HPA的地址,跳过了中间的GPA的转换过程。

  tlb技术:保存了va—>pa的对应关系 ,加快MMU的转换速度,但是如果多个guestOS时,为了不混淆多个虚拟机的地址对应关系,所以需要都清除tlb

  后来又有了tagtlb ,这样在tlb中增加了标记,标记着是那台虚拟机的映射。

  

6、io虚拟化

本身就很慢,在虚拟化后更慢

IO虚拟化实现的方式借鉴于VMM模型

  type-1、type-2

  type1:

    虚拟机直接跑在硬件上,有一个实例是特权实例(dome0),管理其他的虚拟机

      虚拟化技术-风君雪科技博客   =======>  虚拟化技术-风君雪科技博客          ,

io完全虚拟化 : guestOS调用dome0的虚拟硬盘接口,dome0然后再真正调用物理IO设备的接口,进行二次驱动,这种模拟IO性能比较差

虚拟化技术-风君雪科技博客

io半虚拟化,前段分为两半,一般在domeU中,后端在dome0上,前段简单封装送给后端,后端做访问真正IO设备,进行IO设备的调用。

io由dome0自己调用。hv自己不会有过多的硬件驱动。所以要借助dome0 io 等各种驱动。

hypervisor自我实现驱动硬件,各个硬件厂商需要单独开发给hv提供驱动,但是厂商不会专门给某个hv提供驱动的,所以hv需要自己开发驱动程序。但是硬件设备太多,自己开发硬件驱代价太大,

所以这种的虚拟化技术对于硬件的兼容性太差。 买服务器需要找好型号。

io虚拟化,是使用文件来模拟io设备。 dome0软件模拟硬件真实的借口。 

    type-2: 虚拟机跑在操作系统上

  虚拟化技术-风君雪科技博客

vmm不用自己提供任何驱动,只需要模拟各硬件,真正设备的驱动又host来提供

梳理:

各vmm对io的驱动有三种模式:

  类型1:半虚拟化,自主vmm:vmm自行提供驱动

       混合vmm:借助于外在OS提供驱动。XEN、VM

           1、依赖于外部OS提供特权域

           2、自我提供特权提供特权域

   类型2: 寄宿方式,有宿主机的VMM

IO虚拟化模型:

  纯模拟,完全虚拟化

  半虚拟化

  透传:无论是半虚拟化还是模拟都需要借助dome0来实现IO虚拟化的,透传则是由guest直接使用硬件。dome0管理各硬件

    虚拟化技术-风君雪科技博客

另一种技术: 

SR-IOV:将一个硬件轮流给多个guestOS使用。 

完全虚拟化:vm(类型2)  vb kvm, vm-exsi(类型1)

半虚拟化:xen (类型1)