虚拟机虚拟化原理

目录

    • 什么是虚拟化
      • 广义虚拟化
      • 狭义虚拟化
    • 虚拟化指令集
      • 敏感指令集
      • 虚拟化指令集的工作模式
        • 监视器对敏感指令的处理过程:
    • 虚拟化类型
      • 全虚拟化
      • 类虚拟化
      • 硬件辅助虚拟化
    • 虚拟化架构
      • 裸金属架构
      • 宿主机模式架构

什么是虚拟化

虚拟化就是通过模仿下层原有的功能模块创造接口来“欺骗”上层的机制。虚拟化可以通过资源管理技术,将物理存在的实体资源以虚拟机(Virtual Machine,VM)的形式抽象成一种逻辑表示。通常的做法是在整个系统架构中增加一个抽象层,负责分割下层的物理资源,然后组合成逻辑资源供上层使用。

广义虚拟化

请添加图片描述

狭义虚拟化

狭义虚拟化特指操作系统虚拟化,它使用虚拟化技术在一台物理机上模拟出多台虚拟机,每台虚拟机都拥有独立的资源(计算资源、存储资源、网络资源)。

虚拟化的具体实现是通过在操作系统与硬件之间加入一个虚拟化层,并通过空间上的分割、时间上的分时及仿真模拟,将服务器物理资源抽象成逻辑资源。虚拟化层可以将单个CPU模拟为多个CPU,并且这些CPU之间相互独立、互不影响,也就是虚拟化层实现了计算单元的模拟及隔离。它向上层操作系统提供与原先物理服务器一致的环境,使得上层操作系统可以直接运行在虚拟环境中,并允许具有不同操作系统的多台虚拟机相互隔离,并发地运行在同一台物理服务器上,这台物理服务器被称为“宿主机”。虚拟化层模拟出来的主要逻辑功能为虚拟机,在虚拟机中运行的操作系统被称为“GuestOS”。

虚拟化场景包括三个部分:硬件资源、虚拟机监视器(VMM)和虚拟机(VM)。系统虚拟化可以将一台物理机(Host)虚拟化为多台虚拟机,并通过虚拟化层(即虚拟机监视器)使每台虚拟机都拥有自己的虚拟硬件,并拥有一个独立的虚拟机运行环境,进而拥有一个独立运行的操作系统。
请添加图片描述

虚拟化指令集

虚拟化指令集指的是将某个硬件平台的二进制代码转换为另一个平台的二进制代码,从而实现不同硬件指令集之间的兼容。这种技术也被形象地称为“二进制翻译”。

敏感指令集

敏感指令(Sensitive Instruction):在虚拟化场景下,在GuestOS的内核中有一部分非特权指令,它们不一定会改变或者损害整个系统,但是会影响基于虚拟化的整个系统的安全。

敏感指令是操作特权资源的指令,包括修改虚拟机的运行模式,改变宿主机的状态,读/写时钟、中断等寄存器,访问存储保护系统、地址重定位系统及所有的I/O指令。

例如,GuestOS的内核指令可以读取宿主机CPU的寄存器内容,从而看到整个系统的状态,这样一台虚拟机就可以看到另一台虚拟机的内部信息了。在虚拟化场景下,所有会危害到系统安全的指令集被称为“敏感指令集”。

虚拟化指令集的工作模式

Popek&Goldberg 原理定义了如何设计一个有效的虚拟机监视器。

等价性:任何一个程序,在被管理程序控制时,除时序和资源可用性之外,应该与没有被管理程序控制时是一样的,而且预置的特权指令可以自由执行。

管理程序通常指的是虚拟机监视器,也称为hypervisor。虚拟机监视器是一种软件,它允许多个操作系统在同一台物理计算机上运行,并且对它们进行管理和监视。虚拟机监视器负责分配计算机的资源,如处理器时间、内存和输入/输出设备,以便多个操作系统之间可以共享这些资源。

时序指的是程序执行的时间顺序和时序关系,包括程序的指令执行顺序、时钟周期、中断处理等。在虚拟机监视器中,被管理程序受到虚拟机监视器的控制,因此其时序可能会受到影响。

资源可用性指的是系统中各种资源的可用性,包括CPU、内存、磁盘、网络等。在虚拟机监视器中,被管理程序的资源使用受到虚拟机监视器的限制和调度,因此其资源可用性也可能会受到影响。

