云计算基础-计算虚拟化-CPU虚拟化

CPU指令系统

在CPU的工作原理中,CPU有不同的指令集,如下图,CPU有4各指令集:Ring0-3,指令集是在服务器上运行的所有命令,最终都会在CPU上执行,但是CPU并不是说所有的命令都是一视同仁的,它会把命令分为不同的指令集

Ring0指令集称之为内核态指令集,改啊指令集里面啊运行的主要是操作系统访问硬件、关键数据结构,运行中断等。

Ring1-2指令集主要运行的是设备驱动的命令

Ring3指令集称之为用户态,该指令集运行的是用户态的应用的一些命令

CPU就是通过这种不同的指令集来运行着不同的命令,为什么要做这种涉及呢?因为在服务器上所运行的命令,可能会产生不一样的后果,比如说单纯的额运行上层应用的命令,最多只影响上层的这些软件,比如有些软件跑着跑着就跑非了,但是它仅仅是软件挂了,操作系统并不受影响,

但是向Ring0这里,它包含了操作系统访问硬件,他是可以调度底层硬件设备,向这些命令是非常关键的,如果说调度底层硬件设备的命令出现了问题,相当于这个命令直接给到了底层设备,如果命令不加筛选,或者随便给一个命令的话是有可能损坏底层设备的,所以像这种最高级的操作系统访问硬件,包括中断这种非常敏感和高级的指令是被放在了内核态的指令集里的

这个结构是CPU在最初涉及的时候就是这么涉及的,这个结构最初的涉及仅仅考虑了CPU的正常运行,但并没有考虑到虚拟化场景下出现的问题

CPU虚拟化分类

全虚拟化

在虚拟化场景中,CPU架构面临的问题

在虚拟化场景下,物理主机上的操作系统操作底层硬件的指令运行在Ring0内核态,我们在操作系统上安装的各种软件运行在Ring3用户态,而Hypervisor本质上也是操作系统上的一个软件,所以Hypervisor运行在Ring3用户态。

作为一个虚拟化应用,我们可以在Hypervisor之上创建了虚拟机,因为Hypervisor运行在Ring3用户态,所以通过Hypervisor创建的这台虚拟机也跑在Ring3用户态

但是作为一个完整的虚拟机,虚拟机的CPU也会有Ring0-3,虚拟机上的应用跑在Ring3上是没问题的,问题是虚拟机的操作系统要如何运行?

首先虚拟机的操作系统它应该运行在Ring0内核态,但是由于虚拟机运行在Hypervisor上,而Hypervisor又运行在Ring3上,那虚拟机的操作系统也就只能运行在Ring3上,所以虚拟机的操作系统本应该运行在Ring0内核态,但它实际上处于Ring3用户态,也就是说Guest OS想访问Ring0,由于它运行在Hypervisor上,实际上是跑在Ring3的。这就是引入虚拟化之后对于传统CPU结构带来的巨大冲突,也就是传统CPU结构并不能满足虚拟机操作系统想要的运行环境,这就是最早虚拟化所面临的第一大难题

上世纪八十年代,这个问题由VMware公司提出并解决,VMware的解决思路叫Binary Translation,翻译成中文叫二进制转化,它的解决思路是给Hypervisor附加了一个功能,由Hypervisor来拦截、收集、辨识虚拟机的所有命令,即包括Ring3命令,也包括Ring0命令,Ring3命令正常运行,因为它就应该跑在Ring3,如果是Ring0的命令,则由Hypervisor来拦截虚拟机的这部分Ring0指令,然后将这部分指令进行Binary Translation(翻译),将这些指令进行一些列的翻译和替换,也就是使虚拟机内核态的这部分指令可以运行在Ring0的环境

直白地说就是对所有地指定进行拦截翻译再执行地过程,通过这个过程就保证了虚拟机操作系统的那些指令也可以在经过转化之后运行在Ring0态,通过这种技术就保证了虚拟机实现了CPU的虚拟化

