虚拟机虚拟化原理

目录

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

什么是虚拟化

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

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

相关文章

中国版的 GPTs:InsCode AI 生成应用

前言 在上一篇文章 《InsCode:这可能是下一代应用开发平台?》中,我们介绍了一个新的应用开发平台 InsCode,它是基于云原生开发环境 云 IDE AI 辅助编程的一站式在线开发平台。 最近,InsCode 又推出了另一种全新的开…

Python三十个常见的脚本汇总

1、冒泡排序 2、计算x的n次方的方法 3、计算a*a b*b c*c …… 4、计算阶乘 n! 5、列出当前目录下的所有文件和目录名 6、把一个list中所有的字符串变成小写: 7、输出某个路径下的所有文件和文件夹的路径 8、输出某个路径及其子目录下的所有文件路径 9、输出某个路…

深度学习毕设项目 医学大数据分析 - 心血管疾病分析

# 1 前言 🚩 基于大数据的心血管疾病分析 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:4分 1 课题背景 本项目的任务是利用患者的检查结果预测心血管疾病(CVD)的存在与否。 2 数据…

【开源视频联动物联网平台】流媒体传输协议HLS,FLV的功能和特点

HLS(HTTP Live Streaming)和FLV(Flash Video)都是用于视频流传输的协议或容器格式,但它们在某些方面有着显著的区别和特点。 HLS是一种由苹果公司开发的用于流媒体传输的协议,而FLV则是Adobe公司开发的用于…

【ArcGIS Pro二次开发】:CC工具箱1.1.4更新_免费_50+工具

CC工具箱1.1.4更新【2023.11.30】 使用环境要求:ArcGIS Pro 3.0 一、下载链接 工具安装文件及使用文档: https://pan.baidu.com/s/1OJmO6IPtMfX_vob3bMtvEg?pwduh5rhttps://pan.baidu.com/s/1OJmO6IPtMfX_vob3bMtvEg?pwduh5r 二、使用方法 1、在下…

从物理机到K8S:应用系统部署方式的演进及其影响

公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。 概述 随着科技的进步,软件系统的部署架构也在不断演进,从以前传统的物理机到虚拟机、Docker和Kubernetes,我们经历了一系列变化。 这些技术的引入…

VBA技术资料MF88:测试Excel文件名是否有效

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到…

系列二十五、Spring设计模式之适配器模式

一、适配器模式 1.1、概述 适配器模式(Adapter Pattern)用于兼容不相关的接口之间,类似于一个桥梁,它结合了两个独立接口的功能,这种类型的设计属于结构型模式,为了方便大家伙的理解,我举个例子…

什么是美颜sdk?集成第三方美颜sdk的步骤

本文将深入探讨如何集成第三方美颜sdk,为直播平台引入更先进、更具吸引力的美颜特效。 第一步:选择合适的第三方美颜sdk 在开始集成美颜sdk之前,首要任务是选择适合自己直播平台需求的第三方美颜sdk。不同的sdk可能具有不同的特色和性能&a…

如何修改.exe文件的修改时间,亲测有效

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 演示视频: 10秒钟实现将文件的修改…

Linux:可视化管理工具Webmin的安装

一、下载 地址:Webmin官网 我这里下载的是1.700-1版本 二、安装 1、在虚拟机上新建目录并安装软件 mkdir /opt/webmin rpm -ivh webmin-1.700-1.noarch.rpm2、修改webmin的root密码 /usr/libexec/webmin/changepass.pl /etc/webmin root 1234563、修改端口(可…

docker读取字体异常

解决方法 docker容器中执行 apk add ttf-freefont 根据版本不同 apk add ttf-dejavu-fonts apk add ttf-bernoulli

【开源】基于Vue.js的医院门诊预约挂号系统的设计和实现

项目编号: S 033 ,文末获取源码。 \color{red}{项目编号:S033,文末获取源码。} 项目编号:S033,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2…

Ranger安装和使用

Ranger部署 1.准备 1.1 编译 Ranger编译(已经编译过的话,直接看1.2) 1.1.1 准备到Ranger官网下载ranger的源码:http://ranger.apache.org/download.html 1.1.2 Ranger编译的过程实在非虚拟机环境下完成的,下载好r…

chapter10-homework-Java

第十章作业 Homework01知识点 Homework02知识点 Homework03知识点 Homework04知识点 Homework05知识点 Homework06Homework07Homework08 Homework01 分析执行结果。 public static void main(String[] args) {Car_ c new Car_();Car_ c1 new Car_(100);System.out.println(…

Vue中 实现自定义指令(directive)及应用场景

一、Vue2 1. 指令钩子函数 一个指令定义对象可以提供如下几个钩子函数 (均为可选): bind 只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。inserted 被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已…

三.排序与分页

目录 一.排序数据二.分页 一.排序数据 1.排序规则 使用ORDER BY 子句排序 ASC(ascend)升序DESC(descend)降序 ORDER BY 子句在SELECT语句的结尾 2.单列排序 SELECT last_name, job_id, department_id, hire_date FROM e…

(蓝桥杯)1125 第 4 场算法双周赛题解+AC代码(c++/java)

题目一&#xff1a;验题人的生日【算法赛】 验题人的生日【算法赛】 - 蓝桥云课 (lanqiao.cn) 思路&#xff1a; 1.又是偶数&#xff0c;又是质数&#xff0c;那么只有2喽 AC_Code:C #include <iostream> using namespace std; int main() {cout<<2;return 0; …

【Web端CAD/CAE文字标注】webgl+canvas 2d实现文字标注功能

一、需求背景 在CAD/CAE领域经常会遇到显示节点编号这种需求&#xff0c;效果如下图&#xff1a; 本文介绍如何在WebGL中实现文字的显示&#xff0c;对于如何在OpenGL中实现请绕路。 二、实现原理 Canvas是HTML5提供的元素&#xff0c;用于在网页上绘制图形&#xff0c;其支…

设计循环队列

目录 设计循环队列 &#x1f642;【1】数组循环队列 思路分析 ❓1 ❓2 ❓3 易错总结 创建MyCircularQueue 初始化myCircularQueueCreate 为空否myCircularQueueIsEmpty 为满否myCircularQueueIsFull 插入元素myCircularQueueEnQueue 删除元素myCircularQueueDeQue…