首页 > 其他分享 >虚拟化技术 - CPU虚拟化

虚拟化技术 - CPU虚拟化

时间:2023-05-19 16:22:06浏览次数:52  
标签:guest 虚拟化 vCPU VM 技术 exit CPU

本文分享自天翼云开发者社区《虚拟化技术 - 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。

标签:guest,虚拟化,vCPU,VM,技术,exit,CPU
From: https://www.cnblogs.com/developer-tianyiyun/p/17415531.html

相关文章

  • 如何进行测试分析与设计-HTSM启发式测试策略模型 | 京东云技术团队
    测试,没有分析与设计就失去了灵魂;测试人员在编写用例之前,该如何进行测试分析与设计呢?上次在《测试的底层逻辑》中讲到了【输入输出测试模型】,还讲到了【2W+1H测试分析法】,但2W1H分析法是初步的分析方法,具体在测试中如何落地,还需要更细的设计。今天就给大家介绍一下由测试领域专家......
  • 分布式系统关键技术:流量与数据调度
    1、流量调度与服务治理的关系服务治理时内部系统的事,流量调度可以是内部的,更是外部接入层的事。服务治理时数据中心的事,而流量调度要做的好,应该是数据中心之外的事,也就是我们常说的边缘计算或者CDN。 2、流量调度的主要功能和关键技术流量调度系统应该主要具备的功能:依据系......
  • 北京.NET线下技术沙龙倒计时一天
    时间:2023年5月20日13:30-18:00地点:北京市海淀区中关村大街32号蓝天科技综合楼一层(中关村智能制造创新中心)(距海淀黄庄地铁站100米)【地下停车场可停车】.NET技术沙龙活动与你不见不散点击链接参加活动:http://hdxu.cn/SUglm活动详情......
  • (转载)阿里蚂蚁2022GBA背后的测试技术发展
    阿里蚂蚁2022GBA背后的测试技术发展[编者注:这篇文章很长(8998个字),但作者用心良苦,基于44个GBABug的分析,几乎让我们获得了软件测试工程师一生职业生涯中所需的经验、找Bug所需的技能,值得慢慢阅读和体会,然后记录下对自己有用的要点。]前言这个文章也是欠了大半年了,现在想要出来还......
  • 技术同学如何快速熟悉业务
    昨天星球里有同学问了一个问题:刚进入一个复杂的项目里,有什么梳理业务的技巧,能让人快速熟悉业务上手项目。星球里其他同学给出了很多建议,比如:画业务流程图;找有经验的人讲解;先从小模块做起来再说;熟悉系统架构和功能模块;从我的角度来说,这些建议都是基于自身的经验从某些角度......
  • Android 代码混淆proguard技术介绍
    由于各种反编译工具的泛滥,作为Android程序员在2.3版本以前只能通过手动添加proguard来实现代码混淆proguard这个工具是一个java代码混淆的工具在2.3版本的sdk中我们可以看到在android-sdk-windows/tools/下面多了一个proguard文件夹google已经把proguard......
  • 百度搜索首届技术创新挑战赛 丰厚奖励等你拿!
    大赛简介百度搜索技术创新挑战赛(简称STI)是由百度搜索发起,联合四大区域高校、学会共同举办的一项全国性科技竞赛。本次大赛以“新智能·新搜索”为主题,围绕人工智能、检索技术,为参赛团队提供海量百度搜索脱敏业务数据进行训练及测试。本次大赛面向全国企业、高校、科研机构、项目团......
  • 【JMM内存模型-4】JMM内存模型之CPU缓存策略-jmmcpu4
    title:【JMM内存模型-4】JMM内存模型之CPU缓存策略date:2021-11-1713:27:48.139updated:2021-12-2617:43:10.442url:https://www.yby6.com/archives/jmmcpu4categories:-并发编程-JMM内存模型tags:-并发编程CPU缓存策略原理缓存概述CPU为了提升执行效率,减少C......
  • 为什么 GPU 更适用于时域算法,而 CPU 更适用于频域算法?
    对于懂电脑的人来讲,他们可以简单地区分出电脑的GPU和CPU的应用范畴及其优势,而今天我们要讨论的问题是“为什么GPU更适用于时域算法,而CPU更适用于频域算法?”在讨论这个问题之前,我先带大家来了解一下计算中GPU与CPU架构的区别及并行的处理方式。 1.CPU与GPU架构的......
  • 数据库的恢复技术
    存储器结构分类1、易失性存储器:内存、高速缓冲存储器2、非易失性存储器:磁盘、磁带3、稳定存储器:理想的存储器,其中信息永不丢失稳定存储器的实现要实现稳定存储器,就要在多个非易失性存储介质上以独立的故障模式复制所需要的信息,并且以某种受控的方式更新数据,以保证数据传送的......