在虚拟机器中使用合成指令的系统和方法

文档序号:6431679阅读:324来源:国知局
专利名称:在虚拟机器中使用合成指令的系统和方法
技术领域
本发明一般涉及操作系统领域,尤其涉及虚拟机器(或处理器虚拟化)可理解但被预定义处理器体系结构(如,x86体系结构)定义为“非法”的指令的应用,使得当在虚拟机器环境内执行时,本发明使用这些指令来执行定义好了的合法行动。在某种意义上,本发明向预先存在的指令集添加了“合成”指令。
背景技术
虚拟机器计算机包括被设计成执行一组具体的系统指令的一般中央处理单元(CPU)。一组具有类似的体系结构或设计规范的处理器可被认为是同一处理器家族的成员。当前的处理器家族包括由亚利桑那州凤凰城的Motorola公司制造的Motorola680×0处理器家族;由加利福尼亚州桑尼维尔市的Intel公司制造的Intel 80×86处理器家族;以及由Motorola公司制造且在加利福尼亚州的库珀蒂诺市的Apple计算机公司制造的计算机中使用的PowerPC处理器家族。尽管由于其类似的体系结构和设计规范,一组处理器可以在同一家族中,然而依照其时钟速度和其它性能参数,有关家族中的处理器可有很大的不同。
每一微处理器家族执行对处理器家族唯一的指令。处理器或处理器家族能够执行的一组共同的指令被称为处理器指令集。作为示例,由Intel 80×86处理器家族使用的指令集与由PowerPC处理器家族使用的指令集不兼容。Intel 80×86指令集基于复杂指令集计算机(CISC)格式。Motorola PowerPC指令集基于精简指令集计算机(RISC)格式。CISC处理器使用大量的指令,某些指令可执行相当复杂的功能,但是某些一般需要许多时钟周期来执行。RISC处理器使用较少数量的可用指令来执行以更高速率执行的一组更简单的功能。
处理器家族在计算机系统中的唯一性通常也导致计算机系统的硬件体系结构的其它元件间的不兼容性。使用来自Intel 80×86处理器家族的处理器制造的计算机系统将具有不同于使用来自PowerPC处理器家族的处理器制造的计算机系统的硬件体系结构的硬件体系结构。由于处理器指令集和计算机系统的硬件体系结构的唯一性,通常书写应用程序软件以运行在运行特定操作系统的特定计算机系统上。
计算机制造商希望通过令更多而不是更少的应用程序运行在与计算机制造商的生产线关联的微处理器家族上来将其市场占有率最大化。为扩充可运行在计算机系统上的操作系统和应用程序的数量,开发了一种技术领域,其中,具有一种类型的CPU的给定计算机,称为主机,将包括允许主计算机仿真不相关类型的称之为访客的CPU指令的仿真器程序。由此,主计算机将执行促使一个或多个主机指令响应于给定访客指令而被调用的应用程序。由此,主计算机既可以运行为其自己的硬件体系结构设计的软件,又可以运行为具有不相关的硬件体系结构的计算机书写的软件。作为一个更具体的示例,例如,由Apple计算机公司制造的计算机系统可运行为基于PC的计算机系统书写的操作系统和程序。也可以使用仿真器程序在单个CPU上并发地操作多个不兼容的操作系统。以这一方案,尽管每一操作系统与其它操作系统不兼容,仿真器程序可主存(host)两个操作系统之一,允许其它不兼容的操作系统在同一计算机系统上并发地运行。
当在主计算机系统上仿真访客计算机系统时,访客计算机系统被称为虚拟机器,因为主计算机系统仅作为访客计算机系统的硬件体系结构的操作的软件表示存在。术语仿真器和虚拟机器有时候可以互换使用,来表示模拟或仿真整个计算机系统的硬件体系结构的能力。作为一个示例,由加利福尼亚州的圣马特奥市的Connectix公司创建的Virtual PC软件仿真包括Intel 80×86Pentium处理器和各种主板组件和卡的整个计算机。这些组件的操作在运行在主机器上的虚拟机器中仿真。在主计算机,如具有PowerPC处理器的计算机系统的操作系统软件和硬件体系结构上执行的仿真器程序模拟了整个访客计算机系统的操作。仿真器程序担当主机器硬件体系结构和由运行在仿真环境中的软件发送的指令之间的互换的角色。
x86体系结构“x86”是使用x86指令集体系结构(ISA)的所有微处理器家族系列的类属名。IA32是由Intel开发的使用x86 ISA的具体的处理器体系结构。x86由Intel的8086微处理器开始。x86处理器包括但不限于,Intel的8086、286、386、486、Pentium、具有MMX的Pentium、Pentium PRO、Pentium II、Pentium III和Pentium 4处理器家族,以及先进微设备(AMD)的K5、K6、K6-2、K6-3、Athlon、增强Athlon(称为“雷鸟(thunderbird)”)、Atholon 4和Athlon MP、Athlon 64、Opteron等等。
虚拟机器监控器(VMM)是直接运行在硬件之上的软件层,并且VMM通过展现与VMM正在虚拟化的硬件相同的接口来将机器的所有资源虚拟化(令VMM变得不被其上运行的操作系统层注意)。然而,x86体系结构,包括IA32体系结构及其类似物,包含呈现VMM实现的许多问题的虚拟化漏洞。首先,x86体系结构未将所有处理器状态划分成特许状态或用户状态,其中,特许状态应当包括指示当前特许级别以及需要在基础操作系统(或“监控层”)下控制来实现用户级应用程序实例之间的资源控制和保护屏障的其它资源的任一控制或状态域等等。第二,当在用户级尝试对特许状态的访问(不论是读还是写)时,x86体系结构在所有情况下都不引发俘获。第三,x86体系结构没有用于当用户级代码尝试访问应当被虚拟化的非特许状态(如,定时器值、性能计数器、处理器特征寄存器)时引发俘获(trap)的装置。第四,尽管所有存储器内(in-memory)处理器结构应当被储存在当前地址空间之外或在VM内被保护以免遭错误或恶意的存储器访问,x86体系结构不允许该结构。第五也是最后,x86体系结构不能在处理了中断或俘获之后将其中断或俘获时的所有的处理器状态恢复成其预俘获状态。

发明内容
x86体系结构的上述这些许多缺点和限制由当期望时不能引发俘获的指令引起。换言之,如果这些指令相反能引发俘获,则虚拟机器监控器(VMM)可以正确地将这些指令虚拟化。
本发明通过引入引发俘获并由此为虚拟机器(VM)提供安全地处理指令的机会的“合成指令”,弥补了x86处理器体系结构中的缺点。通过使用对x86体系结构“非法”但仍可由虚拟机器理解的指令,本发明的方法使用了合成指令来虚拟机器中执行较佳定义的行动,这些行动当由x86处理器上执行的传统指令执行时会有问题,并且由此,本发明为x86处理器系统提供了更加改进的处理器虚拟化。


