1. 简介

当前的主流虚拟化实现技术分为两种:
VMM(虚拟化监控器)运行在硬件平台上,控制所有硬件并管理guest os。guest os运行在比VMM更高的级别。例如xen。
VMM运行在宿主操作系统上,宿主操作系统作为第一软件层,VMM作为第二软件层,guest os作为第三软件层。例如kvm和virtual box。

kvm

KVM是集成到Linux内核的Hypervisor,是X86架构且硬件支持虚拟化技术(Intel VT或AMD-V)的Linux的全虚拟化解决方案。它是Linux的一个很小的模块,利用Linux做大量的事,如任务调度、内存管理与硬件设备交互等。

xen

Xen是第一类运行在裸机上的虚拟化管理程序(Hypervisor)。它支持全虚拟化和准虚拟化,Xen支持hypervisor和虚拟机互相通讯,而且提供在所有Linux版本上的免费产品,包括Red Hat Enterprise Linux和SUSE Linux Enterprise Server。
Xen最重要的优势在于准虚拟化,此外未经修改的操作系统也可以直接在Xen上运行(如Windows),能让虚拟机有效运行而不需要仿真,因此虚拟机能感知到Hypervisor,而不需要模拟虚拟硬件,从而能实现高性能。

2. kvm模块

KVM是一个基于宿主操作系统的虚拟机。在这里,我们再一次看到了实用至上的Linux设计哲学。主要部分是一个内核模块,其他的部分则尽可能充分利用Linux内核的既有实现,最大限度地重用代码。
KVM本身不执行任何设备模拟,需要用户空间程序QEMU通过/dev/kvm接口设置一个虚拟客户机的地址空间,向它提供模拟的I/O设备,并将它的视频显示映射回宿主机的显示屏。
KVM模块是KVM虚拟机的核心部分。其主要功能是初始化CPU硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚拟客户机的运行提供一定的支持。

初始化CPU硬件

为了软件的简洁和性能,KVM仅支持硬件虚拟化。自然而然,打开并初始化系统硬件以支持虚拟机的运行,是KVM模块的职责所在。
以KVM在Intel公司的CPU上运行为例。

  1. 在被内核加载的时候,KVM模块会先初始化内部的数据结构;
  2. 做好准备之后,KVM模块检测系统当前的CPU,然后打开CPU控制寄存器CR4中的虚拟化模式开关,并通过执行VMXON指令将宿主操作系统(包括KVM模块本身)置于虚拟化模式中的根模式;
  3. 最后,KVM模块创建特殊设备文件/dev/kvm并等待来自用户空间的命令。接下来虚拟机的创建和运行将是一个用户空间的应用程序(QEMU)和KVM模块相互配合的过程。

KVM与QEMU通信

KVM模块与用户空间QEMU的通信接口主要是一系列针对特殊设备文件的IOCTL调用。
如上所述,KVM模块加载之初,只存在/dev/kvm文件,而针对该文件的最重要的IOCTL调用就是“创建虚拟机”。在这里,“创建虚拟机”可以理解成KVM为了某个特定的虚拟客户机(用户空间程序创建并初始化)创建对应的内核数据结构。
同时,KVM还会返回一个文件句柄来代表所创建的虚拟机。针对该文件句柄的IOCTL调用可以对虚拟机做相应的管理,比如创建用户空间虚拟地址和客户机物理地址及真实内存物理地址的映射关系,再比如创建多个可供运行的虚拟处理器(vCPU)。
同样,KVM模块会为每一个创建出来的虚拟处理器生成对应的文件句柄,对虚拟处理器相应的文件句柄进行相应的IOCTL调用,就可以对虚拟处理器进行管理。

CPU虚拟化

针对虚拟处理器的最重要的IOCTL调用就是“执行虚拟处理器”。
通过它,用户空间准备好的虚拟机在KVM模块的支持下,被置于虚拟化模式中的非根模式下,开始执行二进制指令。
在非根模式下,所有敏感的二进制指令都会被处理器捕捉到,处理器在保存现场之后自动切换到根模式,由KVM决定如何进一步处理(要么由KVM模块直接处理,要么返回用户空间交由用户空间程序处理)。

内存虚拟化

