本文分享自天翼云开发者社区《虚拟化技术 - CPU虚拟化》,作者:谢****悦

物理机器是由CPU,内存和I/O设备等一组资源构成的实体。虚拟机也一样,由虚拟CPU,虚拟内存和虚拟I/O设备等组成。VMM(VM Monitor)按照与传统OS并发执行用户进程的相似方式,仲裁对所有共享资源的访问。本文将分别讨论CPU虚拟化、内存虚拟化和I/O虚拟化技术的原理和实现。

在虚拟化的平台上,虚拟机(guest VM)所使用的多个虚拟CPU(以下称vCPU)可能是共享同一个物理CPU(以下称pCPU)的。VMM负责vCPU的调度,当一个vCPU被调度到获得pCPU的使用权后,基于该vCPU运行的guest OS又可以调度OS中的各个线程/进程了。也就是说,guest OS中的各个线程/进程分时复用了vCPU,而各个vCPU又分时复用了pCPU。

为了从硬件上提供对vCPU调度和切换的支持,Intel推出了被称为VT-x(Virtualization Technology for x86)的CPU虚拟化扩展技术,用户可通过VMXON/VMXOFF指令打开/关闭这个功能。和Intel亦敌亦友的AMD也推出了被称为AMD-V的对应技术。

在Linux中,从用户空间trap到内核空间可以通过system call或者interrupt/exception。以system call基于x86的实现为例,早期x86提供的trap方法是int 0x80这样的software interrupt机制,而后改成了SYSENTER/SYSEXIT的指令对,现在则已经被速度更快的SYSCALL/SYSRET取代了。

类似地,在VT-x中,从guest VM进入VMM(这个过程被称为VM exit)通常有三种方式:

  • 执行VMCALL指令,这种方式被称为hyper call,跟执行SYSCALL指令实现的system call原理差不多。
  • 发生了硬件中断或软件异常。
  • guest VM执行了一些敏感指令。有一些敏感指令并不会产生VM exit,比如SYSENTER;有一些敏感指令则可以根据下面将要介绍的VM executation control fields配置来选择是否产生VM exit。

进入VMM就意味着从non-root mode进入了root mode,反之,从VMM返回guest VM(这个过程被称为VM entry)则是重新回到了non-root mode,mode的切换意味着上下文(context)的保存和恢复。

上下文其实是个难以定义的概念,它是从CPU的角度引出的,简单地说,上下文就是程序(进程/中断)运行时所需要的寄存器的最小集合,这些寄存器的后面可能代表着程序运行的一类资源。

上下文切换是指程序从一种状态切换到另一种状态(比如从用户态切换到内核态),或者从一个程序切换到另一个程序(比如进程切换)时,导致上下文相关寄存器的值变化的行为。对于上下文切换时不需要改变的寄存器,也可以说它不是该程序的上下文。

VMCS

在Linux中,一个进程的相关信息保存在task_struct中。虚拟机的上下文比进程的上下文更为复杂,在VT-x中,由VMCS(Virtual-Machine Control data Structures)负责保存vCPU需要的相关状态和上下文信息。

VMCS在使用时需要和pCPU绑定。一个pCPU可以对应多个vCPU,而一个vCPU对应一个VMCS,但在任意给定时刻,一个pCPU上只能运行一个vCPU(就像在多线程调度中,某一时刻,一个CPU上只能运行一个线程一样)。

因此,一个pCPU只能绑定一个VMCS,一个VMCS也只能与一个pCPU绑定,可分别通过VMPTRLD/VMCLEAR指令建立/解除两者的绑定关系。VMCS存放在内存中,一个VMCS占据4KB大小,由6个区域组成:

  • Guest state area,用于保存CPU在non-root mode下运行时的状态。当发生VM exit的时候,CPU将自己当前的状态保存到guest state area中,当发生VM entry的时候,guest state area保存的状态将被自动加载到CPU中。