但是这种技术会导致Hypervisor有大量的工作负荷,因为他要拦截虚拟机的每一条指令,并且进行鉴别、筛选、再传递等等工作,这些工作就会占用大量的CPU和内存资源,这种办法仅仅使从技术上解决了CPU的虚拟化,但它实际的使用效率是比较低的

这种方案我们称之为全虚拟化,也就是说这种方案完全是靠软件的功能来解决的,没有涉及到任何硬件,硬件也没有改动

简单来说,全虚拟化就是:虚拟机想访问Ring0,由于它运行在Hypervisor上,实际上它是跑在Ring3的。通过Hypervisor的拦截、翻译、传递这些指令,使虚拟机内核态的指令可以运行在Ring0上

半虚拟化

全虚拟化主要的问题是效率比较低,随着技术的发展,人们又提出半虚拟化技术,Para Virtualization,它还有另外一个名字叫超虚拟化

半虚拟化技术最核心的点在于它直接修改了操作系统,让操作系统即便运行在Ring3上,它也可以产生一些能够直接跑在Ring0的命令,如下图所示,经过修改后的linux操作系统可以直接把他的命令传递给hardware(硬件)而不需要经过hypervisor翻译

半虚拟化技术优点:不需要Hypervisor进行拦截和翻译,占用的CPU和内存资源更少,性能得到了提升

半虚拟化技术缺点:技术门槛高,要求需要对操作系统进行修改,Linux是开源的,是可以进行修改的,而Windows是闭源的,无法进行修改,所以半虚拟化的使用范围也收到了限制,仅仅是可以支持开源的Linux操作系统

硬件辅助全虚拟化

全虚拟化和半虚拟化都是在软件层面解决CPU虚拟化的问题,CPU传统结构对于虚拟化技术是不友好的,技术人员在软件层面做了一些改进,以期让CPU更好的支持虚拟化技术,随着技术的发展,CPU厂商也在硬件层面做了改进,在2000左右,英特尔和AMD升级了他们的CPU硬件,让CPU可以更好的来支持虚拟化技术。这种升级后的技术叫硬件辅助全虚拟化。

升级后的CPU有两种工作形态,一个叫根态,一个叫非根态

根态是物理机正常工作的情况下的形态,主机操作系统运行在Ring0,业务运行在Ring3。当在物理机上起了一台虚拟机之后,虚机想要运行的时候,如Guest OS需要调用Ring0的时候,这时候CPU就会由根态切换到非根态,切换之后,Guest OS可以直接访问到物理CPU的Ring0,Guest OS上的APP可以直接访问到物理CPU的Ring3,当物理机的操作系统又想对CPU进行操作时,再由非根态切换回根态

相比于全虚拟化和半虚拟化,硬件辅助全虚拟化在硬件层面对CPU进行了重新设计,让CPU可以更好的支持虚拟化技术,它不需要在软件层面做修改,虚拟化对于硬件的性能没有过多的占用,保证了虚拟化有较好的性能水平

相关推荐
为什么这亚子1 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
划水小将军1 小时前
阿里云函数计算GBK编码
阿里云·云计算
沈艺强2 小时前
云计算答案
云计算
Thanks_ks4 小时前
探索计算机互联网的奇妙世界:从基础到前沿的无尽之旅
物联网·云计算·区块链·tcp/ip协议·计算机互联网·万维网·未来科技
IT技术分享社区5 小时前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
九河云12 小时前
AWS账号注册费用详解:新用户是否需要付费?
服务器·云计算·aws
神一样的老师12 小时前
利用亚马逊AWS IoT核心和MQTT进行数据采集的综合指南
云计算·aws
昔我往昔18 小时前
阿里云文本内容安全处理
安全·阿里云·云计算
写代码的学渣21 小时前
Linux云计算个人学习总结(一)
linux·运维·云计算