Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >CPU 虚拟化

CPU 虚拟化

作者头像
Linux云计算网络
发布于 2018-01-11 03:16:24
发布于 2018-01-11 03:16:24
2.1K00
代码可运行
举报
文章被收录于专栏:Linux云计算网络Linux云计算网络
运行总次数:0
代码可运行

前面 虚拟化技术总览 中从虚拟平台 VMM 的角度,将虚拟化分为 Hypervisor 模型和宿主模型,如果根据虚拟的对象(资源类型)来划分,虚拟化又可以分为计算虚拟化、存储虚拟化和网络虚拟化,再细一些,又有中断虚拟化,内存虚拟化,字符/块设备虚拟化,网络功能虚拟化等。

我会将此作为一个系列来写,本文先看 CPU 虚拟化。在这之前,我们先来笼统看下虚拟化的本质是什么,它到底是如何做到将 Host 的硬件资源虚拟化给 Guest 用,我这里用两个词来定义,interceptvirtualize,中文翻译成截获模拟比较恰当一点,这两个词基本上是虚拟化的终极定义了,带着这两个词去看每一种虚拟化类型,会发现很容易理解和记忆。

CPU 软件虚拟化

基于软件的 CPU 虚拟化,故名思议,就是通过软件的形式来模拟每一条指令。通过前面的文章我们知道常用的软件虚拟化技术有两种:优先级压缩和二进制代码翻译。这两种是通用技术,可以用在所有虚拟化类型中。我们就结合 intercept 和 virtualize 来看看 CPU 软件虚拟化是怎么做的。

首先,一些必须的硬件知识要知道,X86 体系架构为了让上层的软件(操作系统、应用程序)能够访问硬件,提供了四个 CPU 特权级别,Ring 0 是最高级别,Ring 1 次之,Ring 2 更次之,Ring 3 是最低级别。

一般,操作系统由于要直接访问硬件和内存,因此它的代码需要运行在最高级别 Ring 0 上,而应用程序的代码运行在最低级别 Ring 3 上,如果要访问硬件和内存,比如设备访问,写文件等,就要执行相关的系统调用,CPU 的运行级别发生从 Ring 3 到 Ring 0 的切换,当完成之后,再切换回去,我们熟悉的用户态和内核态切换的本质就来自这里。

虚拟化的实现也是基于这个思想,VMM 本质上是个 Host OS,运行在 Ring 0 上,Guest OS 运行在 Ring 1 上,再往上是相应层次的应用程序运行在 Ring 2 和 Ring 3 上。

当 Guest OS 或上层应用在执行相关的特权指令时,就会发生越权访问,触发异常,这个时候 VMM 就截获(intercept)这个指令,然后模拟(virtualize)这个指令,返回给 Guest OS,让其以为自己的特权指令可以正常工作,继续运行。整个过程其实就是优先级压缩和二进制代码翻译的体现。

CPU 硬件虚拟化

上面的这种截获再模拟的纯软件的虚拟化方式,势必是性能非常低的。那怎么样提高性能呢,有一种改进的方式是修改 Guest OS 中关于特权指令的相关操作,将其改为一种函数调用的方式,让 VMM 直接执行,而不是截获和模拟,这样就能在一定程度上提高性能。

但这种方式并不通用,要去改 Guest OS 的代码,只能看作是一种定制。为了能够通用,又能够提高性能,就只能从硬件上去做文章了。所以,后来,以 Intel 的 VT-x 和 AMD 的 AMD-V 为主的硬件辅助的 CPU 虚拟化就被提出来(Intel VT 包括 VT-x (支持 CPU 虚拟化)、EPT(支持内存虚拟化)和 VT-d(支持 I/O 虚拟化))。

CPU 硬件辅助虚拟化在 Ring 模式的基础上引入了一种新的模式,叫 VMX 模式。它包括根操作模式(VMX Root Operation)和非根操作模式(VMX Non-Root Operation)。

这两种模式都有 Ring 0 - Ring 3 的特权级。所以,在描述某个应用程序时,除了描述其属于哪个特权级,还要指明其处于根模式还是非根模式。

引入这种模式的好处就在于,Guest OS 运行在 Ring 0 上,就意味着它的核心指令可以直接下达到硬件层去执行,而特权指令等敏感指令的执行则是由硬件辅助,直接切换到 VMM 执行,这是自动执行的,应用程序是感知不到的,性能自然就提高了。

