CPU指令环和虚拟化分类

前言

当前市面上主流的虚拟化技术有三种:VMware,KVM 和 XEN 虚拟化。其中VMware是闭源的,而KVM和XEN都是开源化技术。在KVM技术诞生之前,最火的是XEN虚拟化,当时的XEN虚拟化可谓特别火爆,占据了很大一部分市场。但是随着KVM的出现和发展,XEN被红帽等弃用,KVM取代XEN成为了最主流的虚拟化技术。

1、XEN为什么会被KVM取代

XEN这种虚拟化技术,是需要独立内核支持的。意味着只要操作系统内核升级,那么就要维护庞大的XEN内核,即XEN内核也要单独升级。这样做非常麻烦,因为内核层面的代码一般都是千万级别的,而操作系统更新很快,这就代表着XEN内核也要被迫更新很快,那么维护XEN内核就需要花费很多的时间精力。而KVM虚拟化源代码就是操作系统内核的一部分,所以说KVM是基于内核的虚拟化,只要操作系统升级,KVM也会自动跟着升级。这样一来就方便了很多。这也是KVM取代XEN的最主要原因之一。

 

2、CPU指令环

在讲解虚拟化分类之前,必须先说一下CPU指令环。传统的CPU根据特权级别分为4个级别,即Ring0,1,2,3.

 

 操作系统运行在0环,权限最大,可以运行特权指令,可以对接和调用底层的硬件资源。应用程序即我们的App运行在3环,权限最小,不可以调用物理资源。所以我们也把0环称为内核态,把3环称为用户态。而环1,2我们一般认为没什么用,处于空闲状态。当我们在我们的电脑上运行App时,App需要申请内存和硬盘空间,这个申请会触发系统函数,同时会被CPU捕获到,给到0环的操作系统,从而由操作系统给App分配资源。

另一方面,CPU中的指令可以分为普通指令和特权指令。 但是虚拟化技术出现之后,这里出了一个漏洞。

比如我们在自己的电脑里建了一台虚拟机(通过VMware Workstation),我们自己的PC OS肯定运行在内核态。而我们的虚拟机有自己的OS、网卡、CPU、内存,它不知道自己是一台虚拟机,它以为自己也是一台完整的物理机。而且虚拟机的OS也是一个操作系统,它肯定也要运行在内核态。这时候同一个内核态里就有了2个操作系统,这时候就会有冲突。如果我们把物理机OS中的特权指令用蓝色圆圈表示,把虚拟机的特权指令用红色表示,为了便于区分,我们把虚拟机的特权指令称为敏感指令,如下图所示,其实这时候是没有冲突的。

但是当虚拟化技术出现(X86架构)以后,虚拟化技术有一些独有的敏感指令,这时候就会出现一部分敏感指令不包含在特权指令中的情况,这就有问题了。问题就是:在虚拟机里面执行某个操作,竟然没反应,因为物理机识别不到这个指令。

那么怎么解决这个问题呢,这就引出了虚拟化的分类。根据解决这个问题所使用的不同方式,我们可以把虚拟化技术分为三类。

 

3、虚拟化分类

(1)基于软件的完全虚拟化

VMware在1998年解决了这个问题。它告诉这台虚拟机你要相信你自己,你就是一个物理机,你的操作系统就是跑在0环的。而我们的虚拟机是通过VMware workstation启动的,VMware workstation在我们的PC机中相当于一个应用程序,但是应用程序是跑在环3的,这就是冲突所在。VMware采用二进制翻译技术解决这个问题。假如我们在虚拟机中启动一个程序,那么这个应用程序就要向操作系统申请内存、CPU等资源,这个时候VMware workstation就充当中间人的作用,就是我们平常说的VMM,也叫Hypervisor 。Hypervisor收到这个应用程序要申请资源的申请之后,会告诉物理机说我这里有一个应用程序需要申请资源,物理机发现自己的90,91,92这段内存空间空闲,就把这个给了Hypervisor,Hypervisor拿到这个之后会对他进行翻译转换,转换成0,1,2,这样内存空间就从头开始了,在把他给到这个虚拟机使用。虚拟机看到自己的内存空间是从头开始的,更加相信自己就是一台真实的物理机。

通过二进制翻译这种方法,性能速度相对来说比较慢,因为他需要VMM这个中间人来回翻译。虚拟机永远不知道自己是虚拟机,以为自己是真实的物理机。这种方法也称为基于软件的完全虚拟化。基于软件指例如这里通过VMware Worksataion这个软件,完全通过二进制翻译来实现的。

 

(2)半虚拟化:

XEN就是典型的半虚拟化。我们知道XEN是有自己独立的XEN内核的,所以它会在自己的XEN内核里边运行一台虚拟机,这台虚拟机的名称被命名为domain0。所有的虚拟机的操作都会连接到XEN内核的domain0上,由domain0来执行,domain0向下管理真实的物理资源。所以半虚拟化中,直接用domain0虚拟机来执行所有虚拟机的操作,不需要通过VMM进行翻译转换,所以这种虚拟化性能会好很多。但是每台虚拟机都知道自己是虚拟机。

 

 

(3)基于硬件的完全(辅助)虚拟化:

英特尔和AMD在CPU涉及和生产的时候,把虚拟机所用到的所有指令集都汇聚了起来,就不会出现上述描述的一部分敏感指令不包含在特权指令中的情况,即所有指令不存在获取不到的情况。直接在CPU最底层解决了这个问题。也叫基于硬件的全虚拟化。

 

posted @ 2022-03-21 11:10  云计算成长路  阅读(572)  评论(0编辑  收藏  举报