资源控制:一个程序发出的任何调用系统资源的动作在被执行时,都应先调用控制程序(虚拟机监视器)。

效率性:一个程序产生的所有无害指令都应该由硬件直接执行,控制程序不应该在任何地方产生中断。

Popek和Goldberg虚拟化原理是一种计算机虚拟化技术的基本原理。该原理由Gerald J. Popek和Robert P. Goldberg于1974年提出。该原理规定了一个处理器架构必须满足的条件,以便能够支持虚拟化。这些条件包括特权指令的识别、特权指令的陷阱和仿真、设备I/O的虚拟化等。根据这些条件,Popek和Goldberg提出了一个虚拟机监视器(VMM)的概念,该监视器可以在硬件层面上管理和支持虚拟化环境。这个原理对虚拟化技术的发展产生了深远的影响,也为后来的虚拟化技术提供了理论基础。

1、虚拟机GuestOS中的所有非敏感指令都会“穿透”虚拟机监视器,直接运行在CPU上。

2、虚拟机GuestOS中的敏感指令,理想的状态是通过陷阱机制被虚拟机监视器所捕获,然后虚拟机监视器通过不同的模拟或虚拟化技术实现在虚拟机上的模拟。

监视器对敏感指令的处理过程:

如果敏感指令都是特权指令,当在虚拟机中执行内核态的特权指令时,则会通过陷阱机制被下层的虚拟机监视器捕获。虚拟机监视器可以对捕获的特权指令进行替换操作,从而完整地模拟出某个虚拟机监视器下的特权操作。“陷阱+模拟”机制从本质上保证了可影响虚拟机监视器正常运行的指令由虚拟机监视器模拟执行,而大部分非敏感指令还是照常运行在物理CPU上。
请添加图片描述
虚拟机监视器用到了优先级压缩技术,使得虚拟机中的应用运行在Ring 3层,GuestOS运行在Ring 1层(有时也可运行在Ring 3层),虚拟机监视器运行在Ring 0层。

虚拟化将原本的GuestOS内核的特权级别从Ring 0改为Ring 1,即可“消除”GuestOS内核的特权。但这会给GuestOS的内核指令带来一定的麻烦,原本GuestOS的内核指令是被设计在Ring 0层下执行的,通过优先级压缩后会造成部分指令在虚拟机中的Ring 1层或Ring 3层下无法执行。

当GuestOS的特权指令无法直接下达到CPU执行时,可以通过虚拟机监视器的“陷阱+模拟”机制执行。具体来说,当虚拟机中的应用需要操作重要资源时,会触发特权指令,通过陷阱机制被虚拟机监视器捕获,然后交由对应的GuestOS执行。因为虚拟化之后GuestOS运行在Ring 1层,它没有权限执行一些特权指令,需要通过其他方式保证这些特权指令的执行。

当虚拟机中的应用使用系统调用时,其跳转到的GustOS内核中断处理程序(routine)运行于Ring1层。但是在内核中断处理程序中有部分指令是必须在Ring 0层才能执行的,此时会再通过陷阱机制将这些指令自动转入虚拟机监视器后执行。用户程序运行特权指令时会有两次特权下降,其中一次是进入Ring 1层的GuestOS;另一次是通过特权指令的陷阱机制进入Ring 0层的虚拟机监视器。

控制权指的是程序执行的控制权,即程序在执行过程中所处的特权级别。假设在虚拟化环境中运行一个操作系统,其中运行了一个虚拟机,虚拟机中运行了一个应用程序。当应用程序需要进行系统调用时,控制权会转移到虚拟机内的操作系统内核中断处理程序中,此时操作系统内核的特权级别为Ring 1。如果系统调用需要执行一些特权指令,例如修改页表或访问I/O端口,那么操作系统内核就无法直接执行这些指令,因为它的特权级别不够高。这时,操作系统内核会通过陷阱机制将控制权转移到虚拟机监视器中,虚拟机监视器的特权级别为Ring 0,可以执行特权指令并与物理硬件交互。执行完特权指令后,虚拟机监视器会将控制权返回给操作系统内核,操作系统内核再将控制权返回给应用程序,应用程序继续执行。这种特权级别的转换是虚拟化环境中实现安全隔离和资源管理的重要机制。

