在没有vmm介入的情况下对调用vmm配置的服务的指令集支持的制作方法

文档序号:6497392阅读:154来源:国知局
在没有vmm介入的情况下对调用vmm配置的服务的指令集支持的制作方法
【专利摘要】一种处理核包括指令执行逻辑电路和寄存器空间。寄存器空间从VMCS加载,与VM条目相称,具有指示由处理核代表VMM提供的服务是否被启用。响应于宾客软件调用指令,指令执行逻辑引用寄存器空间以确认服务已经被启用,并且引用第二寄存器空间或存储器空间以获取由所述宾客软件编写的所述服务的输入参数。
【专利说明】在没有VMM介入的情况下对调用VMM配置的服务的指令集支持
[0001]优先权要求
[0002]本申请涉及2011 年 10 月 28 日提交的题为 “Instruct1n-Set Support forInvocat1n of VMM-Configured Services without VMM Intervent1n (在没有VMM介入的情况下对调用VMM配置的服务的指令集支持)”的美国临时专利申请N0.61/553,108,并要求其权益,该申请通过引用整体结合于此。

【技术领域】
[0003]本发明的领域一般涉及虚拟化,且更具体地涉及对VM宾客软件的CPU支持服务。

【背景技术】
[0004]很多当前的计算系统实现“虚拟化”。典型的实现在图1中示出。如图1所示,软件层102被施加在操作系统101软件和CPU103之间。该软件层102通常包括在虚拟机监视器(VMM) 102b “上运行的”一个或多个虚拟机(VM)102a_l - 102a_N。尽管不是严格的要求,但图1示出常见的配置,其中不同的软件应用实例100_1 - 100_N各自具有其自身的运行在专用虚拟机102a_l - 102a_N之上的操作系统实例101_1 - 101_N。
[0005]VM将CPU的出现呈现给其上运行的软件;该软件通常被称为“宾客”软件。结果,至少作为第一近似,运行在虚拟机上的软件可“认为”它自己具有整个计算机系统的资源。VMM102b负责支持下层CPU103上的多个VM。这样,VMM102b协调CPU103上的多个VM的并发请求/要求。这包括将下层计算系统的实际资源(例如,CPU线程、系统存储器空间、盘驱动存储空间)的分配与运行在VM上的软件所引用的“虚拟”计算系统资源相关联。
[0006]尽管宾客软件通常“认为”它运行在其自身的计算机系统中且没有VMM,但这种软件也可被设计成知晓何时它运行在VMM所支持的VM中。这种软件有时被称为“半虚拟化(paravirtualizat1n) ” 或“启发的(enlightened)”。“知晓”其运行在 VMM(例如在VM102a_l - 102a_N之一中)上的软件可被设计成直接调用由VMM102b提供的某些“服务”。然而,目前,为了调用VMM服务,CPU的控制必须首先从其中进行调用的应用/OS实例正运行的VM传送到VMM ;这种控制传递有时被称为“VM退出”。VM退出的一个可能的结果是CPU必须将其活动背景或状态从VM进程“切换”到VMM进程。在已经完成服务之后,CPU必须再次将其活动背景/状态从VMM进程切换回VM进程;这种返回控制传递有时被称为“VM条目”。
[0007]图2示出用于调用VMM服务的现有技术进程。如图2所示,应用/OS实例认识到调用VMM服务的需要,201。在调用之前,应用/OS实例可用标识特定服务被调用的值和服务的输入参数来填充寄存器和/或存储器,202。然后为了调用VMM服务,应用/OS实例执行用于调用VMM服务的指令,203。例如,在具有VT-x技术的当今因特尔处理器的情况下,应用/OS实例执行VMCALL指令,该指令被设计成用于调用明确地来自在VM上运行的进程的VMM。(应用/OS实例可替代地使用导致VM退出且为此目的VMM已经启用的另一个指令,诸如 CPUID 或 WRMSR)。
[0008]响应于VMCALL指令被执行,CPU的控制从VM传递到VMM(VM退出),203。在操作中,CPU内的微代码通过将VM的背景/状态信息从软件可见的CPU寄存器空间移动到已经由VMM配置的虚拟机控制结构(VMCS)并且用来自VMCS中的其它位置的VMM进程的背景/状态信息重新加载这些相同的软件可见寄存器的许多个,来实现上述背景/状态切换。
[0009]VMM进程指的是由调用应用/OS实例建立的用于理解正请求什么服务并访问服务的输入参数的存储器或寄存器值。VMM进程然后执行服务,204。这通过执行被写入的VMM程序代码以履行服务来完成。
[0010]在完成服务之后,控制经由VM条目从VMM传递回到VM,205。此处,CPU微代码将VM背景/状态从NMCS加载到软件可见的寄存器空间。
[0011]VMM服务的示例是“宾客地址空间切换”服务。该服务可用于运行在虚拟机中的宾客软件,对于该虚拟机,VMM支持多个地址空间,如以下所解释的。
[0012]VMM通常对于其VM中的每一个支持“宾客地址空间”。这是从宾客“认为”的物理地址(宾客-物理地址)至可用于访问存储器的真实物理地址的映射,该映射还可为每个宾客-物理地址指定访问权(例如,读/写、只读等)。在具有VT-x技术的当今英特尔处理器的情况下,宾客地址空间可利用扩展页表(EPT)实现。
[0013]在没有半虚拟化的情况下,VMM通常将支持每个VM单个宾客地址空间。如果宾客软件是半虚拟化的,则VMM可为单个VM建立多个宾客地址空间,尽管一次仅有一个是活动的。在一个实例中,这些地址空间可在如何保护不同存储器区域方面彼此不同。对于运行在VM中的每个应用模块可能有不同的宾客地址空间;用于模块的宾客地址空间可允许该模块访问其自身的存储器,但不允许访问属于其它模块的存储器。
[0014]对于多个宾客地址空间支持的VM,VMM将需要在适当时改变哪些宾客地址空间是活动的。一种有效的机制是宾客软件通知VMM何时要改变宾客地址空间(例如,何时宾客OS从一个应用模块改变至另一个)。宾客软件可经由“宾客地址空间切换”服务通知VMM。
[0015]如前面指出的,可执行VMCALL或其它指令以调用用于宾客地址空间切换服务的VMM。在指令执行之前,宾客软件可将值放置在寄存器(例如,EAX寄存器)或存储器中以标识“宾客地址空间切换”服务。可在附加寄存器(例如,EBX寄存器)或存储器中指定要切换到的地址空间的标识符。指令导致VM退出,且服务如上所述地由VMM履行。
[0016]附图简沭
[0017]本发明是作为示例说明的,而不仅限制于各个附图的图形,在附图中,类似的参考编号表示类似的元件,其中:
[0018]图1示出虚拟化方案(现有技术);
[0019]图2示出用于从宾客软件调用VMM服务的进程(现有技术);
[0020]图3示出用于从宾客软件调用CPU所提供服务的进程;
[0021]图4示出CPU所提供的宾客地址切换服务;
[0022]图5示出处理器的实施例;
[0023]图6示出计算系统的实施例。
[0024]详细描沭
[0025]每次宾客软件调用VMM服务都发生VM退出的事实对应于一种形式的低效率。具体地,如上所述,大量的寄存器内容移动需要在软件可见的寄存器空间和VMCS之间发生,以便将程序流的背景/状态从VM切换到VMM。
[0026]避免VM退出的一种方式是将服务功能嵌入CPU而不是VMM中。此处,因为CPU而不是VMM正履行所请求的服务,所以不需要控制传递或CPU内的背景切换。在各实施例中,尽管VMM不再执行服务,然而服务由VMM来配置。在实施例中,宾客软件经由特定指令调用服务。这可以是被重新定义以通过CPU调用服务的一定数量的现有指令之一,或者它可以是被特别定义以支持VMM配置的服务的一定数量的新指令之一。以下图3的论述讨论以构造到CPU的指令集中的单个新指令VMFUNC实现该新方法的实施例。
[0027]图3示出VMFUNC指令的配置和使用的进程流。如图3的进程所示,在宾客软件或VM的特定实例的最初配置期间,VMM指示(例如,通过写入VM的VMCS) VMFUNC是否被启用用于宾客软件ΛΜ,如果是,则哪个特定CPU所提供的服务被启用用于宾客软件实例/W,301。下一个VM条目将该配置信息从VMCS加载到CPU的私有控制寄存器空间(即对宾客软件不可见的空间),302。为了简化讨论,给出以下内容,似乎保持在VMCS中的配置信息专用于宾客软件的特定实例,然而,读者应理解该信息也可能专用于宾客软件在其上运行的VM。
[0028]在该实施例中,想要调用VMM配置的服务的宾客软件首先用标识其想要调用的服务的值加载EAX寄存器。如果合适,宾客软件可用属于该服务的相关信息(例如,输入参数)加载其它寄存器(例如EBX或ECX寄存器)。在这些寄存器已经被加载之后,宾客软件执行VMFUNC指令以调用服务,303。
[0029]尽管以上的讨论描述了一种进程,通过该进程VM的每个服务的启用在VMCS中指定且宾客软件通过写入管芯上的处理器寄存器来标识期望的服务,然而读者将理解可通过存储器选择性地或组合地进行任意此类配置信息和/或宾客软件服务调用。
[0030]响应于VMFUNC指令的执行,CPU内的指令执行逻辑检查EAX寄存器中的信息以理解哪些特定的服务正被请求,且如果合适则检查其它寄存器中的信息以获得可应用的输入信息,304。
[0031]CPU的指令执行资源然后注意305私有控制寄存器,该私有控制寄存器之前在VM条目后利用VMCS信息加载302,以查看VMFUNC是否被启用用于宾客软件,如果是,则宾客软件已经请求的特定服务是否已经被启用。如果VMFUNC还未被启用用于宾客软件,或者如果VMFUNC已经被启用但特定的所请求的服务还未被启用,则CPU硬件引起异常,307。如果VMFUNC和所请求的服务已经被启用,则CPU的指令执行资源执行服务,306。
[0032]一些实施例可将一些或全部服务限制到特定特权等级或操作模式。这些实施例可在检查到VMFUNC和所请求的服务已经被启用之前或之后检查特权等级和操作模式。如果CPU未操作在适当的特权等级和操作模式,则CPU可生成异常或VM退出。
[0033]当VMFUNC指令执行所调用的VMM配置的服务时,所有的处理发生而不在VM进程和VMM进程之间切换背景;这与利用VMCALL指令导致VMM退出(或导致VM退出的其它指令)的现有技术方案是不同的。
[0034]在实施例中,宾客软件的实例的私有寄存器空间(从VMCS加载)包括EPT页表指针地址,该地址指向用于要对在VM上运行的宾客软件执行的地址转换的EPT页表层次(即,用于当前的宾客地址空间)。此处,EPT页表层次中的转换定义从宾客软件指定的物理地址(“宾客-物理地址”)至与特定地址相关联的数据/指令实际上所驻留的系统存储器中物理地址的(可能是多步骤)转换进程,以及宾客软件可访问这些物理地址的访问权。
[0035]宾客软件的不同组件(例如,两个不同的应用或同一应用的两个不同的软件模块)可访问系统存储器的不同物理位置。VMM可通过将每个这样的组件与其自身的EPT页表层次相关联来在这些组件之间提供保护。例如,如果宾客软件对应于OS实例,则OS内核可布置成使不同的OS模块(包括诸如驱动器之类的插入OS的模块)从不同的存储器地址空间操作,从而保护每个模块免受同一 OS实例内的其它模块影响。例如,驱动器可被配置成访问物理存储器的一部分,而诸如OS内核之类的OS实例的其它模块可被配置成访问物理存储器的第二部分。通过进一步使得OS内核的存储器空间为只读,可保护OS内核免受其它较不受信任的软件模块(诸如驱动器)的影响。
[0036]改变保持在私有寄存器空间和VMCS中的EPT页表指针-地址会改变哪个EPT页表层次以及因此哪个转换方案用于VM的活动宾客软件。根据一个实施例,VMFUNC指令用于改变EPT页表指针地址而没有VM退出。程序流流过宾客软件的各软件模块,VMFUNC在软件模块之间的转变上执行以设置它们各自的适当地址空间。例如,当程序流从OS内核流至驱动器时,VMFUNC作为转变的一部分执行以设置驱动器的地址空间。同样,当程序流从驱动器流回OS内核时,VMFUNC再次在转变上执行以切换回OS内核的地址空间。
[0037]回顾在图3的步骤302,私有寄存器空间通过VM条目从VMCS加载。在实施例中,如果宾客地址空间切换服务要被启用用于宾客软件,则标识“指针表”的VMCS中的地址也被从VMCS加载到私有寄存器空间中。指针表对应于可从宾客软件利用的不同页表层次的集合。在实施例中,指针表由VMM预先配置。
[0038]图4a和4b涉及在CPU硬件中实现宾客地址切换服务的实施例。图4a是从如下角度绘制的:在此之后VM条目430已经出现,且作为VM条目进程的一部分,私有控制寄存器空间401、402、403已经由CPU利用来自VMCS404的信息加载,其指定以下内容:i) VMFUNC是否已经被启用401 ;ii)宾客地址切换是否已经被启用402 ;iii)指针表407的地址403 ;
iv)指向最初的页表层次A410的指针409。
[0039]尽管执行宾客软件,但位于私有寄存器空间409中的页表指针地址指向页表层次410,该页表层次410包括用于宾客软件的适当的地址转换信息。随后,宾客软件决定执行VMFUNC指令以调用宾客地址切换服务。在设置VMFUNC指令440的输入参数时,用标识宾客地址切换服务的值加载存储器或寄存器中的位置(在实施例中,EAX寄存器411),且用标识被切换到的(由页表层次B415表示)地址空间的页表指针地址414所处的指针表407中的条目413的值加载存储器或寄存器中的第二位置(在实施例中,ECX寄存器412)。
[0040]在执行指令时,CPU执行单元资源416首先读取寄存器/存储器空间411以理解宾客地址切换服务正在被调用,并且读取私有寄存器空间401和402以检查是否VMFUNC已被启用用于宾客软件,且如果是则宾客地址切换是否已经被启用用于宾客软件,450。在确认VMFUNC和宾客地址空间切换已经被启用之后,CPU执行单元资源416接下来读取寄存器空间403 (指针表的地址)和寄存器/存储器空间412 (指示指针表中的所选条目)以获取新的页表指针地址414(在指针表407中的条目413处),460,将其加载470到寄存器空间409并将其存储470到分配给VMCS404的寄存器或存储器空间中。在新的页表指针地址被加载之后,现使用页表层次415而不是页表层次410转换宾客软件的转换(S卩,宾客地址空间已经被切换)。
[0041]尽管以上的讨论致力于在CPU硬件中实现的宾客地址切换服务,然而由VMM提供的其它服务也可被集成到CPU中。这些包括但不限于以下:1)利用某些许可映射和取消映射存储器的特定区域;2)以特定方式处理虚拟中断(例如,定义虚拟中断控制器的操作特性);3)固定存储器以用作I/O缓冲器。注意,以上的项目I)和3)以及宾客地址空间切换功能均改变存储器配置。
[0042]图5示出一般的处理核500,该处理核500被认为描述许多不同类型的处理核架构,例如复杂指令集(CISC)、精简指令集(RISC)和超长指令字(VLIW)。图5的一般处理核500包括:1)获取单元503,其获取指令(例如,从高速缓存或存储器);2)解码单元504,其解码指令;3)调度单元505,其确定指令发布到执行单元506的时序和/或顺序(注意,调度器是任选的);4)执行单元506,其执行指令;5)引退单元507,其表示指令的成功完成。注意,处理核部分地或完全地可以包括或可以不包括微代码508,以控制执行单元506的微操作。在前面的讨论中提及的指令执行资源/逻辑可利用执行单元506内的执行单元中的一个或多个实现。
[0043]具有前述功能的处理核也可实现在各种计算系统中。图6示出计算系统(例如计算机)的一个实施例。图6的示例性计算系统包括:1)可被设计成包括两个和三个寄存器标量整数和向量指令执行的一个或多个处理核601 ;2)存储器控制中枢(MCH)602 ;3)系统存储器603 (其存在不同的类型,例如DDR RAM,EDO RAM等);4)高速缓存604 ;5) I/O控制中枢(ICH)605;6)图形处理器606 ;7)显示器/屏幕607 (其存在不同的类型,例如阴极射线管(CRT)、平板、薄膜晶体管(TFT)、液晶显示器(LCD)、DPL等)以及一个或多个I/O设备608。
[0044]—个或多个处理核601执行指令以执行计算系统实现的任何软件例程。指令频繁地涉及在数据上执行的某些种类的操作。数据和指令两者被存储在系统存储器603和高速缓存604中。高速缓存604通常被设计成具有比系统存储器603更短的等待时间。例如,高速缓存604可被集成到与处理器相同的硅片上和/或以较快的SRAM单元构造,而系统存储器603可以较慢的DRAM单元构造。通过往往将较频繁使用的指令和数据存储在高速缓存604而非系统存储器603中,计算机系统的总体性能效率提升。
[0045]系统存储器603有意地供计算系统中的其它组件使用。例如,从计算系统的各接口(例如键盘和鼠标、打印机端口、LAN端口、调制解调器端口等)接收或从计算系统(例如硬盘驱动器)的内存元件获取的数据在软件程序执行中由一个或多个处理器601对其运行前经常被临时地排队进入系统存储器603。类似地,软件程序确定应当从计算系统通过计算系统接口之一送至外部实体或存储在内存元件中的数据经常在传输或存储之前临时地排队进入系统存储器603。
[0046]ICH605负责确保该数据正确地在系统存储器603及其合适的对应计算系统接口(以及内存设备,如果计算系统是如此设计的话)之间传递。MCH602负责管理系统存储器603在处理器601、接口和内存元件之间的访问的各种竞争请求,这些竞争请求相对于彼此在时间上紧接地出现。
[0047]一个或多个I/O设备608也被实现在典型的计算系统中。I/O设备一般负责将数据转移至计算系统(例如联网适配器)和/或从计算系统转移;或者负责计算系统中的大规模非易失性存储(例如硬盘驱动器)。ICH605在其自身与所示I/O设备608之间具有双向点对点链路。
[0048]以上讨论教示的进程可利用程序代码执行,诸如机器可执行指令,其导致机器执行这些指令以实现某些功能。在这种背景下,“机器”可以是将中间形式(例如抽象)指令转换成处理器专用指令(例如,抽象执行环境,诸如“虚拟机”(例如,Java虚拟机)解释器、公共语言运行时、高级语言虚拟机等)和/或设置在被设计成执行指令的半导体芯片中的电子电路(例如以晶体管实现的“逻辑电路”),诸如通用处理器和/或专用处理器。以上讨论示教的进程还可通过设计成执行进程(或其一部分)的电子电路来执行(替换机器或与机器组合),而不执行程序代码。
[0049]相信以上讨论示教的进程也可按各种软件部署框架(例如微软公司的.NET、Mono、Java,甲骨文公司的Fus1n等)支持的各种面向对象或非面向对象的计算机编程语言(例如,Java、C#> VB>Python> C、C++、J#、APL、Cobol、Fortran、Pascal、Perl 等)在源级程序代码中描述。源极程序代码可被转换成中间形式的程序代码(诸如Java字节代码、微软中间语言等),可将其理解为抽象执行环境(例如,Java虚拟机、公共语言运行时、高级语言虚拟机、解释器等),或者可直接编译成对象代码。
[0050]根据各种方法,通过I)编译中间形式的程序代码(例如在运行时间(例如JIT编译器)),2)解释中间形式的程序代码或3)在运行时间编译中间形式的程序代码和解释中间形式的程序代码的组合,抽象执行环境可将中间形式的程序代码转换成处理器专用代码。抽象执行环境可运行在各种操作系统上(诸如UNIX、LINUX、包括Windows族的微软操作系统、包括MacOS X的苹果计算机操作系统、Sun/Solaris、OS/2、Novell等)。
[0051]制品可用于存储程序代码。存储程序代码的制品可体现为但不限于一个或多个存储器(例如,一个或多个闪存、随机存取存储器(静态、动态或其它))、光盘、CD-ROM、DVDROM、EPROM、EEPR0M、磁或光卡或适于存储电子指令的其它类型的机器可读介质。还可从远程计算机(例如,服务器)将程序代码作为体现在传播介质中的数据信号(例如,经由通信链路(例如,网络连接))下载至请求计算机(例如,客户机)。
[0052]在上述说明书中,已参考本发明具体示例实施例描述了本发明。然而,显然可对这些实施例作出各种修改和改变,而不背离如所附权利要求所述的本发明的更宽泛精神和范围。
【权利要求】
1.一种由处理器执行的方法,包括: 执行改变运行在虚拟机上的宾客软件的地址空间的指令,所述执行包括: 在不退出所述虚拟机的进程的情况下,所述处理器的指令执行逻辑电路在私有寄存器空间中用指向第二页表层次的第二指针替换指向第一页表层次的第一指针,第一页表层次用于为在第一存储器区域外操作的所述宾客软件的第一部分执行地址转换,第二页表层次用于为在第二存储器区域外操作的所述宾客软件的第二部分执行地址转换。
2.—种半导体芯片,包括: 处理器,所述处理器具有耦合到寄存器空间的指令执行逻辑,所述指令执行逻辑响应于指令在所述寄存器空间中用指向第二页表层次的第二指针替换指向第一页表层次的第一指针,第一页表层次用于为在第一存储器区域外操作的VM宾客软件的第一部分执行地址转换,第二页表层次用于为在第二存储器区域外操作的所述宾客软件的第二部分执行地址转换。
3.一种机器可读介质,包含存储的程序代码,所述程序代码在被计算系统的处理器处理时导致执行一种方法,所述方法包括: 在所述处理器上执行虚拟机监视器的第一程序代码; 在所述处理器上执行所述虚拟机监视器支持的虚拟机的第二程序代码; 在所述处理器上执行所述虚拟机支持的宾客软件的第三程序代码,执行程序代码不提供的服务的指令; 在所述处理器上执行请求所述第一程序代码或所述程序代码不提供的服务的指令,在所述虚拟机的进程内在所述处理器的硬件中执行所述服务,所述服务改变存储器配置或配置对虚拟中断的响应行为。
4.一种处理核,包括: 指令执行逻辑电路和寄存器空间,所述寄存器空间从VMCS加载,与VM条目相称,具有指示由处理核代表所述VMM提供的服务是否被启用的信息,所述指令执行逻辑响应于宾客软件调用指令用于: 引用所述寄存器空间以确认所述服务已经被启用,以及 引用第二寄存器空间或存储器空间以获取所述宾客软件编写的所述服务的输入参数。
【文档编号】G06F9/30GK104137056SQ201280057792
【公开日】2014年11月5日 申请日期:2012年9月28日 优先权日:2011年10月28日
【发明者】G·尼格, B·E·亨特利, R·L·萨希塔, V·尚伯格, J·W·布兰德特 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1