处理器虚拟化简介
1、处理器虚拟化是VMM(Hypervison)中最核心的部分,因为内存或者I/O的指令本身就是敏感指令,所以内存虚拟化与IO虚拟化都依赖与处理器虚拟化的正确实现。
1)、指令模拟
VMM运行在最高特权级,可以控制处理器上所有关键资源;而客户机操作系统运行在非最高特权级。所以其敏感指令会陷入到VMM中通过软件的方式进行模拟。从客户机操作系统的角度而言,无论是一条指令是直接执行在物理处理器上,还是被VMM软件模拟,其期望的执行效果必须正确。所以处理器虚拟化的关键在于正确模拟指令的行为。
在介绍指令模拟之前,我们理解三个概念:虚拟寄存器、上下文和虚拟处理器。它们有助于理解虚拟处理器模拟指令。
从某种程度上来说,物理处理器无非包括了一些存放数据的物理寄存器,并且规定了使用这些寄存器的指令集,然后按照一段预先写好的指令流,在给定的部分寄存器来完成某种目的。
在没有虚拟化的环境里,操作系统直接访问物理处理器,处在最高特权级别,可以控制系统中所有关键资源,包括寄存器、内存和I/O外设等。但是当VMM接管物理处理器后,昔日的操作系统称为客户机操作系统而降级到非最高特权级别上,这时,其试图访问关键资源的指令就称为了敏感指令。VMM会通过各种手段,保证这些敏感指令的执行能够触发异常,从而陷入到VMM进行模拟,以防对VMM自身的运行造成破坏。
所以,当客户机操作系统试图访问关键资源的时候,该请求并不会真正发生在物理寄存器上,相反,VMM会通过准确的模拟物流处理器的行为,而将其访问定位到VMM为其设计与物理寄存器对应的“虚拟”的寄存器上。当然,从VMM实现来说,这样的虚拟寄存器往往是在内存中。
当处理器取下一条指令MOV CR0,EAX后,发现特权级别不符合,则抛出异常,VMM截获这个异常之后模拟处理器的行为,读取EAX的内容并存放到虚拟的CR0中。由于虚拟的CR0存放在VMM为该虚拟机设置的内存区域里,因此该指令执行的结果并不会让物理的CR0的内容发生改变。等到下一次,当虚拟机试图读CR0时,处理器也会抛出异常,然后由VMM从虚拟的CR0而不是物理的CR0中返回内容给虚拟机。
在没有虚拟化的环境里,操作系统直接负责处理器管理,负责进程间调度和切换。但是,VMM接管处理器后,客户机操作系统没有管理物理处理器的权利,可以说此时它已经运行在VMM为之设计的虚拟处理器之上,管理虚拟处理器,并在虚拟处理器上负责该虚拟机内进程间调度和切换。而VMM管理物理处理器,负责虚拟处理器的调度和切换,以保证在给定时间内,每个虚拟处理器上的当前进程可以在物理处理器上运行一段时间。但是,不管是何种 调度切换,必然要涉及到保留现场,这个现场就是上下文状态,只不过前一种情况是进程上下文,后一种情况是虚拟处理器上下文。为了让读者更好地理解,我们从进程上下文开始类比的介绍。
通过之前的内存介绍,在某个时刻,物理处理器中的寄存器状态构成了当前进程上下文状态。
进程上下文主要是与运算相关的寄存器状态,例如EIP寄存器指向进程当前执行的指令,ESP存放着当前进程的堆栈指针等。当操作系统进行调度时,当前进程的上下文,即上述寄存器状态被保存在进程特定的内存区域中。而下一个进程的上下文被恢复到相应的寄存器中,从进程的角度看,就好像从未被中断一样。
虚拟处理器上下文比进程上下文更为复杂,因为客户机操作系统本身包含许多敏感指令,会试图访问和修改物理处理器上定义的所有寄存器,而这种访问和修改会被VMM重定位到虚拟处理器上。所以对于虚拟处理器,其上下文包括了更多的系统寄存器,例如CR0、CR3、CR4和各种MSR等。当VMM在决定切换虚拟处理器的时候,为了让虚拟机看来好像也从未被中断一样,VMM需要考虑保存与恢复的上下文也更为复杂。
我们没有介绍虚拟处理器,但是上面已经谈到虚拟处理器,那什么是虚拟处理器?虚拟处理器其实也是一个虚拟的概念,一个逻辑上而非物理上的概念,可以从两个角度来理解。
首先,从客户机操作系统来说,其在运行的处理器需要具备与其“期望”的物理处理器一致的功能和行为,这种“期望”的前提条件甚至可以允许客户机操作系统的修改,例如VMM可以通过修改客户机操作系统的源代码,使客户机操作系统所“期望”的与VMM所呈现的功能集合一致。典型的“期望”包括:
1、指令集合与执行效果。
2、可用寄存器集合,包括通用寄存器以及各种系统寄存器。
3、运行模式,例如实模式、保护模式和64位长模式等。处理器的运行模式决定了指令执行的效果,寻址宽度与限制以及保护粒度等。VMM必须正确模拟虚拟机期望的运行模式,否则会对虚拟机甚至是VMM自身的运行产生严重影响。
4、地址翻译系统,例如页表级数。
5、保护机制,例如分段和分页。
6、中断/异常机制,例如虚拟处理器必须能够正确模拟真实处理器的行为,在错误的执行条件下,为虚拟机注入一个虚拟机的异常。
其次,从VMM的角度来说,虚拟处理器是其需要模拟完成的一组功能集合。虚拟处理器的功能可以由物理处理器和VMM共同完成。对于非敏感指令,物理处理器直接解码处理其请求,并将相关的效果直接反映到物理寄存器上;对于敏感指令,VMM负责陷入再模拟,从程序的角度也就是一组数据结构与相关处理代码的集合,数据结构用于存储虚拟寄存器的内容,而相关处理代码负责按照物理处理器的行为将效果反映到虚拟寄存器上。
值得一提的是,VMM已经可以为虚拟机呈现出于实际物理机不一致的功能和行为。例如:虚拟处理器的个数,可以与物理处理器的个数不一致。在有多个物理处理器的平台上,VMM可以让虚拟机看到该平台好像只有一个物理处理器,而在只有一个物理处理器的平台上,VMM可以让虚拟机看到该平台好像有多个物理处理器。这种效果完全取决于用户对虚拟环境的配置,以及VMM自身的策略。
在介绍完以上三个概念之后,基本上也就了解了在处理器虚拟化中,不论是定义虚拟寄存器和虚拟处理器,还是利用上下文进行虚拟处理器调度切换,其宗旨都是让虚拟机里执行的敏感指令陷入下来后,能被VMM模拟,而不要直接作用在真实的硬件上。
总结
- 上一篇: 【51单片机快速入门指南】4.3: I2
- 下一篇: 通达信手机版分时图指标大全_通达信手机版