Intel处理器虚拟化技术VT-x86下实现小型虚拟化框架(1)

一.前言

我一直觉得,学习计算机中的一门新技术,一定要从历史去了解他的全貌。这样有利于我们了解事情的来龙去脉和发展的过程。一上来直接接触新兴事物,很容易陷入不知从何下手的困境。不了解历史发展,就不明白前人的一些操作。因此,这个系列的博客将详细完整记录VT(处理器虚拟化技术)的一些细节包括简单实现。单纯是对这门技术的兴趣。


二.虚拟化技术的介绍以及历史

虚拟化的诞生对计算机的发展是巨大的。好比如我们经常用的虚拟机VMware Workstation,VirtualBox等出名的虚拟化软件。都是基于这个技术去实现的。虚拟化,顾名思义就是将一个事物虚拟成多个事务。就拿我们的计算机来说。CPU,内存,寄存器等物理设备。假设一台电脑只会有一个。但是通过虚拟化技术,能让外界感觉你有多个CPU,多个内存,多个寄存器等物理设备,但是这不是真的,只是逻辑上感觉是有多个。从而能产生多个操作系统。(想象一下为啥虚拟机能运行多个操作系统)。这种通过虚拟化技术提供的多个操作系统或者软件,我们称之为虚拟机。


(2.1)基于软件的虚拟化技术的诞生

虚拟化技术早在20世纪60年代的时候就已经诞生,最早是由IBM提出。那个时候,其实是通过软件功能去模拟多个各种各样的设备或组件,类似于C++创建一个类并且实例化这样的思想。本质上是一个进程在操作系统中存在。那么多个模拟组件进程在操作系统中切换,就好像拥有多个真实组件一样,早期的VMware等软件是基于这个方案实现的。


(2.2)基于硬件的虚拟化技术的诞生

在2005-2006年,Intel和AMD相继开发出了硬件支持的虚拟化技术。也就是CPU支持一种新的技术模式。硬件厂商从底层出发设计出了这种虚拟化技术,并提供新的指令来操作和编写支持虚拟化技术的实现。从此,开发基于虚拟化技术的软件或者功能的实现将大大降低了开发难度。在硬件虚拟化技术的诞生,随之而来就是一个新的概念:虚拟机监视器(VMM)全称为Virtual Machine Monitor。有些书上把它称之为Hypervisor(超级监督者,管理器)。其实本质它们是一类东西。它的作用就是作为虚拟机的管理者。可以这么去理解,如果进程的调度切换等是由操作系统管理的。那么虚拟机就相当于进程,而VMM就是操作系统。VMM是作为管理者而存在的。由此,我们就引出了软件层面的虚拟化技术总体的框架脉络:


于此因为要作为管理者来集中管理这些虚拟机,并且作为中间人来操作物理设备。所以它的权限是要大于等于操作系统的。所以它的权限其实要凌驾于操作系统之上。也就是所谓的-1环。其实并没有所谓的-1环,但是为了区分它的权限比操作系统还大。所以叫-1环。可能有些人会想,和操作系统一个权限能够理解。毕竟系统编程属于驱动级的,肯定是跟操作系统一个权限的。那么比它还大是为什么呢?其实很简单。假设我把物理机上的操作系统给接管了,让他变成了我的虚拟机,而虚拟机的操作,都将通过我的VMM来反馈和拦截。这不就意味着操作系统想干嘛都得告诉我们嘛。在硬件虚拟化诞生之初,其实是为了加速类似于VMware Workstation这种软件的效率和速度,后续也用于云计算方面的应用。但是在后面的实践中。人们发现安全领域下,VT技术也是非常强大的。毕竟安全领域中,权限大就是王道。因此高于操作系统的权限利用,一定是会被人们发掘和利用的。据我所知目前最直接和广泛的应用主要有游戏公司使用VT技术保护游戏。一些木马使用VT技术隐藏自己等。当然我学习它的目的并非出于破坏计算机,因此不要拿来干非法的事情。(免责申明)。


三.Intel硬件虚拟化开发框架

前面我们讲了目前Intel和AMD两大硬件厂商分别实现了硬件虚拟化技术。我们主要讲Intel的虚拟化技术。其实大致思想和框架是一样的,只是细节上的细微部分有所差别。Intel虚拟化技术分为三个部分--Intel-VTx,Intel-VTd,Intel-VTc。其实很好区分,x对应是软件开发。d是物理上的实现,c是网络虚拟化相关的内容。我们只讲Intel-VTx和软件实现相关的部分。

(3.1)框架图