Popek&Coldberg原理的前提是,敏感指令必须都是特权指令,即敏感指令集是特权指令集的子集,如图所示。只有这样,虚拟机监视器才能通过选用特权指令集的陷阱捕获方式进行虚拟化。
请添加图片描述
但是在x86处理器中,只能保证绝大多数的敏感指令是特权指令,还有约17个敏感指令不是特权指令,也就是说,敏感指令的范围更大。然而,当特权指令集是敏感指令集的真子集时,一部分敏感指令无法被虚拟机监视器捕获,也就是说虚拟机监视器无法完全控制这些指令的执行。这种情况被称为“虚拟化漏洞”,因为虚拟机监视器无法完全替代或者控制这些敏感指令的执行,可能会导致安全性问题。

请添加图片描述

虚拟化类型

虚拟化分为全虚拟化、类虚拟化和硬件辅助虚拟化三类

全虚拟化

从GuestOS看来和在真实的物理机上运行完全一致,GuestOS察觉不到是运行在一个虚拟化平台上。在这样的虚拟化平台上,GuestOS 无须做任何修改即可运行,所抽象的虚拟机具有完全的物理计算机特性,我们称这种虚拟化平台为“全虚拟化平台”。全虚拟化平台需要正确处理所有的敏感指令,进而正确完成对CPU、内存和I/O的各种操作。

在全虚拟化中,对于特权指令,还是采用先前的“陷阱+模拟”的方式。当虚拟机的内核态需要运行虚拟化漏洞指令时,Ring 0下的虚拟机监视器通过二进制代码扫描并替换Ring 1下的GuestOS的二进制代码,将所有虚拟化漏洞指令替换为其他指令。二进制翻译是一种直接翻译可执行二进制程序的技术,能够把一种处理器上的二进制程序翻译到另一种处理器上执行。在虚拟机监视器中,会动态地把虚拟机中的虚拟化漏洞指令翻译为其他指令,从而实现虚拟化。
请添加图片描述

类虚拟化

不同于全虚拟化,类虚化的GuestOS知道自己运行在一个虚拟化环境中。类虚拟化可以通过修改GuestOS的内核代码来规避虚拟化漏洞的问题。

GuestOS会将与敏感指令相关的操作都转换为对虚拟机监视器的超级调用(Hypercall),交由虚拟机监视器进行处理,使GuestOS内核完全避免处理那些难以虚拟化的虚拟化漏洞指令。

与全虚拟化不同的是它将问题的中心由虚拟机监视器移向GuestOS自身,通过主动的方式由GuestOS去处理这些指令,而不是移交给虚拟机监视器进行处理,在这种设计理念下就必须得修改GuestOS内核。

但与全虚拟化相同的是,类虚拟化修改过的GuestOS也会运行在Ring 1下。运行在Ring 1下的GuestOS没有权限执行的指令,会交给运行在Ring 0下的虚拟机监视器来处理。虚拟机监视器向GuestOS提供了一套“系统调用”,以方便GuestOS调用,这套“系统调用”就是超级调用。只有Ring 1下的GuestOS才能向虚拟机监视器发送超级调用请求,以防止Ring 3下的应用调用错误导致对系统可能的破坏。

例如,当虚拟机内核需要操作物理资源来分配内存时,虚拟机内核无法直接操作物理资源,而是通过调用与虚拟机监视器内存分配相关的超级调用,由超级调用来实现真正的物理资源操作。

全虚拟化通过Binary Translation在二进制代码级别上来避免虚拟化漏洞。类虚拟化采取的是另一种思路,即修改操作系统内核的代码,使得操作系统内核完全避免这些难以虚拟化的指令。
请添加图片描述

硬件辅助虚拟化

为了更好地解决x86架构下虚拟化漏洞的问题,芯片厂商扩展了其指令集来支持虚拟化。其核心思想是通过引入新的指令和运行模式,使虚拟机监视器和GuestOS分别运行在root模式和no-root模式下,这样一来,GuestOS还是可以运行在Ring 0下的,GuestOS的内核也不需要修改。

将虚拟机监视器与GuestOS的执行环境完全隔离开,通过指令集的变化实现虚拟机监视器和GuestOS运行环境之间的相互转换,即上文所述的root模式和no-root模式。启动或退出root模式和no-root模式通过新添加的VMXON和VMXOFF指令实现。从root模式到no-root模式的转换通过VMEntry指令实现,从no-root模式到root模式的转换通过VMExit指令实现。

