虚拟化的含义很广泛,将任何一种形式的资源抽象成另一种形式的技术都是虚拟化技术,比如进程的虚拟地址空间,就是把物理内存虚拟成多个内存空间(参考这篇文章)。相对于进程级的虚拟化,虚拟机是另外一个层面的虚拟化,它所抽象的是整个物理机,包括CPU、内存和I/O设备。

在一台物理机上可以模拟出多台虚拟机(Virtual Machine,简称VM),每个虚拟机中都可以运行一个操作系统(OS)。提供虚拟化的平台被称为VMM(Virtual Machine Monitor),在其上运行的虚拟机被称为guest VM(客户机)。根据VMM支持的虚拟机制的不同,guset VM的运行模式可分为完全虚拟化(Full Virtualization)和类虚拟化(Para Virtualization)。

【完全虚拟化

如果一个基于硬件运行(native)的OS不需要修改任何代码就可以直接跑在VMM上,也就是guest OS根本感知不到自己运行在一个虚拟化环境中(可以说VMM是骗术高明的),这种就被称为“完全虚拟化”。在这种模式下,VMM需要正确处理guest所有可能的指令。

最简单直接的方法就是,VMM对guest运行过程中的每一条指令都进行解释和执行,模拟出这条指令执行的效果,这种方法既适用于和VMM相同体系结构的guest,也能用于模拟和VMM不同体系结构的guest(比如物理CPU是x86的,而guest是基于ARM的),其缺点也很明显,就是性能太差。

有一些指令是要操作特权资源的,比如修改虚拟机的运行模式或者下面物理机的状态,读写时钟或者中断寄存器,这些指令被称为敏感指令,确实不适合由guest直接来控制。

然而其他的一些非敏感指令,是完全可以在物理CPU上直接执行并返回结果给guest的,VMM只需要截获并模拟guest对敏感指令的执行和对特权资源的访问就可以了,以intel的VT-x和AMD的AMD-V为代表的硬件辅助虚拟化技术,就可以帮助VMM高效地识别和截获这些敏感指令。

【类虚拟化

像x86这种CISC架构的系统,指令繁杂,其中一些指令是难以虚拟化的,如果使用完全虚拟化,就需要通过二进制代码翻译(binary translation),扫描并修改guest的二进制代码,将难以虚拟化的指令转换成支持虚拟化的指令(ABI级),就像打补丁一样。

如果能直接修改guest的操作系统内核代码(API级),就可以使得内核避免产生这些难以虚拟化的指令,这就是“类虚拟化”。类虚拟化技术需要修改直接基于native运行的OS代码,以便和VMM更好的配合,其好处就是guest的运行性能可以接近物理机的性能。

【主流模型

当前主流的虚拟化技术的实现架构可分为三类:

1. Hypervisor模型

在hypervisor模型中,VMM是一个完备的操作系统,它除了具备传统操作系统的功能,还具备虚拟化功能。包括CPU、内存和I/O设备在内的所有物理资源都归VMM所有,因此VMM不仅要负责虚拟机环境的创建和管理,还承担着管理物理资源的责任。

这种方式是比较高效的,然而I/O设备种类繁多,管理所有设备就意味着大量的驱动开发工作。在实际的产品中,厂商会根据产品定位,有选择的支持一些I/O设备,而不是对所有的I/O设备都提供支持。

2. Host模型(宿主机)

在host模型中,物理资源由host OS管理,host OS是传统操作系统(比如Linux),这些传统操作系统并不是为虚拟化而设计的,因此本身并不具备虚拟化功能,实际的虚拟化功能由VMM来提供。

VMM作为host OS中一个独立的内核模块,通过调用host OS的服务来获得资源,实现CPU、内存和I/O设备的虚拟化。VMM创建出虚拟机之后,通常将虚拟机作为host OS的一个进程参与调度。

Host模型最大的优点就是可以充分利用现有操作系统的设备驱动程序,VMM不需要为各种I/O设备重新实现驱动,可以专注于物理资源的虚拟化;缺点在于,由于VMM是借助host OS的服务来操作硬件,而不是直接操作硬件,因此受限于host OS服务的支持,可能导致硬件利用的不充分。

从架构上看,由Qumranet公司开发的KVM(Kernel-based Virtual Machine)就是属于host模型的,kernel-based,顾名思义就是基于操作系统内核。KVM于2007年被集成到Linux内核2.6.20版本,并于2008年被Red Hat收购。

随着越来越多的虚拟化功能被加入到Linux内核当中,Linux已经越来越像一个hypervisor了,从这个角度看,KVM也可以算是hypervisor模型了。

3. 混合模型

在混合模型中,VMM依然位于最底层,拥有所有的物理资源,但为了利用现有操作系统的I/O设备驱动程序,VMM会将大部分的I/O设备交由一个运行在特权级别的虚拟机操作系统(Service OS)来处理,自己则主要负责CPU管理和内存管理。

混合模型可以说是结合了上述两种模型的优点,既不需要另外开发I/O设备驱动程序,又可以通过直接控制CPU和内存实现对这些物理资源的充分利用,以提高效率。

但它也是存在缺点的,当来自guest OS的I/O请求发送到VMM后,VMM需要将这些请求转发到service OS,这无疑增加了上下文的开销。混合模型的代表有Xen,Intel最近推出的Acrn,以及我国工程师写的minos。

上面介绍的这三种VMM实现模型和全虚拟化/类虚拟化的guest VM之间并没有直接的对应关系,比如Xen就既可以支持类虚拟化的guest VM,也可以支持全虚拟化的guest VM。