上面我们描述虚拟化技术的基本框架,我们经过详细修改给出更加详细的框架图:


(3.2)权限和设计目标

从上面的框架图中,我们可以看到Intel-VTx是有两种权限的。Guest虚拟机在no-root权限下,VMM处于root权限下。这个很好理解,类比于Linux系统的root用户和普通用户。基于这个权限VT有如下设计目标:

对于VMM层来说:

1,为每个虚拟机提供虚拟处理器,可以在恰当的时候将它放入真正的物理处理器上执行。

2.VMM层可以控制处理器资源,内存管理,管理中断和IO操作等。

对于Guest虚拟机来说:

1.每个虚拟机使用相同的接口来使用虚拟处理器,内存,存储设备等。

2.每个虚拟机可以独立运行,互不干扰。

3.对于虚拟机来说,VMM层完全透明(不存在的意思)。


(3.3)VMM框架开启和退出模型


基于这个图(取自Intel手册3卷23章)谈谈这个VMM模型。其实它很类似我们的操作系统发生系统调用的过程(3环进0环的过程),当执行VMXON指令后,就进入了root模式,也就是VMM下。当执行对应的指令(VMLAUNCH)就会进入虚拟机模式也就是no-root下执行。当虚拟机发生某些事件触发VM Exit将会把控制权交给VMM。只有当VMM显示调用VMXOFF指令后,VMM才会被关闭。也就是退出虚拟化。


四,小结

通过上述的一些概念和基础知识,我们对虚拟化技术有了基本的认识。了解这些对后续的理解是有很大帮助的。下一篇我们将介绍编写VMM之前需要认识的一些存储结构。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式3-行为模式-责任链模式

文章目录 一、责任链如何设计1、定义责任链处理对象1.1、抽象类1.2、责任链处理对象 2、将“每个链”组合起来,定一个枚举2.1、枚举对象2.2、责任链对象 3、调用时,如何获取责任链对象3.1、获取责任链对象方法3.2、责任链工厂方法--将这些独立的“链”链…

LeetCode---385周赛

题目 3042. 统计前后缀下标对 I 3043. 最长公共前缀的长度 3044. 出现频率最高的质数 3045. 统计前后缀下标对 II 一、最长公共前缀的长度 这题可以用字典树来做。 这里简单介绍一下字典树,顾名思义,这是用来存放单词的树,如何存&#x…

Spring 手动实现Spring底层机制

目录 一、前言 二、Spring底层整体架构 1.准备工作 : 2.架构分析 : (重要) 3.环境搭建 : 三、手动实现Spring容器结构 1.自定义注解 : 1.1 Component注解 1.2 Scope注解 2.自定义组件 : 3.自定义用于封装Bean信息的BeanDefinition类&a…

AI生成图片网站测评

主要测评文章配图生成效果、绘制logo等效果 测评关键点:生成效果、网站易用度、是否免费 测评prompt:请生成一个文章内容配图,图片比例是3:2,文章主旨是AI既是机遇,也存在挑战和风险,要求图片…

Linux-基础知识(黑马学习笔记)

硬件和软件 我们所熟知的计算机是由:硬件和软件组成。 硬件:计算机系统中电子,机械和光电元件等组成的各种物理装置的总称。 软件:是用户和计算机硬件之间的接口和桥梁,用户通过软件与计算机进行交流。 而操作系统…

SWIFT:自我认知微调

文档:https://github.com/modelscope/swift/blob/main/docs/source/LLM/%E8%87%AA%E6%88%91%E8%AE%A4%E7%9F%A5%E5%BE%AE%E8%B0%83%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.md ​​​​​​代码: Swift是如何把自我认知数据集融合到训练集中呢? 1:相关的3个参数

5.2.鸿蒙LiteOS-M los_dispatch

目录 一、cortex-m4 los_dispatch.S代码分析坚持就有收获 一、cortex-m4 los_dispatch.S代码分析 .syntax unified #.syntax [unified | divided], 指定arm 汇编语法规则 .arch armv7e-m #指定平台, 与命令行参数-march同样的作用 .fpu fpv4-sp-d16 #指定浮点运算…

七.把opencv库集成到QT5创建的窗体项目中

1.安装opencv 命令:mingw32-make install 2.新建项目 opencvDemo1 然后点击【下一步】,选择qmake,完成工程的创建 3.添加opencv 库文件 在pro工程文件中加入如下库文件路径

Python爬虫-报错requests.exceptions.SSLError: HTTPSConnectionPool