虚拟化架构

虚拟化架构主要分为裸金属架构和宿主模式架构两种

裸金属架构

虚拟机监视器被直接安装和运行在物理机上,依赖其自带的虚拟内核管理,使用底层硬件资源。虚拟机监视器拥有硬件的驱动程序,不依赖特定的操作系统,其管理着宿主机及其他虚拟机。宿主机和虚拟机都安装有各自的操作系统,即宿主机操作系统和GuestOS。裸金属架构的代表是Xen。

请添加图片描述

宿主机模式架构

虚拟机监视器被安装和运行在操作系统上,依赖操作系统对硬件设备的支持和对物理资源的管理。在这种情况下,虽然虚拟机监视器对硬件资源进行访问必须经过宿主机操作系统,但虚拟机监视器依然可以充分利用操作系统对硬件设备的支持,以及内存管理进程调度等服务。宿主模式架构的代表是KVM。

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/196675.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电压调整型脉宽调制控制集成电路芯片D7500,工作电压范围7V ~ 40V,输出电流(Max)可达200mA,具有欠压锁定功能

D7500/D7500F SMPS 控制器电路,是一块电压调整型脉宽调制控制集成电路。内部包含5V 基准电压电路、两个误差放大器、触发电路、控制输出电路、脉宽调制比较 器、死区时间比较器及一个 振荡器。该电路可转换频率1kHz至300kHz, 基准电压(Vref)的精确度提…

echarts 水波图

echarts 水波图 安装 npm install echarts --save npm install echarts-liquidfill --save引入 import * as echarts from echarts; import echarts-liquidfill;html <div id"chart1" ref"chart1" class"chart1"></div>css .cha…

DehazeNet: An End-to-End System for Single Image Haze Removal

来源&#xff1a;2016 IEEE journal Cai B, Xu X, Jia K, et al. Dehazenet: An end-to-end system for single image haze removal[J]. IEEE transactions on image processing, 2016, 25(11): 5187-5198. GitHub - caibolun/DehazeNet: DehazeNet: An End-to-End System for …

企业客户服务怎么做?6个有效方法献上!

毋庸置疑&#xff0c;赢得客户的青睐是维系企业经济长青的基础。想要客户满意&#xff0c;得到最佳的客户评价&#xff0c;企业就需要为客户提供超出他们期望的服务。客户服务(Customer Service)是企业成功的关键环节之一&#xff0c;它不仅仅是满足客户需求的过程&#xff0c;…

全新付费进群系统源码 完整版教程

首先准备域名和服务器 安装环境&#xff1a;Nginx1.18 MySQL 5.6 php7.2 安装扩展sg11 伪静态thikphp 后台域名/admin账号admin密码123456 代理域名/daili账号admin密码123456 一、环境配置 二、建站上传源代码解压 上传数据库配置数据库信息 三、登入管理后台 后台域名/ad…

NI自动化测试系统用电必备攻略,电源规划大揭秘

就像使用电脑之前需接通电源一样&#xff0c;自动化测试系统的电源选择也是首当其冲的问题&#xff0c;只不是这个问题更复杂。 比如&#xff0c;应考虑地理位置因素&#xff0c;因为不同国家或地区的公共电网所提供的线路功率有所不同。在电源布局和设备选型方面&#xff0c;有…

大语言模型(LLMs)在 Amazon SageMaker 上的动手实践(一)

本期文章&#xff0c;我们将通过三个动手实验从浅到深地解读和演示大语言模型&#xff08;LLMs&#xff09;&#xff0c;如何结合 Amazon SageMaker 的模型部署、模型编译优化、模型分布式训练等。 实验一&#xff1a;使用 Amazon SageMaker 构建基于开源 GPT-J 模型的对话机器…

14.Tomcat和HTTP协议-[一篇通]

文章目录 1.HTTP 协议1.1HTTP 是什么1.2理解 "应用层协议"1.3理解 HTTP 协议的工作过程1.4HTTP 协议格式1.4.1抓包工具的使用(Fiddler)1.4.2抓包工具的原理1.4.3抓包结果1.4.4协议格式总结 1.5HTTP 请求 (Request)1.5.1认识 URL1.5.1.1URL 基本格式1.5.1.2关于 URL e…

前缀和——238. 除自身以外数组的乘积