还有一种划分方法是将VMM分为基于bare-metal的type-1和基于OS的type-2,从这个角度划分的话,hypervisor模型和混合模型都是属于type-1的,host模型则是属于type-2的【1】。

下文将介绍这几种虚拟化技术在x86和ARM平台上的具体实现。

注【1】:这里区分两个名词 - hypervisor和VMM,hypervisor通常仅用于表达type-1的VMM,所以在接下来的《虚拟化技术》系列文章中,除非是仅讨论Xen/Acrn这种确定的type-1的虚拟化平台时,才会使用hypervisor一词,其他时候都统一称为VMM。

参考:

《系统虚拟化 - 原理与实现》

原文链接:https://zhuanlan.zhihu.com/p/69629212

(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂

更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,永久学习,或点击这里加qun免费
领取,关注我持续更新哦! !

虚拟化技术 - 概览 [一]相关推荐

  1. 虚拟化技术 — 硬件辅助的虚拟化技术

    目录 文章目录 目录 硬件辅助的虚拟化技术概览 CPU 虚拟化技术 基于二进制翻译的全虚拟化技术(Full-Virtualization) 需要改造 GuestOS 的半虚拟化技术(Para-Virt ...

  2. 英特尔虚拟化技术简史

    英特尔虚拟化技术简史 本文直接以时间线形式给出英特尔虚拟化技术总体的概览,具体的时间可能有些偏差,但已经大体可以反映出Intel在虚拟化上走过的历程和所做的努力. 术语说明 VT-x: Intel V ...

  3. G1D7-云计算与虚拟化技术pagerank算法作图GNN@LAB0Intriguing properties of neural networks算法美亚2021个人赛ATP论文@TT

    一.虚拟化技术与云计算 上数据挖掘课,觉得好玩,查一查 https://www.zhihu.com/question/22793847 二.pagerank算法 在做gnn的lab,复习一下~看一下a ...

  4. AWS开源Firecracker,一种运行多租户容器服务的新虚拟化技术

    现在的技术环境下,容器具有快速启动时间和高密度,VM可以对硬件虚拟化,具有更好的安全性,并对工作负载具有更好的隔离性.容器和VM的特性现在还不可兼得. 现在AWS开源了Firecracker,一种利用 ...

  5. docker容器虚拟化技术_Docker,虚拟机和容器的全面介绍

    docker容器虚拟化技术 by shota jolbordi 通过Shota Jolbordi Docker has been a buzzword for tech people for the ...

  6. 关于虚拟化技术软硬件兼容问题的探讨

    VMware十几年前就已经出现,个人最早使用VMware的时间似乎是2001年或者2002年,当时可以在个人电脑上通过VMware虚拟多套系统,用于学习研究(做实验往往会破坏系统,当时VMware在一 ...

  7. 围绕云计算 虚拟化技术又呈现新面貌

    本文讲的是围绕云计算 虚拟化技术又呈现新面貌,[IT168 资讯]虚拟化技术的三项基本使命-即作为客户端技术,作为服务器技术和作为网络技术,如今正在围绕云计算理念相结合在一起. 起源于X86服务器的虚 ...

  8. Linux操作系统及平台虚拟化技术漫谈

    虚拟化Linux可以通过很多技术来实现,包括从平台到操作系统虚拟化.实际上,Linux可以说是唯一一个具有广泛虚拟化解决方案的操作系统.在本文中,我们将讨论实现Linux虚拟化的多种方式,以及Linu ...

  9. 内核虚拟化技术——LXC初体验

    一.Cgroups 1.1 介绍 Cgroup是Control group的简称.最初由由Google的工程师(主要是Paul Menage和Rohit Seth)在2006年以"proce ...

最新文章

  1. Hinton 新作!越大的自监督模型,半监督学习需要的标签越少
  2. Windows Phone开发(48):不可或缺的本地数据库
  3. 洛谷——P1194 买礼物
  4. oracle 触发器 merge,[OT]函数|过程|触发器|插入(insert)|修改(Merge)
  5. 学成在线--15.课程计划查询
  6. linux 内网共享文件夹_局域网中实现linux文件共享
  7. opensource项目_最佳Opensource.com:开放的组织文化
  8. Docker的常规应用手册
  9. 【转】oracle in和exists、not in和not exists原理和性能探究
  10. 图像形状特征(六)--AR模型形状描述子
  11. 嵌入Windows User Control到ASP.NET web form
  12. 关闭网页html代码,网页中设置禁止查看源代码(保护源代码)
  13. BetaFlight深入传感设计之二:Mag传感模块
  14. plsql下载安装及基本使用
  15. 深度学习:Nvidia显卡驱动安装
  16. 一个程序员失败的爱情
  17. 不谋一时不足以谋一域_不谋万世者不足谋一时,不谋全局者不足谋一域是什么意思...
  18. win10 mail删除邮件服务器,win10系统删除Mail应用程序的方法
  19. 快应用联盟展示入口合集(11月更新)
  20. Win10_此电脑_多余项目设备和驱动器

热门文章

  1. 颜色特征怎么在kcf算法中得出高斯响应矩阵的代码_剖析KCF
  2. 版本管理-SVN分支,合并,切换
  3. matlab DSP6678,TI CC6678数字信号处理器 (DSP) 的50种用法
  4. aarch64-linux-gnu交叉编译器二进制方式安装
  5. 根域名服务器的一点理解
  6. 二分查找例题(二)洛谷P1163
  7. 吴恩达深度学习相关资源下载地址(蓝奏云)
  8. Old-school 老派 2016-10-01
  9. 谈谈snprintf
  10. 查询批量文件中关键数据方法--uedit32工具