一.前言
我一直觉得,学习计算机中的一门新技术,一定要从历史去了解他的全貌。这样有利于我们了解事情的来龙去脉和发展的过程。一上来直接接触新兴事物,很容易陷入不知从何下手的困境。不了解历史发展,就不明白前人的一些操作。因此,这个系列的博客将详细完整记录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之前需要认识的一些存储结构。