文章目录 &#x1f377;1. 题目&#x1f378;2. 算法原理&#x1f365;解法一&#xff1a;暴力求解&#x1f365;解法二&#xff1a;前缀和&#xff08;积&#xff09; &#x1f379;3. 代码实现 &#x1f377;1. 题目 题目链接&#xff1a;238. 除自身以外数组的乘积 - 力扣&a…

【测试开发】第五节.测试——自动化测试(Selenium工具)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;Java测试开发 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 前言 一、…

csdn博客编写技巧

随便记录一下csdn博客编写时候用的到技巧&#xff0c;以作备忘。 1. 表格 1.1 Markdown-Table-Generator 这个是csdn编辑器中&#xff0c;工具栏自带的表格用法。主要优点是比较直观&#xff0c;缺点是无法设置表格中行列的宽高。 用法&#xff1a; | 表头一 | 表头二 | |-…

SpringSecurity+JWT

一.简介 Spring Security 是 Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 认证&#xff1a;验证当前访问系统的是不是本系统的用户&#xff0c;并且要确认具体是哪个用户​ 授权&…

扩散模型,快速入门和基于python实现的一个简单例子(复制可直接运行)

提示&#xff1a;内容丰富&#xff0c;收藏本文&#xff0c;以免忘记哦 文章目录 一、扩散模型二、一个简单的迭代式扩散模型的例子温度扩散模型python代码实现差分近似模拟拉普拉斯算子 三、扩散模型和深度学习进行结合简介用python和torch的代码实现 四、扩散模型与生成模型第…

JVM GC算法

一, 垃圾回收分类: 按线程数分&#xff0c;可以分为串行垃圾回收器和并行垃圾回收器。 按工作模式分&#xff0c;可以分为并发垃圾回收器和独占式垃圾回收器 按碎片处理方式分&#xff0c;可以分为压缩式垃圾回收器和非压缩式垃圾回收器按工作的内存区间分&#xff0c;又可分为…

C语言盐水的故事(ZZULIOJ1214:盐水的故事)

题目描述 挂盐水的时候&#xff0c;如果滴起来有规律&#xff0c;先是滴一滴&#xff0c;停一下&#xff1b;然后滴二滴&#xff0c;停一 下&#xff1b;再滴三滴&#xff0c;停一下...&#xff0c;现在有一个问题&#xff1a;这瓶盐水一共有VUL毫升&#xff0c;每一滴是D毫升&…

基于springBoot+mysql实现的竞赛管理系统

基于springBootmysql实现的竞赛管理系统&#xff0c;演示地址:系统登录 - 软件学院比赛管理系统 管理员账号&#xff1a;1&#xff0c;密码:1 包括比赛管理&#xff0c;队伍管理&#xff0c;教师管理&#xff0c;经费管理&#xff0c;学生管理&#xff0c;比赛结果&#xff0c;…

目前工资最高的几家外包公司汇总!(2023最新版)

最近&#xff0c;很多小伙伴问&#xff1a;只有外包的 offer 能去吗&#xff1f; 大环境不行&#xff0c;面试太少了&#xff0c;很多本科生想进外包都没机会。 非常时期&#xff0c;不需要在意那么多&#xff0c;外包作为过渡也是没问题的&#xff0c;很多外包其实比小公司还…

杂记 | 使用Docker安装并配置MongoDB以支持事务(单副本,并解决了证书文件错误的问题)

文章目录 00 安装前的准备01 创建Docker Compose文件02 设置证书文件03 启动MongoDB04 初始化副本集和创建用户05 验证安装 00 安装前的准备 在开始之前&#xff0c;确保已经安装了Docker&#xff0c;本文基于Docker Compose进行示范&#xff0c;没有装Docker Compose也可将其…

LeetCode算法题解(动态规划)|LeetCode198. 打家劫舍、LeetCode213. 打家劫舍 II、LeetCode337. 打家劫舍 III

一、LeetCode198. 打家劫舍 题目链接&#xff1a;198. 打家劫舍 题目描述&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的…

docker安装Sentinel zipkin

文章目录 引言I Sentinel安装1.1 运行容器1.2 DOCKERFILE 参考1.3 pom 依赖1.4 .yml配置(整合springboot)II 资源保护2.1 Feign整合Sentinel2.2 CommonExceptionAdvice:限流异常处理类III zipkin引言 消息服务和请求第三方服务可不配置Sentinel。 I Sentinel安装 Sentinel …