在学习python爬虫,在公司运行代码没有问题,但是下班回来把代码拉下来运行,却出现问题。 问题: requests.exceptions.SSLError: HTTPSConnectionPool(host‘campusgateway.51job.com’, port443): Max retries exceeded with url…

C++的map/multimap容器->基本概念、构造和赋值、大小和交换、插入和删除、查找和统计、容器排序

#include<iostream> using namespace std; #include <map> //map容器 构造和赋值 void printMap(map<int,int>&m) { for (map<int, int>::iterator it m.begin(); it ! m.end(); it) { cout << "key " <&l…

Vue2响应式原理分析(数据代理与数据劫持)

综述&#xff1a; 我们都知道&#xff0c;每个Vue的应用都是通过new一个Vue构造函数从而创造出来一个vm实例对象&#xff0c;el&#xff08;elect&#xff09;配置项为通过id选择器#root选择index页面中的根dom元素进行绑定&#xff0c;data配置项则为vue模板中用到的源数据。 …

C语言-数组指针与指针数组

一、简介 对于使用C语言开发的人来说&#xff0c;指针&#xff0c;大家都是非常熟悉的。数组&#xff0c;大家也同样熟悉。但是这两个组合到一起的话&#xff0c;很多人就开始蒙圈了。这篇文章&#xff0c;就详细的介绍一下这两个概念。 指针数组和数组指针&#xff0c;听起来非…

【服务器数据恢复】通过reed-solomon算法恢复raid6数据的案例

服务器数据恢复环境&#xff1a; 一台网站服务器中有一组由6块磁盘组建的RAID6磁盘阵列&#xff0c;操作系统层面运行MySQL数据库和存放一些其他类型文件。 服务器故障&#xff1a; 该服务器在工作过程中&#xff0c;raid6磁盘阵列中有两块磁盘先后离线&#xff0c;不知道是管理…

在Linux操作系统的ECS实例上安装hadoop

目录 1. java(jdk)2. Hadoop3. 配置文件4. 启动Hadoop服务&#xff08;搭建伪分布式环境&#xff09; 1. java(jdk) yum list java* &#xff1a;列出所有名称中包含“java”字样的软件包yum install java-1.8.0-openjdk.x86_64&#xff1a;选择自己想要的版本。这里我选择jav…

DataGrip 2023:让数据库开发变得更简单、更高效 mac/win版

JetBrains DataGrip 2023是一款功能强大的数据库IDE&#xff0c;专为数据库开发和管理而设计。通过DataGrip&#xff0c;您可以连接到各种关系型数据库管理系统(RDBMS)&#xff0c;并使用其提供的一组工具来查询、管理、编辑和开发数据库。 DataGrip 2023 软件获取 DataGrip 2…

分散的产品开发团队

分散的产品开发团队指的是各个团队或成员在地理位置上分布在不同地方&#xff0c;通过互联网和现代通讯技术进行协作和沟通&#xff0c;以共同完成产品开发任务的团队模式。 这种团队模式的优势在于可以充分利用各地的人才资源&#xff0c;降低团队的管理和协作成本&#xff0…

【Ubuntu】使用WSL安装Ubuntu

WSL 适用于 Linux 的 Windows 子系统 (WSL) 是 Windows 的一项功能&#xff0c;可用于在 Windows 计算机上运行 Linux 环境&#xff0c;而无需单独的虚拟机或双引导。 WSL 旨在为希望同时使用 Windows 和 Linux 的开发人员提供无缝高效的体验。安装 Linux 发行版时&#xff0c…

云HIS系统源码,基于云计算技术的B/S架构的云HIS系统,二甲医院信息管理系统

云HIS系统源码&#xff0c;采用云端SaaS服务的方式提供 基于云计算技术的B/S架构的云HIS系统&#xff0c;采用云端SaaS服务的方式提供&#xff0c;使用用户通过浏览器即能访问&#xff0c;无需关注系统的部署、维护、升级等问题&#xff0c;系统充分考虑了模板化、配置化、智能…

vscode + wsl2 + xmake快速构建c语言编译调试环境

前言 使用这一套是我觉得最方便的&#xff0c;wsl2使得我可以不用脱离windows&#xff0c;且无需安装庞大且臃肿虚拟机。vscode让我可以更加方便快捷的编辑代码&#xff0c;而xmake是一站式的工程构建工具且作者就是中国人文档啥的群啥的都是中文&#xff0c;比起cmake makefi…

python统计分析——线性模型的预测和评估

参考资料&#xff1a;用python动手学统计学 1、导入库 # 导入库 # 导入数据处理的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 导入绘图的库 from matplotlib import pyplot as plt import seaborn as sns sns.set() # 导入估计…