除了处理器的虚拟化,内存虚拟化也是由KVM模块实现的。
实际上,内存虚拟化往往是一个虚拟机实现中代码量最大、实现最复杂的部分(至少,在硬件支持二维地址翻译之前是这样的)。
众所周知,处理器中的内存管理单元(MMU)是通过页表的形式将程序运行的虚拟地址转换成为物理内存地址。在虚拟机模式下,内存管理单元的页表则必须在一次查询的时候完成两次地址转换。这是因为,除了要将客户机程序的虚拟地址转换成为客户机物理地址以外,还必须将客户机物理地址转换成为真实物理地址。
KVM模块开始使用了影子页表的技术来解决这个问题:在客户机运行时候,处理器真正使用的页表并不是客户机操作系统维护的页表,而是KVM模块根据这个页表维护的另外一套影子页表。影子页表的机制比较复杂,感兴趣的读者可以自行翻阅相关材料,这里不再展开详述。
影子页表实现复杂,而且有时候开销很大。为了解决这个问题,新的处理器在硬件上做了增强(Intel的EPT技术)。通过引入第二级页表来描述客户机虚拟地址和真实物理地址的转换,硬件可以自动进行两级转换生成正确的内存访问地址。KVM模块将其称为二维分页机制。

设备虚拟化

处理器对设备的访问主要是通过IO指令和MMIO,其中IO指令会被处理器直接截获,MMIO会通过配置内存虚拟化来捕捉。
但是,外设的模拟一般并不由KVM模块负责。一般来说,只有对性能要求比较高的虚拟设备才会由KVM内核模块来直接负责,比如虚拟中断控制器和虚拟时钟,这样可以大量减少处理器的模式切换的开销。
大部分的输入输出设备还是会交给用户态程序QEMU来负责。

3. QEMU

QEMU本身并不是KVM的一部分,其自身就是一个著名的开源虚拟机软件。与KVM不同,QEMU虚拟机是一个纯软件的实现,所以性能低下。但是,其优点是在支持QEMU本身编译运行的平台上就可以实现虚拟机的功能,甚至虚拟机可以与宿主机并不是同一个架构。
作为一个存在已久的虚拟机,QEMU的代码中有整套的虚拟机实现,包括处理器虚拟化、内存虚拟化,以及KVM使用到的虚拟设备模拟(比如网卡、显卡、存储控制器和硬盘等)。

KVM对QEMU的利用

为了简化开发和代码重用,KVM在QEMU的基础上进行了修改。
虚拟机运行期间,QEMU会通过KVM模块提供的系统调用进入内核,由KVM 模块负责将虚拟机置于处理器的特殊模式运行。
遇到虚拟机进行输入输出操作,KVM模块会从上次的系统调用出口处返回QEMU,由QEMU来负责解析和模拟这些设备。

QEMU对KVM的利用

从QEMU角度来看,也可以说QEMU使用了KVM模块的虚拟化功能,为自己的虚拟机提供硬件虚拟化的加速,从而极大地提高了虚拟机的性能。除此之外,虚拟机的配置和创建,虚拟机运行依赖的虚拟设备,虚拟机运行时的用户操作环境和交互,以及一些针对虚拟机的特殊技术(诸如动态迁移),都是由QEMU自己实现的。

QEMU和KVM的结合

从QEMU和KVM模块之间的关系可以看出,这是典型的开源社区在代码共用和开发项目共用上面的合作。诚然,QEMU可以选择其他的虚拟机或技术来加速,比如Xen或者KQEMU;KVM也可以选择其他的用户空间程序作为虚拟机实现,只要它按照KVM提供的API来设计。但是在现实中,QEMU与KVM两者的结合是最成熟的选择,这对一个新开发和后起的项目(KVM)来说,无疑多了一份未来成功的保障。

4. Intel虚拟化技术


Intel虚拟化技术其实可以大致分为三类:
第一类是处理器相关的,称为VT-x,是实现处理器虚拟化的硬件扩展,这也是硬件虚拟化的基础;
第二类是芯片组相关的,成为VT-d,是从芯片组的层面为虚拟化提供必要支持,通过它,可以实现诸如直接分配物理设备给客户机的功能;
第三类是输入输出设备相关的,主要目的是通过定义新的输入输出协议,使新一代的输入输出设备可以更好地支持虚拟化环境下的工作,比如Intel网卡自有的VMDq技术和PCI组织定义的单根设备虚拟化协议(SR-IOV)。

硬件虚拟化技术发展到今天,已经从最初的处理器虚拟化扩展变成了各种先进技术的集合。而且,Intel公司还在继续为这个集合添加新的成员。同时Intel公司的软件开发工程师也一直活跃在开源虚拟机社区,为KVM即时添加最新的硬件支持。

参考《KVM虚拟化技术:实战与原理解析 》

