CPU纯软件全虚拟化技术

我们在前面的文章中提到了虚拟化技术的大致分类情况,即分为全虚拟化、半虚拟化和硬件辅助虚拟化技术3大类别。而我们虚拟化技术最主要的虚拟主体就是我们的硬件CPU、内存和IO,那么我们的CPU在全虚拟化模式下如何工作?在半虚拟化下如何工作?在硬件辅助虚拟化模式下如何工作?或着说细分下来,我们又可以分为CPU的全虚拟化技术、半虚拟化技术和硬件辅助虚拟化技术,内存的全虚拟化技术、半虚拟化技术和硬件辅助虚拟化技术以及IO设备的全虚拟化技术、半虚拟化技术和硬件辅助虚拟化技术。本次我们就来说说CPU的全虚拟化技术、半虚拟化技术和硬件辅助虚拟化技术。

不支持硬件辅助虚拟化技术的X86架构下的CPU有4个特权级(ring0--ring3),操作系统是处于最高级别的ring0,应用程序处于最低级别的ring3。

在这种架构下实现CPU的全虚拟化是及其困难的,为什么困难?

1、 原先的OS运行在ring0层,拥有对所有硬件的全部特权级;

2、 虚拟化之后将OS运行在ring1层,OS就没有权限执行一些特权指令,怎么保证这些特权指令执行;

3、 在保证该OS虚拟机的特权指令执行的情况下,保证其他运行的OS虚拟机的安全;

1、模拟仿真技术

最先实现这种CPU全虚拟化技术的是Trap-and-emulation技术,即陷入模式和模拟仿真技术。这种技术通过将OS需求的特权指令通过VMM自动捕获的方式运行后返回去OS。当OS有特权指令产生时,VMM将其自动捕获,将OS所请求的特权指令进行截获,然后通过VMM运行之后将结果返回给OS层。VMM会使用模拟仿真将特权指令模拟仿真的方式执行一边。

在虚拟化模式下,就存在着2中特殊的指令:特权指令和敏感指令。那么什么是特权指令?什么是敏感指令?

特权指令:系统中有一些操作和管理关键系统资源的指令,这些指令只有在最高特权级上能够正确运行。如果在非最高特权级上运行,特权指令会引发一个异常,处理器会陷入到最高特权级,交由系统软件处理了。在不同的运行级别上,指令的执行效果不同,而且并不是每个特权指令都会引发异常,它有可能被直接忽略。硬件区分特权指令和普通指令的目的,举个例子,就像操作系统提供系统调用一样。

敏感指令:操作特权资源的指令,包括修改虚拟机的运行模式或者下面物理机的状态;读写时钟、中断等寄存器;访问存储保护系统、地址重定位系统及所有的I/O指令。不会触发异常的特权指令也是敏感指令;也就是说,敏感指令范围更大,有些敏感指令不能触发异常,这是x86设计的设计原因。

虚拟化场景下,要求将GuestOS内核的特权解除,从原来的0降低到1或者3。这部分特权指令在GuestOS中发生的时候,就会产生Trap,被VMM捕获,从而由VMM完成。这就是虚拟的本质方法,特权解除和陷入模拟(Privilege deprivileging/Trap-and-Emulation)。虚拟化场景中敏感指令必须被VMM捕获并完成。对于一般 RISC 处理器,如 MIPS,PowerPC 以及SPARC,敏感指令肯定是特权指令,但是x86 例外,x86绝大多数的敏感指令是特权指令,但是由部分敏感指令不是特权指令,执行这些指令的时候不会自动trap被VMM捕获。

2、二进制翻译技术

采用模拟仿真的方式模拟和虚拟化x86架构的CPU,但是由于x86架构的CPU中,不是所有的敏感指令都是特权指令,所以并不能完全的解决掉那些不是特权指令的敏感指令的模拟仿真问题。例如SGDT, SLDT, SIDT …