其实也不用一口气将所有寄存器的值都恢复,反正都是保存在VMCS中的,可以等到该寄存器真正被guest使用到时再恢复,这就是Lazy Save/Restore,其基本思想是尽量将寄存器的保存/恢复延迟到最后一刻,减少无用功,提高上下文切换的效率。这种思想在Linux的实现中也比比皆是,比如copy on write, demand paging等,拖延症也不见得是件坏事哈。

  • Host state area,用于保存CPU在root mode下运行时的状态。需要保存的寄存器和guest state area是差不多的,但是保存/恢复的过程是刚好反过来的。
  • VM executation control fields,用于控制non-root模式下CPU的行为。出于优化的目的,VMM可以让某些敏感指令不产生VM exit,以减少mode切换带来的上下文开销,而这就是由VM execution control来实现的。

比如读取timestamp的RDTSC指令,在一些延时函数的实现中,该指令会被频繁使用,如果每次guest执行该指令的时候都trap到VMM,那系统开销就太大了,这时VMM可以选择每隔一段时间读取物理CPU真实的 timestamp值,然后填写guest 的timestamp虚拟寄存器,来达到模拟RDTSC指令的效果。

  • VM exit control fields,用于规定VM exit时CPU的行为,比如是否应答外部中断。
  • VM exit information fields。VMM除了通过VM exit control fields来控制VM exit的行为,还需要知道VM exit的相关信息(比如trap的具体原因),这些信息就是保存在VM exit information fields中的。
  • VM entry control fields,用于控制VM entry的过程,比如后续的文章要介绍的中断注入。

VM executation control可理解为what to trap,就是哪些event会引起trap,哪些不会。VM exit control可理解为how to trap,VM exit information则可理解为why to trap。读写VMCS这段内存空间需要使用专门的VMREADVMWRITE指令。

小结一下,一个完整的VT-x使用流程是这样的:首先需要通过CPUID指令检查当前CPU是否支持虚拟化扩展。如果支持,则通过VMXON使能VT-x,建立VMCS并通过VMPTRLD绑定物理CPU。