kvm架构详解--理解CPU、内存、IO虚拟化技术、处理器硬件支持相关推荐

  1. 华为scp快充协议详解_华为SCP快充技术曝光:支持“电荷泵”技术,最高可达20W...

    随着时间的发展,市面上的快充技术日渐增多,当前主流的技术除了高通的QC标准快充.通用的PD标准快充外,华为的FCP.SCP快充技术也是主流方案之一. 华为FCP快充技术于2015年首次公开,当时支持的 ...

  2. 内存详解-理解 JVM 如何使用 Windows 和 Linux 上的本机内存

    内存详解 理解 JVM 如何使用 Windows 和 Linux 上的本机内存 Java™ 堆耗尽并不是造成 java.lang.OutOfMemoryError 的惟一原因.如果本机内存 耗尽,则会 ...

  3. 高并发高流量网站架构详解

    (推荐)高并发高流量网站架构详解 Web2.0的兴起,掀起了互联网新一轮的网络创业大潮.以用户为导 向的新网站建设概念,细分了网站功能和用户群,不仅成功的造就了一大批新生的网站,也极大的方便了上网的人 ...

  4. DL之SegNet:SegNet图像分割/语义分割算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略

    DL之SegNet:SegNet图像分割/语义分割算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 导读 基于CNN的神经网络SegNet算法可进行高精度地识别行驶环境. 目录 SegN ...

  5. java调用webservice_笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解...

    原标题:笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解 Java开发网站架构演变过程,到目前为止,大致分为5个阶段,分别为单体架构.集群架构.分布式架构.SOA架构和微服务架构.下 ...

  6. 揭开面纱:Kubernetes架构详解

    [编者的话] 本文介绍了Kubernetes中的主要组件和各个组件的工作模式. 入门导论:Kubernetes组件和组件之间如何协同工作 本文讲的是揭开面纱:Kubernetes架构详解如果你正在实现 ...

  7. 为什么写《大数据架构详解》这本书

    花了差不多一年半时间,牺牲了每个周末,费了九牛二虎之力,终于完成个人人生的第一本书<大数据架构详解:从数据获取到深度学习>.整个过程其实挺痛苦的,时常想放弃,幸好坚持下来了. 回想这我50 ...

  8. 【5GC】开源5G核心网(Open5GS)架构详解

    博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G ...

  9. 【CTO讲堂】SaaS云端语音通信架构详解

    为了帮助IT从业者职业之路拥有更多收获,在诸多C粉的殷切期待下,由 CTO俱乐部打造的CTO线上讲堂自登场以来获得大家好评.本期邀请容联七陌CTO张杨带来"SaaS云端语音通信架构详解&qu ...

最新文章

  1. mysql的复合类型_PLSQL 复合类型数据
  2. 11 ORA系列:ORA-01791: 不是 SELECTed 表达式(distinct使用注意点)
  3. 用boost.signal实现多播委托
  4. django之快速分页
  5. 决胜蓝桥杯python组-集合、字典
  6. 视觉SLAM十四讲学习笔记-第二讲-开发环境搭建
  7. spring boot中的注解
  8. Dotfuscator Professional Edition 4.1
  9. linux进程管理概念,Linux教程之进程的概念和进程管理命令的使用
  10. 黑客入侵Windows XP的几个常用方法
  11. cad被管理员阻止_CAD注册机无法以管理员身份输入的解决方案
  12. Java实现第九届蓝桥杯分数
  13. SHU OJ 420 购买装备(假装背包,其实贪心)
  14. Hibernate实践JBX+MY SQL4.0
  15. 每日新闻:麦肯锡:未来10年 人工智能为全球GDP贡献1.2%增长;工信部下发第19批CDN、云服务牌照...
  16. 计算机输入法切换用户,输入法切换不出来电脑输入法不见了的最佳解决方案
  17. 上架CiscoWS-C4948E设备及升级IOS
  18. js中判断两个对象是否相等。
  19. MAC必装软件之HomeBrew、HomeBrew-Cask
  20. 从万物静默到声情并茂:百度输入法的AI发声计划

热门文章

  1. devexpress 创建窗口句柄时出错_实验一 线程的创建和撤销
  2. 蓝牙GFSK基带调制解调
  3. combox 增加请选择_好消息!阜阳机动车互联网选号增加新号段!
  4. 绘制三维散点图_使用Origin,轻松绘制三维散点图
  5. java map 更新_更新Map键的值java
  6. 鸿蒙HI3516-HAP的编译打包和安装
  7. 喵喵的华为DevCloud使用指南(2)-看板项目
  8. Vmware fusion强制断电,关闭虚拟机
  9. Python使一列数据总和为1
  10. dataframe根据时间戳timestamp切分成多个dataframe