虚拟化原理

目录

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

什么是虚拟化

虚拟化就是通过模仿下层原有的功能模块创造接口来“欺骗”上层的机制。虚拟化可以通过资源管理技术,将物理存在的实体资源以虚拟机(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。

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开源】基于JAVA的衣物搭配系统

项目编号: S 016 ,文末获取源码。 \color{red}{项目编号:S016,文末获取源码。} 项目编号:S016,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 衣物档案模块2.2 衣物搭配模块2.3 衣…

linux进程调度(二)-进程创建

文章目录 2.进程创建和终止2.1 进程创建的4种方法2.2 进程创建过程分析2.2.1 copy_process函数分析2.2.1.1 dup_task_struct函数分析2.2.1.2 sched_fork函数分析2.2.1.3 copy_mm函数分析2.2.1.4 copy_thread函数分析 2.2.2 wake_up_new_task函数分析 2.进程创建和终止 在 Linu…

常用数据存储格式介绍:Excel、CSV、JSON、XML

在现代数字时代,数据经过提炼后可以推动创新、简化运营并支持决策流程。然而,在提取数据之后,并将其加载到数据库或数据仓库之前,需要将数据转化为可用的数据存储格式。本文将介绍开发者常用的4种数据存储格式,包括 Ex…

布局下一个时代,UTONMOS夯实元宇宙发展基础

从 PC 互联网到移动互联网,再到元宇宙,互联网的发展在一直不断演变和升级着。元宇宙的时代红利将带来从底层基础设施向外延展到用户体验的全面升级。 人们以各自不同视角理解元宇宙。但我们认为,目前学术界和产业界对元宇宙虽然没有统一规范的…

JavaScript 闭包技巧

什么是闭包? MDN:“闭包是捆绑在一起(封闭)的函数及其周围状态(词法环境)的引用的组合。换句话说,闭包使您可以从内部函数访问外部函数的作用域。在 JavaScript 中,每次创建函数时都…

css引入的三种方式

css引入的三种方式 一、内联样式二、外部样式表三、 内部样式表总结trouble 一、内联样式 内联样式也被称为行内样式。它是将 CSS 样式直接应用于 HTML 元素的 style 属性中的一种方式 <p style"color: blue; font-size: 16px;">这是一个带有内联样式的段落。&…

Modbus RTU转Profinet网关连接PLC与变频器通讯在机床上应用案例

背景&#xff1a;以前在机床加工车间里&#xff0c;工人们忙碌地操作着各种机床设备。为了使整个生产过程更加高效、流畅&#xff0c;进行智能化改造。 方案&#xff1a;在机床上&#xff0c;PLC通过Modbus RTU转Profinet网关连接变频器进行通讯&#xff1a;PLC作为整个生产线…

实现简单的操作服务器和客户端(下)

一、说明 描述:本教程介绍如何使用 simple_action_client 库创建斐波那契操作客户端。此示例程序创建一个操作客户端并将目标发送到操作服务器。 内容 代码代码解释编译运行操作客户端连接服务器和客户端二、代码 首先,在您喜欢的编辑器中创建actionlib_tutorials/src/fib…

【封装UI组件库系列】封装Icon图标组件

封装UI组件库系列第三篇封装Icon图标组件 &#x1f31f;前言 &#x1f31f;封装Icon 1.创建Icon组件 2.引用svg图标库 第一步 第二步 第三步 3.二次封装 4.封装自定义属性 &#x1f31f;总结 &#x1f31f;前言 在前端开发中&#xff0c;大家可能已经用过各种各样的UI组…

VUE项目部署过程中遇到的错误:POST http://124.60.11.183:9090/test/login 405 (Not Allowed)

我当初报了这个405错误&#xff0c;再网上查了半天&#xff0c;他们都说什么是nginx部署不支持post访问静态资源。 但后面我发现我是因为另一个原因才导致的无法访问。 我再vue中有使用devServer:{ proxy:{} }进行路由转发。 但是&#xff01;&#xff01; 在这个配置只…

接口测试学习路线

接口测试分为两种&#xff1a; 测试外部接口&#xff1a;系统和外部系统之间的接口 如&#xff1a;电商网站&#xff1a;支付宝支付 测试内部接口&#xff1a;系统内部的模块之间的联调&#xff0c;或者子系统之间的数据交互 测试重点&#xff1a;测试接口参数传递的正确性&…

node与 pnpm、node-sass 等工具的版本兼容关系

1. node & pnpm 2. node & node-sass 3. node-sass & sass-loader sass-loader依赖于node-sass&#xff0c;以下是部分版本号对应

Zookeeper 集群中是怎样选举leader的

zookeeper集群中服务器被划分为以下四种状态&#xff1a; LOOKING&#xff1a;寻找Leader状态。处于该状态的服务器会认为集群中没有Leader&#xff0c;需要进行Leader选举&#xff1b;FOLLOWING&#xff1a;跟随着状态&#xff0c;说明当前服务器角色为Follower&#xff1b;LE…

Jmeter基础和概念

JMeter 介绍&#xff1a; 一个非常优秀的开源的性能测试工具。 优点&#xff1a;你用着用着就会发现它的重多优点&#xff0c;当然不足点也会呈现出来。 从性能工具的原理划分&#xff1a; Jmeter工具和其他性能工具在原理上完全一致&#xff0c;工具包含4个部分&#xff1a; …

绿色能源守护者:光伏运维无人机

随着我国太阳能光伏产业被纳入战略性新兴产业&#xff0c;光伏发电成为实现“双碳”目标的关键之一。在政策支持下&#xff0c;光伏产业维持高速发展&#xff0c;为迎接“碳达峰、碳中和”大势注入了强大动力。在这一背景下&#xff0c;复亚智能与安徽一家光伏企业合作&#xf…

LeetCode78. Subsets

文章目录 一、题目二、题解 一、题目 Given an integer array nums of unique elements, return all possible subsets (the power set). The solution set must not contain duplicate subsets. Return the solution in any order. Example 1: Input: nums [1,2,3] Outpu…

size和shape的区别与联系

对于Numpy数据类型 shape和size都是属于Numpy的属性 arr.shape 将返回一个包含两个元素的元组&#xff0c;例如 (m, n)&#xff0c;其中 m 表示数组的行数&#xff0c;n 表示数组的列数。arr.size 将返回数组中元素的总数。 举例: 输入&#xff1a; import numpy as np# 创…

JavaScript之DOM操作

第一章 API介绍 ​API是一种事先定义好的函数&#xff0c;用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。 ​Web API接口&#xff1a;浏览器提供的一系列操作浏览器功能和页面元素的API(BO…

【Linux】Linux的常用基本指令

Linux常用基本指令 Linux指令的历史背景前言说明一、 ls 列出文件中的所有内容常用选项 二、pwd 显示当前所在目录进程三、cd 将当前工作目录改变到指定的目录下常用样例 四、touch 1. 更改文档或目录的日期时间 2. 新建一个不存在的文件常用选项 四、mkdir 1. 更改文档或目录的…

牛客剑指offer刷题回溯篇

文章目录 矩阵中的路径题目思路代码实现 机器人的运动范围题目思路代码实现 矩阵中的路径 题目 请设计一个函数&#xff0c;用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始&#xff0c;每一步可以在矩阵…