由于模拟仿真技术固有的缺陷,导致对CPU的虚拟化并不完整。所以也导致了基于x86的虚拟化难以和其他CPU架构一样实现虚拟化。比如IBM的Power CPU架构就很早具备了虚拟化的技术并使用于实践。

这个现象在1999年得到改善,VMware通过二进制翻译技术完成了对x86 CPU架构的完全虚拟化。

其主要采用优先级压缩技术(Ring Compression)和二进制代码翻译技术(Binary Translation)。优先级压缩技术让VMM和Guest运行在不同的特权级下。对x86架构而言,即VMM运行在最高特权级别Ring 0下,GuestOS运行在Ring 1下,用户应用运行在Ring 3下。因此,Guest OS的核心指令无法直接下达到计算机系统硬件执行,而是需要经过VMM的捕获和模拟执行(部分难以虚拟化的指令需要通过二进制翻译【Binary Translation】技术进行转换)。如下图所示。

特权级我想在这里就不用多说,大家都比较清楚,说说大家可能不清楚的二进制代码翻译技术。二进制翻译技术简称BT,是一种直接翻译可执行二进制程序的技术,能够把一种处理器上的二进制程序翻译到另外一种处理器上执行。二进制翻译技术将机器代码从源机器平台映射(翻译)至目标机器平台,包括指令语义与硬件资源的映射,使源机器平台上的代码“适应”目标平台。因此翻译后的代码更适应目标机器,具有更高的运行时效率。二进制翻译系统是位于应用程序和计算机硬件之间的一个软件层,它很好地降低了应用程序和底层硬件之间的耦合度,使得二者可以相对独立地发展和变化。二进制翻译也是一种编译技术,它与传统编译的差别在于其编译处理对象不同。传统编译处理的对象是某一种高级语言,经过编译处理生成某种机器的目标代码;二进制翻译处理的对象是某种机器的二进制代码,该二进制代码是通过传统编译过程生成的,经过二进制翻译处理后生成另一种机器的二进制代码。

根据不同的实现方式,二进制翻译技术可分为三大类:解释执行,静态翻译和动态翻译。

ü  代码解释执行

解释执行(Interpretation)过程对源机器代码中的每条指令实时解释执行,系统不保存且不缓存解释过的指令,不需要用户干涉,也不进行任何优化。解释器相对容易开发,比较容易与老的体系结构高度兼容,但效率很差。

ü  静态二进制翻译

在静态二进制翻译(SBT,Static BinaryTranslation)中,代码在运行之前被离线翻译,根据目标机器的指令结构生成一个新的程序,然后直接执行这个翻译后生成的程序。静态翻译器的离线翻译过程不会给程序运行带来额外开销,因此可以充分采用各种优化措施生产高质量代码,大大提高运行时效率。

ü  动态二进制翻译

动态二进制翻译(DBT,Dynamic BinaryTranslation)则在程序运行时对执行到的代码片段进行翻译,克服了静态翻译所无法解决的一些困难,如运行时动态信息收集,代码挖掘,自修改代码和精确中断问题。而且动态翻译器对用户完全透明,无需用户干预。虽然动态翻译有上述诸多优点,翻译过程却由于受到动态执行的限制而不能像静态翻译那样进行完全细致的优化,使得翻译生成的代码效率比静态翻译器差。

三种二进制翻译技术的比较

解释执行是最易实现的一种翻译技术,但是其繁琐的实现方式大大降低了翻译系统的执行效率。静态翻译虽然能提供高效的运行时性能,但由于无法在静态环境下覆盖所有代码,无法脱离对解释器的依赖。与上述两种相比,动态翻译很好的解决了代码覆盖、自修改代码和精确中断等诸多问题,同时也能提供可接受的执行效率。因此VMware基于动态二进制翻译技术实现了x86架构的CPU的虚拟化。