当结合附图阅读时,可以更好地理解以上概述以及以下较佳实施例的详细描述。为说明本发明的目的,在附图中示出了本发明的示例性构造;然而,本发明不限于所揭示的具体的方法和手段。附图中图1示出了包括直接运行在计算机硬件上并与两个虚拟机器(VM)交互的虚拟机器监控器(VMM)软件层的虚拟化计算系统;图2示出了图1的虚拟化计算系统,但还包括直接与计算机硬件交互的主机(本机)操作系统。
图3是在主计算机系统中运行的仿真计算机系统的元件的逻辑关系的示图;图4示出了x86处理器(尤其对IA32体系结构)的EFLAGS寄存器;图5示出了虚拟机器监控器(VMM)通常认可的四种不同的处理器模式分类。
图6是x86指令的表,它展现了这样一个事实,被认为是环0代码事实上运行在较高的环级别,这是传统的x86处理器虚拟化方法的问题。
图7是指令集的表,它展现了这样一个事实,虚拟机器为访客操作系统投影了某些x86处理器信息。
图8是为虚拟化目的必须俘获但是在x86体系结构中未俘获的指令的表。
图9是涉及x86体系结构中IF和IOPL领域的有问题的指令的表。
图10所示是用于通过优化OS代码并使用“合成指令”改进IA32中的虚拟化的方法的一个实施例的流程图。
具体实施例方式
使用特殊性描述了本发明的主题来满足法定需求。然而,该描述本身并非限制本申请的范围。相反,发明人考虑所要求权利的主题也可以结合其它当前或未来的技术以其它方式来实施,以包括与本文档所描述的步骤类似的不同步骤或其组合。此外,尽管此处可使用术语“步骤”来意味着所采用的方法的不同元素,该术语不应当被解释为暗示此处所揭示的各种步骤之间或之中的任何特定顺序,除非当明确描述了个别步骤的顺序。最后,尽管后文的讨论有时会集中在IA32体系结构和/或x86处理器家族上,本揭示并非局限到这些分组,并且因此任一这样的讨论明确地包括可向其应用和/或使用本发明的各种实施例的所有可应用的处理器体系结构,包括但不限于,x86处理器体系结构及其等效体系结构,并明确地包括IA32和IA64体系结构及其等效体系机构、扩充和衍生方案。
计算机微处理器微处理器是微芯片上的计算机处理器。它被设计成执行利用小的数字保留区用于将当前GDT基础和长度储存到EAX的合成指令(如VMSGDT);用于将当前LDT选择器储存到EAX的合成指令(如VMSLDT);用于将当前IDT基础和长度储存到EAX的合成指令(如VMSIDT);以及用于将当前TR选择器储存到EAX的合成指令(如VMSTR)。
48.如权利要求46所述的系统,其特征在于,所述合成指令还包括用于清除虚拟化IF的合成指令(如VMCLI);以及用于设置虚拟化IF的合成指令(如VMSTI)。
49.如权利要求46所述的系统,其特征在于,所述合成指令还包括,俘获并处理用于确定自旋锁采集何时失败的合成指令。
50.如权利要求46所述的系统,其特征在于,所述合成指令还包括用于返回标识所述中央处理单元的身份的值的合成指令(如VMCPUID)。
51.如权利要求50所述的系统,其特征在于,所述合成指令的十六进制操作代码是OF C7 C8 01 00。
52.一种包括用于改进x86处理器体系结构及其等效体系结构中的处理器虚拟化的计算机可读指令的计算机可读媒质,所述体系结构包括但不限于IA32体系结构,其特征在于,所述计算机可读指令包括在所述x86处理器中引发随后由运行在所述x86处理器上的虚拟机器监控器俘获的异常,用于由所述虚拟机器监控器处理的合成指令。
53.如权利要求52所述的计算机可读指令,其特征在于,它还包括指令,其中所述访客操作系统中的至少一个多处理器自旋锁指令用确定自旋锁采集何时失败的合成指令(如VMSPLAF)来补充。
54.如权利要求52所述的计算机可读指令,其特征在于,它还包括用于返回表示中央处理单元的身份的值的合成指令(如VMCPUID)。
55.如权利要求52所述的计算机可读指令,它还包括使IF入栈的合成指令(如VMPUSHFD)。
56.如权利要求52所述的计算机可读指令,其特征在于,它还包括使IF出栈的合成指令(如VMPOPFD)。
57.如权利要求52所述的计算机可读指令,其特征在于,它还包括将当前GDT基础和长度储存到EAX的合成指令(如VMSGDT)。
58.如权利要求52所述的计算机可读指令,其特征在于,它还包括将当前LDT选择器储存到EAX的合成指令(如VMSLDT)。
59.如权利要求52所述的计算机可读指令,其特征在于,它还包括将当前IDT基础和长度储存到EAX的合成指令(如VMSIDT)。
60.如权利要求52所述的计算机可读指令,其特征在于,它还包括将当前TR选择器储存到EAX的合成指令(如VMSTR)。
61.如权利要求52所述的计算机可读指令,其特征在于,它还包括清除虚拟化IF的合成指令(如VMCLI)。
62.如权利要求52所述的计算机可读指令,其特征在于,它还包括设置虚拟化IF的合成指令(如VMSTI)。
63.如权利要求52所述的计算机可读指令,其特征在于,它还包括用于确定所述指令是运行在虚拟化处理器上还是直接运行在x86处理器上的指令,所述指令包括用于执行用于返回表示中央处理单元的身份的值的合成指令的指令;以及用于确定是否返回了对应于中央处理单元的身份的值,并且(a)如果是这样,则使用合成指令,以及(b)如果不是,则中止使用合成指令的指令。
64.如权利要求63所述的计算机可读指令,其特征在于,所述合成指令的十六进制操作代码是OF C7 C8 01 00。
65.一种用于当在x86处理器机器体系结构及其等效体系结构上执行时处理合成指令的系统,所述体系结构包括但不限于IA32体系结构,所述系统包括移除、替换或补充访客操作系统中以下预定义指令的一个或多个实例PUSHCS、PUSH SS、来自SS的MOV、CALLF、VERR、VERW和LAR。
66.一种用于优化访客操作系统以改进当在x86处理器体系结构及其等效体系机构上执行时处理器虚拟化的方法,所述体系结构包括但不限于IA32体系结构,其特征在于,所述方法包括移除、替换或补充访客操作系统中以下预定义指令的一个或多个实例PUSHCS、PUSH SS、来自SS的MOV、CALLF、VERR、VERW和LAR;用读取虚拟化CPUID信息的合成指令(如VMCPUID)来替换访客操作系统中的CPUID;用确定自旋锁采集何时失败的合成指令(如VMSPLAF)来补充访客操作系统中的自旋锁指令;
对于用户级代码的直接执行,任一对特许的破坏由VMM捕捉,并继续传递到访客的异常处理器。然而,特许级代码的直接执行涉及在用户级上运行特许级代码,尽管事实是用特许级代码将对该处理器的所有特许状态元件具有完全的访问的假定来书写特许级代码。为协调这-不一致性,VM依赖于处理器来对所有特许指令(即,直接或间接访问特许状态的指令)生成俘获。特许破坏俘获调用虚拟机器监控器(VMM)内的俘获处理器。VMM俘获处理器然后仿真特许指令的暗指状态变化,并将控制返回至随后的指令。特许指令的这一仿真通常涉及对具体VM实例专有的阴影状态的使用。
例如,如果处理器体系结构包括仅在特许模式中可访问的特许模式寄存器(PMR),则从用户级代码对PMR的读取或写入的任一尝试都会引发俘获。VMM俘获处理器确定俘获的起因,并参考对该关联的VM的实例专有的阴影值。(该PMR值可以与当前保留在主机处理器的PMR中的值不同。)取决于俘获指令的频率以及处理俘获的成本,该技术将遭受相对小但引人注意的性能恶化。例如,由IBM和Amdahl开发的某些VMM以本机速度的80-98%执行,由此由于该俘获额外开销有2-15%的净性能丢失。
x86/IA32的限制供虚拟化使用的理想化处理器被称为是严格虚拟化的-即,可严格虚拟化的处理器允许实现满足以下需求的直接执行虚拟化机制(a)该VMM必须能够处于处理器和系统资源的“控制”之下。
(b)在该VM下运行的软件(不论是在用户还是在特许级)应当无法告知它正在虚拟机器中运行。
为满足这些需求,可严格虚拟化处理器展现以下特性·结合存储器管理单元(MMU)或类似的地址翻译机制·提供两个或多个特许级别·将所有处理器状态划分成特许状态或用户状态;特许状态应当包括指示当前特许级别的任一控制或状态域·当在用户级上试图访问特许状态(不论读还是写)时引发俘获·具有当用户级代码试图访问应当被虚拟化的非特许状态(如,定时器值、性能计数器、处理器特征寄存器)时可任选地引发俘获的手段
·所有存储器内处理器结构储存在当前地址空间之外,或可被保护免遭VM内有误或恶意存储器访问·在中断或俘获时刻的任一处理器状态可在处理了中断或俘获之后被恢复成其俘获前状态若干现代的处理器-仅举几个例子,包括PowerPC和DEC Alpha-满足这些需求。然而,IA32不满足-它仅满足前两个需求。由此,IA32包含对VMM实现呈现若干挑战性的许多虚拟化漏洞。
首先,IA32体系结构在若干实例中违背了用户/特许状态分隔的需求,其最重要的涉及如图4所示的用户和特许状态的EFLAGS寄存器。以下EFLAGS域应当被认为是特许的VIP、VIF、VM、IOPL和IF。(所有其它域表示用户状态,并且不需要被特许。)然而,对于IA32,当从用户模式执行对EFLAGS寄存器的特许域(包括PUSHF/PUSHFD、POPF/POPFD和IRET)进行读写的指令时,它们不被俘获,并且在IA32中没有强迫这些指令被俘获的手段。
此外,在IA32中,PUSHF和POPF指令通常在访客内核(环0)代码中使用来保存并恢复IF(中断启用标记)的状态。在虚拟机器中,该内核代码在较高环级(如,环1)上执行,且设置IOPL使得IN/OUT指令俘获。由于运行在VM内的操作系统(OS)不应当被允许禁用主机处理器上的中断,在虚拟机器代码运行时实际的IF值被设为1,不论虚拟IF的状态如何。因此,PUSHF指令总是将具有IF=1的EFLAGS推入栈,并且POPF指令总是忽略出栈的EFLAGS值中的IF域。
除EFLAGS寄存器之外,特许和用户状态被混合的两个另外的区域在CS和SS寄存器中。这些寄存器的最低两位包含作为特许状态的当前特许级(CPL),而这些寄存器的较高的十四位包含非特许的段索引和描述符表选择器。当从用户模式执行明确或隐含地访问CS或SS选择器的指令(包括SS的CALLF、MOV和PUSH SS)时,不俘获。注意,其它指令促使CS或SS被推入栈(如,通过调用门的INT、INTO、JMPF,通过调用门的CALLF),但是这些指令可以被俘获,允许VMM虚拟化被推入栈的CPL值。
允许用户级代码直接访问特许处理器状态的x86/IA32保护模型的另外的不适当性包括以下指令SGDT、SIDT、SLDT、SMSW和STR。由于各种原因,GDT、LDT、IDT和TR的投影对正确的虚拟化是必需的,这意味着TR、GDTR和IDTR将指向VMM的阴影表,而不是由访客操作系统指定的表。然而,由于非特许代码可从这些寄存器读取,不可能正确地虚拟化其内容。另外,当从非特许状态执行时,在GDT和LDT内访问描述符的若干指令,包括LAR、LSL、VERR和VERW,它们不俘获。由于GDT/LDT投影是必需的,这四个指令可在VM内不正确地执行。此外,CPUID指令不俘获。为在虚拟机器内模拟新处理器特征或禁用处理器特征,重要的是在从非特许模式执行时能够俘获在CPUID上。
另外,VM环境内的上下文切换依赖于保存和恢复处理器的整个状态的能力,但是IA32未允许这一能力。更具体地,六个段(DS、ES、CS、SS、FS和GS)的每一个的高速缓存的描述符状态在重加载段时被储存在处理器内部,并且该信息不可以通过任一体系结构定义的机制来访问。因此,这是对正确虚拟化的重大的障碍。例如,如果一个代码片断加载了一个段,然后修改了对应于该段的存储器内描述符,则随后的内容切换将无法正确地恢复原始的段描述符信息。同样,如果处理器在实时模式中操作,并且然后切换到保护模式,则该段将包含不对应于保护模式GDT/LDT内的描述符的选择器,并且这一点上的上下文切换将无法正确地恢复最初在实时模式中加载的高速缓存的描述符。
同样,当在多处理器(MP)VM上将PAUSE指令(最近被添加来提供关于自旋锁执行的超线程处理器提示的NOP的前缀形式)用于自旋锁时,将导致问题。例如,一个虚拟处理器可在由第二虚拟处理器持有的锁上自旋,并且如果第二虚拟处理器运行在当前未执行的线程上时,第一虚拟处理器将自旋很长一段时间,并由此浪费了处理器循环。尽管如果VM自旋时可以通知虚拟机器监控器将是有用的-以允许VMM调度另一VM运行或发信号通知第二虚拟处理器线程来调度-然而当前没有这样的通知方法可用。
某些VM环境使用了若干种不同的技术来解决这些缺点,并一般以混合方式采用了仿真和直接执行。基于处理器模式和从OS本身衍生的其它信息选择具体的技术。对于这一系统,如图5所示一般由VMM认可四种不同的处理器模式分类。在环0模式(用于大多数现代OS内核级代码)的情况下忽略默认行为是可能的-且期望的。下文描述的大部分讨论了通过直接执行机制安全地执行所有环0代码的需求。
许多VM环境利用一种称作“环压缩”的技术(首先由DEC工程师用于虚拟化VAX体系结构)。环压缩涉及在较不特许的环(如环1)内执行环0代码以允许VMM俘获访问虚拟化资源的某些特许级指令。例如,IA32页表基础指针被储存在CR3寄存器内。读CR3的指令仅在环0内可执行。当从环1执行时,该指令促使处理器生成俘获(具体地,类型6的“非法操作”异常)。在俘获时,VMM获取控制并仿真该指令,返回虚拟化的(访客处理器的)CR3而非VMM(主机处理器的)CR3。
在很大程度上,VMM能够隐藏预期在环0执行的代码实际上在不同的环级中执行的事实。在前面的示例中,访问CR3的代码不知道已出现俘获的事实,因为所有与该指令关联的重要的状态变化都被仿真。然而,IA32虚拟化的这些缺点阻碍了环压缩完全不透明。图6所示的指令揭示了这一事实环0代码运行在较高环级,并且使用这些指令的代码是有问题的,而且在直接执行环境内运行一般是不安全的。
另外,IA32体系结构包括全局和局部的描述符表(分别为GDT和LDT)。这些表包括代码和数据段以及控制环间转移的门。访客OS可设置其GDT或LDT以允许在环3和环0之间转移。然而,VMM不允许直接到环0的任一转移,因为这将给予访客OS对主机处理器的直接控制。相反,VMM必须涉及到环0的任一转移,以使它能够正确地将执行重定向到较低特许的环级。这意味着VMM不能直接使用访客的GDT和LDT。相反,它必须将访客的GDT和LDT的内容投影到专用表,在需要时作出调节来防止任一直接到环0的转移。这些调节被局限在DPL(描述符特许级)域和描述符类型域的代码位上。由于这些较小的修改,被投影的描述符表将与访客描述符表有略微的差异。
在大多数情况下,这些差异对软件不可见;然而,如图7所示,在IA32体系结构中有揭示这一差异的若干指令。例如,VMM写保护了重叠访客GDT和LDT的页,使得修改这些表的任一尝试将导致VMM内的写保护错误。作为响应,VMM确保对访客GDT或LDT的变化在其内部阴影表内反映。然而,当修改了对应于当前加载的选择器的GDT或LDT条目时,对相应的存储器内描述符的修改是不可逆的,因为IA32体系结构不提供读当前加载的段描述符的任何方式。在这一情况下,VMM必须在允许修改存储器内描述符之前依赖于仿真。
IA32虚拟化的一个尤其有问题的方面涉及EFLAGS寄存器内的IF(中断屏蔽标志),尽管这一状态明显应当被特许,它可容易地被非特许代码读取。此外,从非特许代码内修改IF的尝试被简单地忽略而不是生成俘获-换言之,尽管可能俘获操纵IF(包括STI和CLI)的某些指令,访问IF的其它指令不被俘获。同样不被俘获的其它指令(但是应当来自虚拟化的观点)在图8中示出。
不幸的是,尽管代码在虚拟机器内执行,在虚拟化IF内作出真实IF的镜像是不可行的,因为这将允许访客OS无限地关闭中断,即,有程序错误的访客OS可能挂起整个主机系统。为此,当执行访客代码时,主机IF一直保留启用(即,不屏蔽中断),即使清除了虚拟化(访客)的IF。
类似地,俘获STI/CLI指令需要调节EFLAGS的IOPL域,IOPL是可向非特许代码容易地展现的特许域的另一示例,它具有与IF关联的那些域类似的缺点。涉及IF和IOPL域的有问题的指令在图9中示出。
IA32体系结构也定义了由处理器使用的某些数据结构,包括TSS、GDT、LDT和IDT,这些数据结构位于由页表定义的逻辑地址空间内。当访客OS运行在虚拟机器内时,其页表定义了该地址空间的哪些区域用于映射存储器、帧缓存、存储器映射的寄存器等等。几乎不变的是,该地址空间的某些部分保留未使用。尽管访客OS维护其自己的TSS、GDT、LDT和IDT,然而VMM提供了这些数据结构的其自己的专用版本。然而,这些结构必须被映射到由访客OS控制的地址空间的某处。VMM的代码和内部数据结构也必须在同一地址空间内映射。因此,VMM需要找出当前未由访客OS使用的地址空间的某一部分(相对较小)。该区域被称为“VMM工作区域”。VMM积极地监控访客OS页表以确定访客OS是否试图将页映射到当前被VMM工作区域占用的区域中。如果是,VMM就找出地址空间的另一未使用部分并重定位其自身。
该技术允许广泛的访客OS兼容性,但是当使用整个访客地址空间时,它是有问题的,这一情况会在大量物理存储器被分配给虚拟机器时出现。为此,VMM提供了一种机制,通过该机制,访客OS可特别地为VMM工作区域保留其地址空间的一部分。一旦指定了这一空间,VMM就将其自身重定位到这一空间,并停止积极地跟踪对页表的改变(在访客OS兑现其不再使用保留区域的承诺的假定下)。
俘获指令是一种好坏掺半的事情。一方面,如果指令俘获,它可以被正确地虚拟化。另一方面,俘获引发极大的性能额外开销。例如,STI指令通常需要一个循环来执行,但是当在VM环境内执行STI时,它引发由VMM处理的俘获,在Pentium 4处理器上,它通常需要500个以上的循环来执行。某些VM试图通过跟踪高频俘获指令,并在可能时用在虚拟化环境中保存原始指令的语义的等效的非俘获代码对它们打补丁,来减轻这一额外开销。这可以通过使用访客OS内核空间内分配的不可分页“补丁缓存”来完成。
然而,在操作中,可打补丁的俘获指令需要至少五字节长度来允许长JMP指令一如果没有这必需的五字节,VMM将需要覆写俘获指令之后的一个或多个指令,因为要打补丁的指令可能在长度上小于五字节。
改进的虚拟化(如IA32)IA32体系结构的许多上述缺点和限制由当期望时不能引发俘获的指令引起。换言之,如果这些指令相反将引发俘获,VMM就能够正确地仿真这些指令。本发明提供了各种实施例来有效地为这些有问题的指令创建俘获。本发明的各种实施例针对通过优化OS代码并使用“合成指令”(后文更详细地讨论)来改进IA32体系结构中的虚拟化。本发明的若干实施例包括图10中示出的一系列步骤来如下地优化访客OS·在访客OS中,找出并移除和/或替换来自SS的PUSH CS、PUSH SS、MOV或环0代码内的CALLF的任一使用。如上所述,这些指令揭示了运行在虚拟机器内的环0代码实际上在较低特许环级上运行的事实。然而,这些指令在大多数操作系统中很少见,并一般可以一起移除或用其它现有的指令或现有指令组来替换。
·在访客OS中,找出VERR、VERW或LAR的任一使用并核实其使用不依赖于描述符类型的DPL或代码位。同样,这些指令在大多数OS中不使用。
·在访客OS中,找出SGDT、SLDT、SIDT或STR的任一使用,并移除这些指令或用相应的VM合成指令替换它们。为实现这一步骤,用更新描述符表条目的合成指令(如VMWRDESC)替换访客操作系统中的描述符表条目,避免了与维护阴影描述符表相关联的额外开销。
·在访客OS中,找出CPUID的任一使用-即,在OS内由系统的所有部分用于访问CPUID信息的公共子例程访问它-并修改读取CPUID的公共子例程以使用合成指令来访问虚拟化的CPUID信息而不是直接读取CPUID。尽管只要由主机处理器返回的具体CPUID信息不与访客特征冲突,CPUID虚拟化就不必要,然而如果新处理器要实现VMM不提供支持的特征,则虚拟化的CPUID值就将指示该特征不存在,而非虚拟化的CPUID值却指示它存在。
·在访客OS中,查找任一MP自旋锁,并修改它们以使用VMSPLAF(自旋锁采集失败)合成指令。
·在访客OS中,找出PUSHF(D)和POPF(D)的任何实例,并且如果这些指令的使用依赖于要入栈或出栈的IF值,则用对应的合成指令来替换它们。该步骤通常表示涉及令OS变得“VM干净”的大多数工作。
·在访客OS中,标识修改GDT或LDT条目的位置,并减少到最小修改次数,然后用VMWRDESC合成指令来替换其余的修改。(尤其要小心以避免当前加载的选择器被修改的情况。)·在访客OS中,确保GDT和LDT位于不包含其它数据结构的页上,如果不是这样,则将其变成这样。
·在访客OS中,定位环0代码内的STI和CLI的实例,并用长度为五字节的相应合成指令来替换它们。通过使用合成形式,VMM能够更好地对代码打补丁,以降低对俘获的需求,因为直接对STI和CLI指令(它们的每一个长度都小于五字节)打补丁需要VMM覆写俘获指令之后的一个或多个指令,这是由于典型的可打补丁的俘获指令长度上需要至少五字节来允许长JMP指令。
·使用以下引证的VMSETINFO合成指令。上述九个指令完成了“VM清除”,使得该合成指令可以启用环0内的直接执行。
·动态地禁用周围的直接执行并在保持“VM不安全”的环0代码的大块之后重新启用它。通过为访客操作系统提供合成指令来动态地禁用(如VMDXDSBL)和重启用(VMDXENBL)直接执行-访客操作系统能够避免“VM不安全”环0的大代码块。
·确定VMM是否能使用“补丁缓存”,如果是这样,则在内核空间内分配补丁缓存以便获得最好的性能。该补丁缓存必需是不可分页的,被映射到执行环0代码的所有地址空间上下文中,并且其大小由VMGETINFO合成指令指示。补丁缓存的位置和大小可使用下文引证的VMSETINFO指令来设置。补丁缓存应当对整个系统分配一次,而不是对每一虚拟处理器分配。
·确定VMM是否需要“VMM工作区域”,如果是这样,分配并保留所指示大小的地址空间并在访客OS内对齐。如后文所讨论的通过使用VMSETINFO指令来设置该保留区域的基础。
VM“合成指令”换言之是对VM具有特殊意义的非法处理器指令。由此,当在不支持合成指令的VM或非VM环境内执行合成指令时,它们生成类型6(非法操作)异常,并因此对OS重要的是在使用它们之前检查合成指令支持。为检查VM合成指令支持,OS执行一VMCPUID指令,并且如果该指令生成非法指令错误,OS就确定合成指令不被支持。(注意,VMCPUID可以从所有的特许级执行,因此它可以在用户级代码中安全使用。)这一同样的测试可以用于确定是否在VM环境中执行,如果是这样,其后准许虚拟机器访问或修改基础VMM的特征或行为。以下是使用尝试/异常机制和结构化异常处理来执行这一测试的示例代码<pre listing-type="program-listing">  BOOL   SyntheticInstructionsSupportedO  {   Boolean synthInstrSupported=TRUE;   _try{   _asm{   _emit 0x0F//发出VMCPUID指令   _emit 0xC7   _emit 0xC8   _emit 0x01   _emit 0x00  }  }_except(EXCEPTION_EXECUTE_HANDLER){   synthInstrSupported=FALSE;  }  return synthInstrSupported;  }</pre>通过使用合成指令,不利地影响x86处理器上的虚拟化的x86 ISA指令因此可以用引发x86处理器中的异常的合成指令来替换或补充,该异常然后由运行在所述x86处理器上的虚拟机器俘获用于由所述虚拟机器处理。同样,对于递归的虚拟化,其中第一虚拟机器运行在第二虚拟机器上,指令由合成指令来替换或补充,以引发x86处理器中可以通过第二虚拟机器传递的异常,由所述第一虚拟机器俘获用于处理。
对于本发明的若干实施例而言,合成指令的长度都是五字节,这允许它们可用JMP指令来打补丁,以减小俘获额外开销。(在其它实施例中,合成指令可以更长或更短。)合成指令的十六进制编码使用以下格式OF C7 C8 XXXX(其中,“XX”是两位十六进制变量,用于标识具体的合成指令)。该指令解码为CMPXCHG8B指令,但是它被认为是“非法”的,因为指定的目标操作数是寄存器(并由此导致俘获)。然而,在本发明的若干实施例中,合成指令不支持任何形式的指令前缀(如,LOCK、REP、段忽略(override)、操作数大小忽略、地址大小忽略),并且在这一环境中试图使用前缀会导致非法指令异常(UD#)。
合成指令此处详细描述了用于本发明的各种实施例的合成指令的子集。此处未列出的另外的合成指令在本发明的上文中也已描述。同样,本发明未明确描述的其它合成指令仍被本发明的各种实施例所期望,并且此处没有内容应当被认为是将本发明局限在明确标识的具体合成指令上。
VMGETINFO-获取VM信息VMGETINFO取出一段具体的VM信息,并将其放置到EDX:EAX。所返回的信息取决于ECX中的索引。如果指定的索引引用不被虚拟处理器支持的信息片断,则生成GP(0)。如果该索引引用被支持的信息片断,则将EDX:EAX设为信息值。(注意,用于该指令所使用的寄存器惯例类似于RDMSR指令。)该指令与大多数处理器指令不同,它影响整个系统的状态。在具有多处理器的系统上,用VMGETINFO访问的状态被认为是“全局的”。例如,使用一个处理器上的VMSETINFO设置VMM工作区域基础允许随后使用第二处理器上的VMGETINFO读回相同的值。
VMSETINFO-设置VM信息VMSETINFO设置如EDX:EAX中所指定的一段具体的VM信息。要设置的信息取决于ECX中的索引。如果指定的索引引用不被虚拟处理器支持的或不可写的信息片断,则生成GP(0)。(注意,用于该指令的寄存器惯例类似于WRMSR指令)。该指令与大多数处理器指令不同,它影响整个系统的状态。在具有多处理器的系统上,使用VMSETINFO设置的状态被认为是“全局的”。例如,使用一个处理器上的VMSETINFO设置VMM工作区域基础令该数据然后可以使用第二处理器上的VMGETINFO来读回。
VMDXDSBL-禁用直接执行VMDXDSBL禁用直接执行,直到下一次通过使用VMDXENBL来启用直接执行为止。该指令仅可从环0代码内执行,并应当仅在禁用中断(或任一形式的占先)时执行,以防止直接执行被禁用很长一段时间。它可以用于保护非“VM安全”(即,包含当在VM环境内直接执行中运行时会中断的若干非虚拟化指令或假定)的小代码块。该指令仅影响它在其上执行的处理器。它不影响虚拟机器内的其它虚拟处理器。如果直接执行已被禁用,该指令不做任何事情。
VMDXENBL-启用直接执行VMDXENBL在可能时启用直接执行。该指令仅可以从环0代码内执行,并应当仅在禁用中断(或任一形式的占先)时执行。它可以结合VMDXDSBL指令使用来保护非“VM安全”(即,包含当在VM环境内直接执行中运行时会中断的若干非虚拟化指令或假定)的小代码块。该指令仅影响它所在其上执行的处理器。它不影响虚拟机器内的其它虚拟处理器。如果直接执行已启用,该指令不做任何事情。
VMCPUOD-虚拟化CPU信息VMCPUID类似于真实的CPUID指令,除它返回投影的CPU信息之外。
VMHLT-暂停VMHLT类似于正常的HLT指令,除它可以从任一处理器模式执行之外一包括环3和v86模式。它可以被插入到任一“空闲循环”中以减少虚拟机器内的处理器使用。在某些实施例中,这个用于暂停处理器的合成指令(如VMHALT)可以作为用户级访客代码执行。
VMSPLAF-自旋锁采集失败自旋锁在支持对称多处理的操作系统内被频繁地使用。这些锁通常保护在处理器之间共享的关键资源。它们依赖于该锁将由另一其它处理器占有相对较少的周期的事实。在多处理器VM系统内,如果占有自旋锁的虚拟处理器被临时先占且在其它虚拟处理器等候由挂起的处理器占有的资源时不运行,典型的自旋锁行为可导致较差的性能和较高的CPU使用。为避免这一情况,VMSPLAF指令可以用于通知VMM,OS正在等候它未能采集的自旋锁。作为响应,VMM或可调度另一虚拟处理器运行,或挂起当前虚拟处理器并调度它在以后当资源被释放时执行。
VMPUSHFD-虚拟化标志寄存器进栈VMPUSHFD类似于正常的PUSHFD指令,除了它是“VM安全”的之外。它假定32位操作数大小和32位栈指针。如果CS和sS当前不是32位,则其行为不确定。也不保证以与真实PUSHFD指令相同的方式执行段边界或写核对。进栈的EFLAGS寄存器的值将包含投影的IF值。然而,IOPL域的值可能不正确。需要读IOPL的代码应当响应于INT指令、外部中断或异常使用进栈的EFLAGS的值。该指令仅可在环0代码内使用。
VMPOPFD-虚拟化标志寄存器出栈VMPOPFD类似于正常的POPFD指令,除了它是“VM安全”的之外。它假定32位操作数大小和32位栈指针。如果CS和SS当前不是32位,其行为不确定。也不保证以与真实PUSHF指令相同的方式执行段边界或写核对。出栈的EFLAGS内的IF域的值将被兑现。然而,IOPL域的值可能被忽略。需要调节IOPL的代码应当使用IRETD或VMIRETD指令。该指令仅可在环0代码内使用。
VMCLI-清除中断标志VMCLI类似于正常的CLI指令,除了它是五字节长且可被打补丁来避免被俘获到VMM中以外。该指令仅可在环0代码内使用。
VMSTI-设置中断标志VMSTI类似于正常的STI指令,除了它是五字节长且可以被打补丁来避免被俘获到VMM中以外。它也与正常的STI不同,因为它不防止在下一指令完成前出现中断。该规则的唯一的异常是如果VMSTI之后是连同VMSTI一起自动执行的SYSEXIT指令。该指令仅可以在环0代码内使用。
VMIRETD-从中断返回VMIRETD类似于正常的IRETD指令,除了它是“VM安全”的之外。与正常的IRETD指令不同,该指令总是假定32位操作数大小和32位栈指针。如果CS和SS的当前大小不是32位,则其行为不确定。该指令仅可在环0代码内使用。只要潜在地使用了IRETD,它就应当被使用来返回到v86模式。使用VMIRETD避免了当从CPL>0返回至v86模式时IA32处理器的不合宜的行为。(注意,环压缩导致环0代码在VM环境内在较少特许的环级运行。)VMSGDT-储存全局描述符表VMSGDT类似于真实的SGDT指令,除了它储存投影的GDT基础和长度之外。它假定对存储器操作数的寻址模式是DS:[EAX],并且DS是开放的可写段。如果DS不是开放的可写段,其行为不确定。
VMSIDT-储存中断描述符表VMSIDT类似于真实的SIDT指令,除了它储存投影的IDT基础和长度之外。它假定对存储器操作数的寻址模式是DS:[EAX],并且DS是开放的可写段。如果DS不是开放的可写段,其行为不确定。
VMSLDT-储存局部描述符表VMSLDT类似于真实的SLDT指令,除了它储存投影的LDT选择器之外。它假定目标操作数的EAX寄存器。
VMSTR-储存任务寄存器VMSTR类似于真实的STR指令,除它储存投影的LDT选择器之外。它假定目标操作数是EAX寄存器。
VMSDTE-储存到描述符表条目
VMSDTE用于更新GDT或LDT内的描述符条目。为使用,将选择器加载到ECX内。忽略ECX最顶上的16位和最底部的2位(位0和1)。ECX的位2指示选择器引用全局还是局部描述符表。其余部分(位3到位15)对选择器进行编码-即,到描述符表的偏移。EDX:EAX应当使用值来加载以写入指定的描述符表条目。应当使用该指令而非直接修改描述符表,使得VMM的应用描述符表可以在同一时刻被更新。不要修改对应于当前加载的段选择器的描述符条目。这将导致不确定的行为。如果不被VMM所推荐(如由VMGETINFO指令返回的VMM信息位4所指示的),不要使用该指令。当不被推荐时使用该指令将导致当运行在将来的VMM实现上时较差的性能。该指令仅可以从环0代码使用。
总结本发明描述的各种系统、方法和技术可以硬件或软件,或者适当时两者的组合来实现。由此,本发明的方法和装置,或其某些方面或其部分可采用包含在有形媒质中的程序代码(即指令)的形式,有形媒质如软盘、CD-ROM、硬盘或任一其它机器可读存储媒质,其中,当程序代码被加载到机器,如计算机,并由其执行时,该机器变为用于实践本发明的装置。在程序代码在可编程计算机上执行的情况下,计算机一般包括处理器、可由处理器读取的存储媒质(包括易失和非易失存储器和/或存储元件)、至少一个输入设备以及至少一个输出设备。一个或多个程序较佳地以高级程序语言或面向对象编程语言实现来与计算机系统进行通信。然而,如期望,程序可以汇编语言或机器语言实现。在任一情况下,语言可以是已编译或已解释语言,并与硬件实现相组合。
本发明的方法和装置也可以通过某一传输媒质,如通过电线或电缆、通过光纤或通过任一其它形式的传输发送的程序代码的形式来实施,其中,当程序代码被接受并被加载到机器,如EPROM、门阵列、可编程逻辑器件(PLD)、客户机计算机、录影机等,并由其执行时,该机器变为用于实践本发明的装置。当在通用处理器上实现时,程序代码与处理器组合来提供操作来执行本发明的标引功能的唯一装置。
尽管结合各个附图的较佳实施例描述了本发明,可以理解,在不背离本发明的情况下,可以使用其它类似的实施例,或可以向描述的实施例作出修改和添加来执行本发明的同一功能。例如,尽管在仿真个人计算机的功能的数字设备的上下文中描述了本发明的示例性实施例,本领域的技术人员将认识到,本发明不限于这类数字设备,本申请中所描述的可应用到任意数量的现有或新兴计算装置或环境,如游戏控制台、手持式计算机、便携式计算机等等,不论它们是有线还是无线,并且可应用到通过通信网络连接并跨网络进行交互的任意数量的这类计算装置。此外,应当强调,此处考虑了各种计算机平台,包括手持式设备操作系统和其它应用专用硬件/软件接口系统,尤其是当无线网络化设备的数量持续增长的情况下。因此,本发明不应局限与任一单个环境,而是依照所附权利要求书的宽度和范围来解释。
最后,此处所描述的揭示的实施例可适用于在其它处理器体系结构、基于计算机的系统或系统虚拟化中使用,这类实施例明确地被本发明的揭示所期望,并且由此,本发明不应局限于此处所描述的具体实施例,而是相反应被更广泛地解释。同样,用于不同于处理器虚拟化的目的的合成指令的使用也被本发明的揭示所期望,并且在不同于处理器虚拟化的上下文中对合成指令的任一这样的使用应当被最广泛地读入本发明的揭示中。
权利要求
1.一种用于改进x86处理器体系结构及其等效体系结构中的处理器虚拟化的方法,所述体系结构包括但不限于IA32体系结构,其特征在于,所述方法包括移除、替换或补充访客操作系统中不利地影响对在x86处理器上操作的虚拟机器的虚拟化的一个或多个预定义指令。
2.如权利要求1所述的方法,其特征在于,所述一个或多个指令包括以下指令组的成员PUSH CS、PUSH SS、来自SS的MOV、CALLF、VERR、VERW和LAR。
3.如权利要求1所述的方法,其特征在于,不利地影响x86处理器上的虚拟化的指令由合成指令来替换或补充,以在x86处理器中引发异常,所述异常然后由运行在所述x86处理器上的虚拟机器俘获用于由所述虚拟机器处理。
4.如权利要求3所述的方法,其特征在于,对于运行在第二虚拟机器上的第一虚拟机器而言,由合成指令替换或补充以在x86处理器中引发异常的指令,所述异常然后由运行在所述x86处理器上的所述第一虚拟机器俘获,用于由所述虚拟机器通过有效地绕过所述第二虚拟机器来处理。
5.如权利要求3所述的方法,其特征在于,所述合成指令在用户模式和特许模式中都可使用。
6.如权利要求3所述的方法,其特征在于,所述合成指令没有对现有x86指令的推论。
7.如权利要求3所述的方法,其特征在于,所述合成指令是用于禁用直接执行的指令(如,VMDXDSBL)。
8.如权利要求3所述的方法,其特征在于,所述合成指令是用于启用(或重启用)直接执行的指令(如,VMDXENBL)。
9.如权利要求3所述的方法,其特征在于,对于用合成指令替换的指令,所述合成指令在语法上类似于被替换的指令。
10.如权利要求9所述的方法,其特征在于,长度上少于五字节的指令用长度上至少为五字节的合成指令来替换(如以便于打补丁)。
11.如权利要求10所述的方法,其特征在于,STI指令用至少为五字节长的合成指令(如VMSTI)来替换。
12.如权利要求10所述的方法,其特征在于,CLI指令用至少为五字节长的合成指令(如VMCLI)来替换。
13.如权利要求3所述的方法,其特征在于,访客操作系统中的CPUID指令用读虚拟化CPUID信息的合成指令(如VMCPUID)来替换。
14.如权利要求3所述的方法,其特征在于,访客操作系统中至少一个多处理器自旋锁指令用确定自旋锁采集何时失败的合成指令(如VMSPLAF)来补充。
15.如权利要求3所述的方法,其特征在于,访客操作系统中的PUSHF(D)指令用将IF推入栈的合成指令(如VMPUSHFD)来替换。
16.如权利要求3所述的方法,其特征在于,访客操作系统中的POPF(D)指令用将IF出栈的合成指令(如VMPOPFD)来替换。
17.如权利要求3所述的方法,其特征在于,在访客操作系统中修改描述符表条目的指令用更新所述描述符表条目的合成指令(如VMWRDESC)来替换,避免了与维护阴影描述符表相关联的额外开销。
18.如权利要求3所述的方法,其特征在于,访客操作系统中SGDT指令用将当前GDT基础和长度储存到EAX的合成指令(如VMSGDT)来替换。
19.如权利要求3所述的方法,其特征在于,访客操作系统中SLDT指令用将当前LDT选择器储存到EAX的合成指令(如VMSLDT)来替换。
20.如权利要求3所述的方法,其特征在于,访客操作系统中的SIDT指令用将当前IDT基础和长度储存到EAX的合成指令(如VMSIDT)来替换。
21.如权利要求3所述的方法,其特征在于,访客操作系统中的STR指令用将当前TR选择器储存到EAX的合成指令(如VMSTR)来替换。
22.如权利要求3所述的方法,其特征在于,访客操作系统中的CLI指令用清除虚拟化IF的合成指令(如VMCLI)来替换。
23.如权利要求3所述的方法,其特征在于,访客操作系统中的STI指令用设置虚拟化IF的合成指令(如VMSTI)来替换。
24.如权利要求3所述的方法,其特征在于,用于暂停所述处理器的合成指令(如VMHALT)可以作为用户级访客代码执行。
25.一种使操作系统确定它是运行在虚拟化处理器上还是直接运行在x86处理器上的方法,其特征在于,所述方法包括执行用于返回表示中央处理单元的身份的值的合成指令(如VMCPUID);如果返回了值,则推断所述操作系统运行在虚拟化处理器上,并其后使用合成指令;以及如果出现异常,则推断所述操作系统直接运行在x86处理器上,并其后制止使用合成指令。
26.如权利要求25所述的方法,其特征在于,它还包括,如果返回了值,则访问或修改基础虚拟机器监控器的特征或行为。
27.如权利要求25所述的方法,其特征在于,所述合成指令的十六进制操作代码为0F C7 C8 01 00。
28.一种使改进的操作系统代码使用长JMP指令为可俘获指令有效地打补丁的方法,其特征在于,所述方法包括以下步骤在访客操作系统中,定位长度小于五字节的可俘获指令(如运行在环0代码内的STI和CLI指令)的实例,并用至少为五字节长的相应合成指令(如分别为VMSTI和VMCLI)来替换这些可俘获指令。
29.一种用于在x86处理器体系结构及其等效体系结构上处理合成指令的系统,所述体系结构包括但不限于IA32体系结构,其特征在于,所述系统包括用于在所述合成指令引发x86处理器中的异常之后俘获由访客操作系统发出的所述合成指令的子系统;以及用于为访客操作系统处理所述合成指令的子系统。
30.如权利要求29所述的系统,其特征在于,它还包括一子系统,其中俘获并处理用于确定自旋锁采集何时失败的合成指令(如VMSPLAF)。
31.如权利要求29所述的系统,其特征在于,它还包括用于处理使IF入栈的合成指令(如VMPUSHFD)的子系统。
32.如权利要求29所述的系统,其特征在于,它还包括用于处理使IF出栈的合成指令(如VMPOPFD)的子系统。
33.如权利要求29所述的系统,其特征在于,它还包括用于处理更新描述符表条目的合成指令(如VMWRDESC)的子系统,避免了与维护阴影描述符表相关联的额外开销。
34.如权利要求29所述的系统,其特征在于,它还包括用于处理将当前GDT基础和长度储存到EAX的合成指令(如VMSGDT)的子系统。
35.如权利要求29所述的系统,其特征在于,它还包括用于处理将当前LDT选择器储存到EAX的合成指令(VMSLDT)的子系统。
36.如权利要求29所述的系统,其特征在于,它还包括处理将当前IDT基础长度储存到EAX的合成指令(如VMSIDT)的子系统。
37.如权利要求29所述的系统,其特征在于,它还包括用于处理将当前TR选择器储存到EAX的合成指令(如VMSTR)的子系统。
38.如权利要求29所述的系统,其特征在于,它还包括用于处理清除虚拟化IF的合成指令(如VMCLI)的子系统。
39.如权利要求29所述的系统,其特征在于,它还包括用于处理设置虚拟化IF的合成指令(如VMSTI)的子系统。
40.如权利要求29所述的系统,其特征在于,它还包括用于处理暂停可作为用户级访客代码执行的处理器的合成指令(如VMHALT)的子系统。
41.如权利要求29所述的系统,其特征在于,它还包括用于确定所述系统是运行在虚拟化处理器上还是直接运行在x86处理器上的子系统,所述子系统包括用于执行返回表示由中央处理单元支持的特征的身份的值的合成指令(如VMCPUID)的子系统;以及用于确定是否返回了值以及(a)如果是,则推断所述操作系统运行在虚拟化处理器上,并且其后使用合成指令,以及(b)如果不是,则推断所述操作系统直接运行在x86处理器上,并其后制止使用合成指令的子系统。
42.如权利要求41所述的系统,其特征在于,它还包括用于如果返回值则访问或修改所述基础虚拟机器监控器的特征或行为的子系统。
43.如权利要求41所述的系统,其特征在于,所述合成指令的十六进制操作代码是0F C7 C8 01 00。
44.如权利要求29所述的系统,其特征在于,所述合成指令包括用于禁用直接执行的合成指令(如VMDXDSBL)。
45.如权利要求29所述的系统,其特征在于,所述合成指令包括用于启用(或重启用)直接执行的合成指令(如VMDXENBL)。
46.如权利要求29所述的系统,其特征在于,所述合成指令包括用于使IF入栈的合成指令(如VMPUSHFD);以及用于使IF出栈的合成指令(如VMPOPFD)。
47.如权利要求46所述的系统,其特征在于,所述合成指令还包括用于将当前GDT基础和长度储存到EAX的合成指令(如VMSGDT);用于将当前LDT选择器储存到EAX的合成指令(如VMSLDT);用于将当前IDT基础和长度储存到EAX的合成指令(如VMSIDT);以及用于将当前TR选择器储存到EAX的合成指令(如VMSTR)。
48.如权利要求46所述的系统,其特征在于,所述合成指令还包括用于清除虚拟化IF的合成指令(如VMCLI);以及用于设置虚拟化IF的合成指令(如VMSTI)。
49.如权利要求46所述的系统,其特征在于,所述合成指令还包括,俘获并处理用于确定自旋锁采集何时失败的合成指令。
50.如权利要求46所述的系统,其特征在于,所述合成指令还包括用于返回标识所述中央处理单元的身份的值的合成指令(如VMCPUID)。
51.如权利要求50所述的系统,其特征在于,所述合成指令的十六进制操作代码是0F C7 C8 01 00。
52.一种包括用于改进x86处理器体系结构及其等效体系结构中的处理器虚拟化的计算机可读指令的计算机可读媒质,所述体系结构包括但不限于IA32体系结构,其特征在于,所述计算机可读指令包括在所述x86处理器中引发随后由运行在所述x86处理器上的虚拟机器监控器俘获的异常,用于由所述虚拟机器监控器处理的合成指令。
53.如权利要求46所述的方法,其特征在于,所述访客操作系统中的至少一个多处理器自旋锁指令用确定自旋锁采集何时失败的合成指令(如VMSPLAF)来补充。
54.如权利要求46所述的计算机可读指令,其特征在于,它还包括用于返回表示中央处理单元的身份的值的合成指令(如VMCPUID)。
55.如权利要求46所述的计算机可读指令,它还包括使IF入栈的合成指令(如VMPUSHFD)。
56.如权利要求46所述的计算机可读指令,其特征在于,它还包括使IF出栈的合成指令(如VMPOPFD)。
57.如权利要求46所述的计算机可读指令,其特征在于,它还包括将当前GDT基础和长度储存到EAX的合成指令(如VMSGDT)。
58.如权利要求46所述的计算机可读指令,其特征在于,它还包括将当前LDT选择器储存到EAX的合成指令(如VMSLDT)。
59.如权利要求46所述的计算机可读指令,其特征在于,它还包括将当前LDT基础和长度储存到EAX的合成指令(如VMSIDT)。
60.如权利要求46所述的计算机可读指令,其特征在于,它还包括将当前TR选择器储存到EAX的合成指令(如VMSTR)。
61.如权利要求46所述的计算机可读指令,其特征在于,它还包括清除虚拟化IF的合成指令(如VMCLI)。
62.如权利要求46所述的计算机可读指令,其特征在于,它还包括设置虚拟化IF的合成指令(如VMSTI)。
63.如权利要求46所述的计算机可读指令,其特征在于,它还包括用于确定所述指令是运行在虚拟化处理器上还是直接运行在x86处理器上的指令,所述指令包括用于执行用于返回表示中央处理单元的身份的值的合成指令的指令;以及用于确定是否返回了对应于中央处理单元的身份的值,并且(a)如果是这样,则使用合成指令,以及(b)如果不是,则中止使用合成指令的指令。
64.如权利要求63所述的计算机可读指令,其特征在于,所述合成指令的十六进制操作代码是0F C7 C8 01 00。
65.一种用于当在x86处理器机器体系结构及其等效体系结构上执行时处理合成指令的方法,所述体系结构包括但不限于IA32体系结构,所述方法包括移除、替换或补充访客操作系统中以下预定义指令的一个或多个实例PUSHCS、PUSH SS、来自SS的MOV、CALLF、VERR、VERW和LAR。
66.一种用于优化访客操作系统以改进当在x86处理器体系结构及其等效体系机构上执行时处理器虚拟化的方法,所述体系结构包括但不限于IA32体系结构,其特征在于,所述方法包括移除、替换或补充访客操作系统中以下预定义指令的一个或多个实例PUSHCS、PUSH SS、来自SS的MOV、CALLF、VERR、VERW和LAR;用读取虚拟化CPUID信息的合成指令(如VMCPUID)来替换访客操作系统中的CPUID;用确定自旋锁采集何时失败的合成指令(如VMSPLAF)来补充访客操作系统中的自旋锁指令;用使IF入栈的合成指令(如VMPUSHFD)来替换访客操作系统中的PUSHF(D)指令;用使IF出栈的合成指令(如VMPOPFD)来替换访客操作系统中的POPF(D)指令;用将当前GDT基础和长度储存到EAX的合成指令(如VMSGDT)来替换访客操作系统中的SGDT指令;用将当前LDT选择器储存到EAX的合成指令(如VMSLDT)来替换访客操作系统中的SLDT指令;用将当前IDT基础和长度储存到EAX的合成指令(如VMSIDT)来替换访客操作系统中的SIDT指令;用将当前TR选择器储存到EAX的合成指令(如VMSTR)来替换访客操作系统中的STR指令;用清除虚拟化IF的合成指令(如VMCLI)来替换访客操作系统中的CLI指令;用设置虚拟化IF的合成指令(如VMSTI)来替换访客操作系统中的STI指令。
全文摘要
本发明通过提供引发俘获并由此为虚拟机器(VM)提供安全处理指令的机会的一组“合成指令”,弥补了x86处理器体系结构中的缺点。通过使用对x86体系机构“非法”、但仍可被虚拟机器理解的指令,该方法使用了这些合成指令以在虚拟机器中执行较佳定义的动作,这些动作当由传统指令向x86处理器执行时将是有问题的,但是它们为x86处理器系统提供了大大改进的处理器虚拟化。
文档编号G06F9/455GK1607503SQ20041008266
公开日2005年4月20日 申请日期2004年9月24日 优先权日2003年10月14日
发明者E·特罗特 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1