虚拟化技术 - CPU虚拟化的更多相关文章

  1. 虚拟化技术实现 — KVM 的 CPU 虚拟化

    目录 文章目录 目录 前文列表 x86 体系结构的虚拟化 硬件辅助的 CPU 虚拟化 由 VMX 切换支撑的 CPU 虚拟化技术 KVM 的 CPU 虚拟化实现 vCPU 的调度方式 客户机 CPU ...

  2. 第六讲:CPU虚拟化

    虚拟化技术的分类主要有服务器虚拟化.存储虚拟化.网络虚拟化.应用虚拟化. 服务器虚拟化技术按照虚拟对象来分,可分为:CPU虚拟化.内存虚拟化.I/O虚拟化: 按照虚拟化程度可分为:全虚拟化.半虚拟化. ...

  3. KVM之CPU虚拟化

    1.1 为什么要虚拟化CPU 虚拟化技术是指在x86的系统中,一个或以上的客操作系统(Guest Operating System,简称:Guest OS)在一个主操作系统(Host Operatin ...

  4. 虚拟化技术实现 — QEMU-KVM

    目录 文章目录 目录 前文列表 KVM QEMU QEMU-KVM QEMU-KVM 调用 KVM 内核模块启动虚拟机的流程概要 前文列表 <虚拟化技术实现 - 虚拟化技术发展编年史> K ...

  5. CPU虚拟化的常见技术

    关键词:cpu虚拟化,KVM,Host-PassThrough,Nested,CGroup,NUMA,热添加 云计算虚拟化技术主要包括三个领域:计算.存储.网络 本文主要总结了计算虚拟化领域中的CPU ...

  6. CPU虚拟化技术(留坑)

    留坑~~~ 不知道这个是这么实现的 CPU虚拟化技术就是单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率.虚 ...

  7. 怎样知道 CPU 是否支持虚拟化技术(VT) | Linux 中国

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/F8qG7f9YD02Pe/article/details/79832475 wx_fmt=png&a ...

  8. CPU硬件辅助虚拟化技术

    目前主要有Intel的VT-x和AMD的AMD-V这两种技术.其核心思想都是通过引入新的指令和运行模式,使VMM和Guest OS分别运行在不同模式(ROOT模式和非ROOT模式)下,且Guest O ...

  9. CPU纯软件半虚拟化技术

    在2003年出现的Xen,使用了另外的一种半虚拟化的方案来解决x86架构下CPU的敏感指令问题.主要采用Hypercall技术.Guest OS的部分代码被改变,从而使Guest OS会将和特权指令相 ...

  10. CPU纯软件全虚拟化技术

    我们在前面的文章中提到了虚拟化技术的大致分类情况,即分为全虚拟化.半虚拟化和硬件辅助虚拟化3大类.而我们虚拟化技术最主要的虚拟主体就是我们的硬件CPU.内存和IO,那么我们的CPU在全虚拟化模式下如何 ...

随机推荐

  1. AOP实践:java.lang.instrument的使用

    背景 在 rcjp 项目中,需要调用 ASM API(用于字节码处理的开源库)对字节码进行处理,目标是实现对 Java 程序运行时各种对象的动态跟踪,并进一步分析各个对象之间的关系.在此之前,需要考虑 ...

  2. web移动端基础

    1.像素密度 PPI 说到屏幕就离不开2个因素,屏幕大小和屏幕分辨率. PPI是Pixels Per Inch缩写,pixels per inch所表示的是每英寸所拥有的像素(pixel)数目. PP ...

  3. Element Plus组件库el-table单元格内容超出时tooltip显示优化

    前情 公司有经常需要做一些后台管理页面,我们选择了Element Plus,它是基于 Vue 3,面向设计师和开发者的组件库,是Vue框架生态中比较火的UI组件库,组件库丰富易用,组件链接:一个 Vu ...

  4. QPushButton长度固定,不随文字变化

    QPushButton不随text长度变化 设置SizePolicy中的水平策略 没有设置为 忽略

  5. Redis应用—1.在用户数据里的应用

    大纲 1.社区电商的业务闭环 2.Redis缓存架构的典型生产问题 3.用户数据在读多写少场景下的缓存设计 4.热门用户数据的缓存自动延期机制 5.缓存惊群与穿透问题的解决方案 6.缓存和数据库双写不 ...

  6. manim边学边做--渐变生长

    本篇介绍Manim中的渐变生长类的动画. 这类动画的特点是可以清晰地展示图形的生成过程.物体的运动变化,帮助我们更好地理解抽象概念和复杂结构. 渐变生长类的动画的主要有: GrowArrow:让箭头从 ...

  7. 若依管理系统 -- 更换头像上传文件报错(/tmp/tomcat.8013579853364800617.8080/work/Tomcat/localhost/ROOT)

    一.错误情况 1.错误截图 二.错误解决情况 1.若依官方解答的链接 2.若依解答原文 1)原因: 在linux系统中,springboot应用服务再启动(java -jar 命令启动服务)的时候,会 ...

  8. Spring boot 2.0 之优雅停机

    spring boot 框架在生产环境使用的有一段时间了,它"约定大于配置"的特性,体现了优雅流畅的开发过程,它的部署启动方式(java -jar xxx.jar)也很优雅.但是我 ...

  9. 聊一聊 C#线程池 的线程动态注入 (下)

    一:背景 1. 讲故事 前面二篇我们聊到了 Thread.Sleep 和 Task.Result 场景下的线程注入逻辑,在线程饥饿的情况下注入速度都不是很理想,那怎么办呢?有没有更快的注入速度,这篇作 ...

  10. Qt编写可视化大屏电子看板系统15-曲线面积图

    一.前言 曲线面积图其实就是在曲线图上增加了颜色填充,单纯的曲线可能就只有线条以及数据点,面积图则需要从坐标轴的左下角和右下角联合曲线形成完整的封闭区域路径,然后对这个路径进行颜色填充,为了更美观的效 ...