这种切换 VT-x 定义了一套机制,称为 VM-entry 和 VM-exit。从非根模式切换到根模式,也就是从 Guest 切换到 Host VMM,称为 VM-exit,反之称为 VM-entry。

  • VM-exit : 如果 Guest OS 运行过程中遇到需要 VMM 处理的事件,比如中断或缺页异常,或者主动调用 VMCALL 指令调用 VMM 服务的时候(类似于系统调用),硬件自动挂起 Guest OS,切换到根模式,VMM 开始执行。
  • VM-entry: VMM 通过显示调用 VMLAUNCH 或 VMRESUME 指令切换到非根模式,硬件自动加载 Guest OS 的上下文,Guest OS 开始执行。

KVM CPU 虚拟化

KVM 是一种硬件辅助的虚拟化技术,支持 Intel VT-x 和 AMD-v 技术,怎么知道 CPU 是否支持 KVM 虚拟化呢?可以通过如下命令查看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# grep -E '(vmx|svm)' /proc/cpuinfo

如果输出是 vmx 或 svm,则表明当前 CPU 支持 KVM,Intel 是 vmx,AMD 是svm。

从本质上看,一个 KVM 虚拟机对应 Host 上的一个 qemu-kvm 进程,它和其他 Linux 进程一样被调度,而 qemu-kvm 进程中的一个线程就对应虚拟机的虚拟 CPU (vCPU),虚拟机中的任务线程就被 vCPU 所调度。

比如下面这个例子,Host 机有两个物理 CPU,上面起了两个虚拟机 VM1 和 VM2,VM1 有两个 vCPU,VM2 有 3 个 vCPU,VM1 和 VM2 分别有 2 个 和 3 个线程在 2 个物理 CPU 上调度。VM1 和 VM2 中又分别有 3 个任务线程在被 vCPU 调度。

所以,这里有两级的 CPU 调度,Guest OS 中的 vCPU 负责一级调度,Host VMM 负责另一级调度,即 vCPU 在物理 CPU 上的调度。

我们也可以看到,vCPU 的个数,可以超过物理 CPU 的个数,这个叫 CPU 「超配」,这正是 CPU 虚拟化的优势所在,这表明了虚拟机能够充分利用 Host 的 CPU 资源,进行相应的业务处理,运维人员也可以据此控制 CPU 资源使用,达到灵活调度。

OK,CPU 虚拟化就到这里,下篇文章将讲述内存虚拟化。觉得写得凑合可以给个赞,谢谢大家的支持。