典型动态二进制翻译系统结构所示,被翻译的代码称为源机器代码,在宿主机上运行的代码称为目标机器代码,一个典型的动态二进制翻译器主要包括两个模块:翻译引擎和执行引擎。其中翻译器引擎负责将源机器代码翻译代码翻译成目标机器代码;执行引擎负责准备目标机器代码运行的上下文环境(Execution Context)然后从目标机器代码缓存中找到源机器代码对应的目标代码并执行。

其基本运行流程如下:

ü  查找(Lookup)阶段

这个阶段查询目标代码块是否存在于目标代码缓存中,如果存在则返回目标块入口地址,如果不存在则进入翻译阶段。

ü  上下文切换(Context Switch)阶段

当一个目标代码块被查询到或者翻译模块生成的时候,二进制翻译系统会执行一次控制权转移。系统会把控制权交给执行模块去运行该目标代码块,目标代码块运行完毕后系统需要恢复执行引擎的控制权。一次控制权转移需要保存程序的上下文环境。

ü  翻译(Translation)阶段

完成从源机器二进制代码到目标机器二进制代码的翻译。包括解码、中间代码优化、编码三个子阶段。

ü  执行和链接(Executing & Linking)阶段

当基本块被翻译生成目标代码块之后,依照源代码的控制流完成目标代码块之间的直接以及间接跳转的链接,并依次运行目标代码块。

3、总结

在没有CPU硬件辅助虚拟化技术之前,对于X86架构的CPU就采用模拟和二进制翻译的技术对CPU进行虚拟化实现,但是模拟的方式存在固有缺陷,并不完全虚拟化了x86的CPU架构。而二进制翻译技术则采用完全不同的思路实现了x86架构的CPU虚拟化。其实对于x86的CPU虚拟化,其难点就在于对其特权指令和敏感指令的虚拟化实现,当然,在实现了CPU的指令这一难题之后,还有一个难题在等着我们!那就是x86架构的CPU调度问题?

在虚拟化环境下,x86架构的CPU有什么调度问题?

1、 虚拟CPU和物理CPU之间的对应关系?

2、 虚拟CPU和物理CPU之间的资源分配?

3、 虚拟CPU和虚拟CPU之间的优先级?

4、 多核虚拟CPU架构vSMP和vNUMA与物理多核CPU架构SMP和NUMA之间的调度和负载均衡?

我们这个问题的留在第四天讲,明天我们讲讲x86架构的CPU半虚拟化技术。后天我们讲讲x86架构的CPU硬件辅助虚拟化技术。第四天我们就讲讲CPU调度。

欲知后事如何,且听下回分解!

时间: 2024-10-19 06:53:37

CPU纯软件全虚拟化技术的相关文章

CPU纯软件半虚拟化技术

在2003年出现的Xen,使用了另外的一种半虚拟化的方案来解决x86架构下CPU的敏感指令问题.主要采用Hypercall技术.Guest OS的部分代码被改变,从而使Guest OS会将和特权指令相关的操作都转换为发给VMM的Hypercall(超级调用),由VMM继续进行处理.而Hypercall支持的批处理和异步这两种优化方式,使得通过Hypercall能得到近似于物理机的速度. 1.Hypercall技术 对于x86体系结构CPU,Xen使用超级调用来替换被监控的操作,其中包括x86架构

纯软件半虚拟化

虚拟化是一块"肥肉",思杰公司也想分一杯羹,于2003年推出了XEN虚拟化解决方案,它采用的解决方案与vmware公司的虚拟化有些不同,但是vmware公司已经占据了市场的制高点,成了虚拟化市场的霸主.我们下面来看一下,思杰公司是如何解决X86架构CPU的缺陷的,这里的缺陷就是指的是敏感指令并不全是特权指令.hypercall超级调用思杰公司采用hypercall的技术解决部门敏感指令不能被捕捉的问题.他们的思路有点像<×××帝国>的"莫费斯",他告诉了

KVM虚拟化技术(一)虚拟化简介

