• 虚拟化技术


    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) 

      

  • 相关阅读:
    马的遍历
    01迷宫
    TF-IDF算法扫盲2
    关键字提取算法之TF-IDF扫盲
    基于高维聚类技术的中文关键词提取算法
    文本关键词提取算法
    函数查询(Function Query)
    企业级搜索引擎Solr 第三章 索引数据(Indexing Data)[1]
    企业级搜索引擎Solr 第三章 索引数据(Indexing Data)[3]
    企业级搜索引擎Solr 第三章 索引数据(Indexing Data)[2]--DIH
  • 原文地址:https://www.cnblogs.com/python-way/p/6159005.html
Copyright © 2020-2023  润新知