云计算感兴趣的小伙伴可以关注我的微信公众号:aCloudDeveloper,专注云计算领域,坚持分享干货。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-12-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CPU硬件辅助虚拟化技术
目前主要有Intel的VT-x和AMD的AMD-V这两种技术。其核心思想都是通过引入新的指令和运行模式,使VMM(Virtual-machine monitor)和Guest OS分别运行在不同模式(ROOT模式和非ROOT模式)下,且Guest OS运行在Ring 0下。通常情况下,Guest OS的核心指令可以直接下达到计算机系统硬件执行,而不需要经过VMM。当Guest OS执行到特殊指令的时候,系统会切换到VMM,让VMM来处理特殊指令。 1、Intel VT-x技术
孙杰
2019/10/29
3.7K0
CPU硬件辅助虚拟化技术
【重识云原生】计算第2.4节——主流虚拟化技术之KVM
KVM:Kernel-based Virtual Machine,是基于Linux内核的开源虚拟化解决方案,从2.6.20版本开始被合入kernel主分支维护。最初只支持X86平台的上支持VMX或者SVM的CPU,不久后被确认为标准Linux内核的虚拟化方案并逐步支持S390、IA64和PowerPC等体系架构;KVM本身只提供部分的虚拟化功能(虚拟CPU和内存),而由经过特殊改造后的Qemu(Qemu-kvm)来帮助下提供完整的平台虚拟化功能。
江中散人_Jun
2022/04/08
3K0
【重识云原生】计算第2.4节——主流虚拟化技术之KVM
KVM之CPU虚拟化
虚拟化技术是指在x86的系统中,一个或以上的客操作系统(Guest Operating System,简称:Guest OS)在一个主操作系统(Host Operating System,简称:Host OS)下运行的一种技术。这种技术只要求对客操作系统有很少的修改或甚至根本没有修改。x86处理器架构起先并不满足波佩克与戈德堡虚拟化需求(Popek and Goldberg virtualization requirements),这使得在x86处理器下对普通虚拟机的操作变得十分复杂。在2005年与2006年,英特尔与AMD分别在它们的x86架构上解决了这个问题以及其他的虚拟化困难。
惨绿少年
2018/12/28
3.1K0
Intel 虚拟化技术(Intel® VT):CPU 虚拟化与内存虚拟化
目前主要的 CPU 虚拟化技术是 Intel 的 VT-x/VT-i 和 AMD 的 AMD-V 这两种技术。
Flowlet
2023/08/11
3.7K0
Intel 虚拟化技术(Intel® VT):CPU 虚拟化与内存虚拟化
也谈Intel的cpu虚拟化
讲到intel的cpu虚拟化,就不得不提到vt-x。vt-x是intel的CPU硬件虚拟化技术,但是在操作系统内部查看cpu的flag时,是否支持硬件虚拟化的的判断标准是是否有vmx,vmx是什么,它和虚拟化有什么关系,本文将会涉及到。
虚拟化云计算
2018/04/08
2.7K0
也谈Intel的cpu虚拟化
虚拟化技术概述(一)1. 虚拟化概述2. 虚拟化分类3. 虚拟化的实现
区别与直接调度片上资源/使用物理平台,使用虚拟化技术对于资源的调度会更加灵活和高效,而且可以达到硬隔离的目的;
战神伽罗
2021/01/06
15.9K0
qemu-kvm中vcpu虚拟化到底是咋整的?
一句话总结 实例化一个vcpu就是在hostOS中创建了一个线程,线程里有个while循环,循环里不停的调用kvm_cpu_exec方法,kvm_cpu_exec方法调用通过kvm_vcpu_ioctl(cpu, KVM_RUN, 0)使得kvm切换为no-root模式。在no-root模式下处理特权指令的时候,会退回root模式,然后一步步返回到kvm_cpu_exec中根据不同原因,处理返回异常。 如此一个轮回结束,周而复始,vcpu。 再补充说一点,内存中申请一块内存,根模式和非根模式切换的时候,
腾讯云TStack
2018/03/22
5.1K0
qemu-kvm中vcpu虚拟化到底是咋整的?
虚拟化技术发展编年史
我已经想不起来是从什么时候开始的,突然就对计算机历史产生了浓厚的兴趣。于是我想着,要不以后所有系列文章的开篇都先和大家聊聊历史吧。其实说来挺有意思,看过去到底是为了看未来,因为历史总是惊人的相似,几乎所有的问题都能够在历史长河中寻得答案。可惜的是,但凡历史,最是难写,笔者碍于能力有限,还望大家多指点一二。
SammyLiu
2019/09/02
6.5K0
虚拟化技术发展编年史
KVM最初的2小时——KVM从入门到放弃
那些不能铭记过去的人注定要重蹈覆辙。你还记得当年用Windows隐藏文件夹藏片吗? 作为一个屌丝,虚拟化技术确实意义非常重大。这个最显著的作用显然就是藏片,作为一个程序员,如果还用Windows文件隐藏功能来藏片,这实在是污辱自己和女朋友的智商,让广大码农抬不起头来做人。最早可以帮你实质藏片的手段来自VMware。 VMware这个名字就是一种牛逼,VM就是virtual machine,ware是取自Software中的ware,1999年VMware发布了它的第一款产品VMware Workstation,在那个赛扬333和白衣飘飘的时代。
Linux阅码场
2019/09/30
1.2K0
KVM最初的2小时——KVM从入门到放弃
容器技术创新漫谈
Kubernetes在2017年赢得了容器编排之战,使得基于容器+Kubernetes来构建PaaS平台成为了云计算的主流方式。在人们把关注的目光都聚焦在Kubernetes上时,容器技术领域在2018年也发生了很多创新,包括amazon最近开源的轻量级虚拟机管理器 Firecracker,Google在今年5月份开源的基于用户态操作系统内核的 gVisor 容器,还有更早开源的虚拟化容器项目 KataContainers,可谓百花齐放。一般的开发者可能认为容器就等于Docker,没想到容器领域还在发生着这么多创新。我在了解这些项目时,发现如果没有一些背景知识,很难get到它们的创新点。我试着通过这篇文章进行一次背景知识的梳理。让我们先从最基本的问题开始:操作系统是怎么工作的?
mazhen
2023/11/24
3960
容器技术创新漫谈
x86 kvm和qemu虚拟化介绍
简单说一下自己对x86平台虚拟化的理解,intel有SDM手册,代码都是公开的,难度比较大,理解起来困难,网上有大量优秀博客讲解虚拟化,引用了大量手册和代码,还是很难看懂。个人觉得理解虚拟化不能一上来就看很详细的手册和代码,虚拟化有点绕,先闭上眼睛想想大的道理,掌握了大的道理,再看手册和代码加深理解,否则很容易迷失,对虚拟化的理解只流于表面。
惠伟
2021/02/24
1.1K0
x86 kvm和qemu虚拟化介绍
虚拟化技术总览
虚拟化本质上是软/硬件层的抽象 说起虚拟化,相信大家应该都不陌生,像虚拟内存、Java 虚拟机、Android 模拟器这些都是虚拟化技术的体现,为什么这样说,这个就要回到虚拟化技术的本质上——虚拟化就
Linux云计算网络
2018/01/11
2.1K0
虚拟化技术总览
Xen的敏感指令陷入-《Xen虚拟化技术》学习
没有虚拟化基础的童鞋可先阅读Linux阅码场前几天刊发的《KVM最初的2小时——KVM从入门到放弃(修订版) 》入门。
Linux阅码场
2019/10/08
1.6K0
Xen的敏感指令陷入-《Xen虚拟化技术》学习
内存虚拟化到底是咋整的?
1. 一句话总结 内存虚拟化解决虚拟机里面的进程如何访问物理机上的内存这一问题。 GuestOS本身有虚拟地址空间,用GVA表示。虚拟机认为自己独占整个内存空间,用GPA表示。 HostOS本身有虚拟机地址空间,用HVA表示。宿主机本身有物理内存空间,用HPA表示。 好,内存虚拟化的问题变成了GVA->HPA的映射问题。 GVA->GPA通过GuestOS页表映射。HVA->HPA通过HostOS页表映射。因此,只要建立GPA->HVA的映射关系,即可解决内存虚拟化的问题。但,这样三段逐次映射,效率低下
腾讯云TStack
2018/05/30
3.9K0
内存虚拟化
虚拟内存 我们知道,早期的计算机内存,只有物理内存,而且空间是极其有限的,每个应用或进程在使用内存时都得小心翼翼,不能覆盖别的进程的内存区。 为了避免这些问题,就提出了虚拟内存的概念,其抽象了物理内存,相当于对物理内存进行了虚拟化,保证每个进程都被赋予一块连续的,超大的(根据系统结构来定,32 位系统寻址空间为 2^32,64 位系统为 2^64)虚拟内存空间,进程可以毫无顾忌地使用内存,不用担心申请内存会和别的进程冲突,因为底层有机制帮忙处理这种冲突,能够将虚拟地址根据一个页表映射成相应的物理地址。 这种
Linux云计算网络
2018/01/11
1.8K0
内存虚拟化
虚拟化与云计算硬核技术内幕 (6) —— 妇女能顶半边天
在上一期《将特权关进笼子》中,我们提到,由于操作系统内核具有访问所有软硬件资源的特权,为了避免特权被滥用,工程师们将虚拟机上的操作系统关进了ring1的笼子,不允许它在ring0中为所欲为。但是,为了执行一些完成系统功能所必须的特权指令,系统会付出较高的性能代价。
用户8289326
2022/09/08
4380
虚拟化与云计算硬核技术内幕 (6) —— 妇女能顶半边天
KVM详解,学习kvm系列文章
其中,KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是一个 Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor:
菲宇
2019/06/12
9.4K1
KVM详解,学习kvm系列文章
虚拟化与云计算技术硬核内幕 (20) —— 时间管理大师(下)
在上期,小E理解了什么是“时间管理大师”。实际上,这种将物理硬件分配给多个使用者的技术,叫做“时分复用”。计算机操作系统的任务调度模块,实质上提供的就是将CPU以“时分复用”的方式给不同任务使用的机制。
用户8289326
2022/09/08
1.1K0
虚拟化与云计算技术硬核内幕 (20) —— 时间管理大师(下)
虚拟化与云计算硬核技术内幕 (5) —— 把特权关进笼子
在上期,德国哲学家马克斯韦伯指出,通过在大型分布式计算系统中,引入中间管理层Hypervisor,并将CPU的内核视为计算资源,进行资源池化,建设科层制的分布式计算,是解决海量处理器并发计算问题的唯一可行的方法。在Hypervisor之下,每台虚拟机内部也有一个中间管理层Guest OS,管理虚拟机内部的计算、存储和网络资源,调度虚拟机内的计算任务,如下图所示:
用户8289326
2022/09/08
6900
虚拟化与云计算硬核技术内幕 (5) —— 把特权关进笼子
归档 | ICT 竞赛 陪跑 笔记
(在加上口罩原因 弄的很自闭,这些天玩游戏倒是玩的不少….现在也是到家了 接下来一段时间好好提升自己技术才对!
Zkeq
2022/12/01
6470
相关推荐
CPU硬件辅助虚拟化技术
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档