一 .虚拟化 虚拟化是指计算机元件在虚拟的基础上而不是真实的基础上运行.虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程.CPU的虚拟化技术可以单CPU模 拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率. 虚拟化的类型: 全虚拟化 半虚拟化(涉及修改guestos内核,因此仅支持开源kernel的系统) 硬件辅助虚拟化(主板上开启虚拟化支持) 几种虚拟化软件简介 KVM 完全虚拟化 架构:寄居架构(linux

虚拟化技术简介(转载学习)

虚拟化 虚拟化是指计算机元件在虚拟的基础上而不是真实的基础上运行.虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程.CPU的虚拟化技术可以单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率. 几种虚拟化软件 1.RedHat KVM虚拟化方式:完全虚拟化 架构:寄居架构(linux内核);祼金属架构RHEV-H 特点:祼金属架构RHEV-H或在关键的硬盘和网卡上支持半虚拟化VirtIO,达到最佳性能.

虚拟化技术研究及架构分析

什么是虚拟化 虚拟化是指计算机元件在虚拟的基础上而不是真实的基础上运行.虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程.CPU的虚拟化技术可以单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率. 几种虚拟化软件介绍 RedHat KVM 虚拟化方式:完全虚拟化 架构:寄居架构(linux内核);祼金属架构RHEV-H 特点:祼金属架构RHEV-H或在关键的硬盘和网卡上支持半虚拟化VirtIO,达到最佳

Amzaon EC2虚拟化技术演进:从 Xen 到 Nitro

今年2月,由光环新网运营的 AWS 中国(北京)区域和由西云数据运营的 AWS 中国 (宁夏)区域发布新的实例类型,新的实例类型包括 C5.C5d.R5.R5d.除了这四种之外,在AWS国外部分区域还上线了最新的C5n. 这些新实例类型个个都具有鲜明的特征,我简单整理归纳如下: C5实例:性价比显著提升(与 C4 实例相比,C5 实例提供了更高的内存与 vCPU 比率,并且性价比提高了 25%,某些应用程序提高了 50% 以上),更大的实例大小(C5 实例新的更大的实例 c5.18xlarge提

虚拟化技术原理(CPU、内存、IO)

本文来自:http://www.ywnds.com/?p=5856 虚拟化 云计算现在已经非常成熟了,而虚拟化是构建云计算基础架构不可或缺的关键技术之一. 云计算的云端系统, 其实质上就是一个大型的分布式系统. 虚拟化通过在一个物理平台上虚拟出更多的虚拟平台, 而其中的每一个虚拟平台则可以作为独立的终端加入云端的分布式系统. 比起直接使用物理平台, 虚拟化在资源的有效利用. 动态调配和高可靠性方面有着巨大的优势. 利用虚拟化, 企业不必抛弃现有的基础架构即可构建全新的信息基础架构,从而更加充分地

[虚拟化] CPU虚拟化技术 - Introduction

虚拟化技术的分类主要有服务器虚拟化.存储虚拟化.网络虚拟化.应用虚拟化. 服务器虚拟化技术按照虚拟对象来分,可分为:CPU虚拟化.内存虚拟化.I/O虚拟化: 按照虚拟化程度可分为:全虚拟化.半虚拟化.硬件辅助虚拟化. 将不同的虚拟化对象和程度组合,可得出 9种 不同的服务器虚拟化技术. 首先详细介绍下服务器虚拟化之CPU虚拟化,后续讲解中再详细介绍内存虚拟化及I/O虚拟化. 二.CPU虚拟化 ·CPU全虚拟化技术 主要采用优先级压缩技术(Ring Compression)和 二进制代码翻译技术(

全虚拟化和半虚拟化的区别 cpu的ring0~ring3又是什么概念?

ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之-- 拿Linux+x86来说, 操作系统(内核)的代码运行在最高运行级别ring0上,可以使用特权指令,控制中断.修改页表.访问设备等等. 应用程序的代码运行在最低运行级别上ring3上,不能做受控操作.如果要做,比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系统调用的时候,CPU的运行级别会发生从ring3到ring0的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问