一种支持x86虚拟机的risc处理器装置及方法

文档序号:6463117阅读:291来源:国知局
专利名称:一种支持x86虚拟机的risc处理器装置及方法
技术领域
本发明涉及微处理器体系架构跨平台兼容技术领域,特别是涉及一种支持X86虚拟机的精简指令集计算机(RISC)处理器装置及方法。

背景技术
中央处理器(CPU)简称微处理器,是计算机的核心单元。微处理器采用的指令集、设计规范(体系结构)是计算机的首要特征,它决定了计算机需要采用的外围设备和应用软件的类型。
当今世界比较流行的两大处理器体系结构分别为以MIPS公司的MIPS32/64指令集为代表的精简指令集计算机(Reduced Instruction SetComputing,RISC)处理器体系结构和以Intel公司的X86为代表的复杂指令集计算机(Complex Instruction Set Computing,CISC)处理器体系结构。CISC处理器指令数量繁多,一些指令可执行相当复杂的功能,一般需要许多时钟周期来执行;RISC处理器使用较少数量的可用指令,以更高的速率执行一组更简单的功能。而采用不同的体系结构的处理器上运行的程序软件需要针对处理器的体系结构专门编写,X86上的应用软件通常不能在MIPS指令集的RSIC处理器的计算机上运行,即常说的不兼容。
然而计算机制造商希望通过在自己制造的一种体系结构的微处理器上运行更多的现有软件来节省软件开发的开销,同时达到市场占有率最大化的目的。
为了解决这一问题,虚拟机应运而生。一般地,将具有一种类型体系结构的处理器(CPU)计算机称为主机;同时将需要主机仿真的,不相关体系结构类型的处理器(CPU)环境称为目标机,需要一种应用程序,这种程序能够促使主机执行一个或多个主机指令,响应于给定的目标机指令,运行为目标机编写的软件,这种程序就叫虚拟机。
目前现有的虚拟机有SimOS,QEMU,Transmeta等,但是现有的虚拟机由于各种体系结构的巨大差异造成虚拟机运行开销过大,执行效率过低,很难应用到实际工作中。
而从X86虚拟机到RISC的二进制指令翻译效率,很大程度上依靠RISC和X86体系结构上的相似性。但是,X86体系结构的很多特性是RISC架构所没有的,包括X86体系结构中的定点运算指令支持标志位运算;X86架构中80位的浮点数操作和浮点栈运算;段基址寄存器的存在等特性。这样,使得RISC处理器上的X86虚拟机在运算过程中,由于不同体系结构指令的翻译问题,而使得二进制指令翻译效率低下,不能提高运算速度。


发明内容
本发明的目的在于提供一种支持X86虚拟机的RISC处理器装置及方法。其提高RISC处理器性能。
为实现本发明目的而提供的一种支持X86虚拟机的RISC处理器,包括指令模块,译码器,查找表,定点运算部件和浮点运算部件,其中 所述指令模块包括扩展指令模块,用于存储支持X86虚拟机的虚拟机指令集; 所述译码器,用于在虚拟机指令集指令译码过程中,区分出指令的虚拟机指令集模式,将指令按照所区分的虚拟机指令集模式,进行译码后输出给定点运算部件或者浮点运算部件; 所述查找表,用于对X86程序中的跳转地址到MIPS跳转地址的翻译进行快速查找,提高虚拟机性能; 所述定点运算部件用于根据译码器的输出,对虚拟机指令集的定点指令进行相应的处理,输出执行的结果; 所述浮点运算部件用于根据译码器的输出,对虚拟机指令集的浮点指令进行相应的处理,输出执行结果。
所述的支持X86虚拟机的RISC处理器,还包括访存执行单元,内存及相应的数据通路; 所述访存执行单元根据译码器的输出,通过数据通路完成内部寄存器与内存之间的数据传输。
所述的支持X86虚拟机的RISC处理器,还包括通用物理寄存器堆,所述通用物理寄存器堆包括溢出检查寄存器,上界、下界地址寄存器,模拟标志寄存器,虚拟机模式控制寄存器; 所述溢出检查寄存器,用于在对所述栈寄存器进行浮点访问时检查是否存在栈溢出例外; 所述上界、下界地址寄存器,用于模拟X86处理器的有界访存机制时存储作为上界、下界的有效地址; 所述模拟标志寄存器,用于模拟实现CISC处理器的标志寄存器标志位; 所述虚拟机模式控制寄存器,当该控制位标志为1时表示此时相应的指令运行在X86虚拟机指令集模式下;当该控制位标志为0时表示指令运行在非X86虚拟机指令集模式下。
所述的支持X86虚拟机的RISC处理器,还包括浮点寄存器堆; 所述浮点寄存器堆包括浮点控制寄存器;浮点寄存器栈;以及第1~3浮点寄存器。
所述虚拟机指令集包括多倍访存指令、前缀指令、EFLAG标志位指令、浮点栈相关指令、查找表指令中的一种或者一种以上的组合。
所述译码器包括指令处理模块,模式识别模块,其中 所述指令处理模块,用于对虚拟机指令集的指令进行指令译码,然后输出给定点运算部件或者浮点运算部件; 所述模式识别模块,用于在指令译码过程中,区分出指令的虚拟机指令集模式,进行相应的处理。
所述模式识别模块包括多倍存储译码模块和/或多倍读取译码模块; 所述多倍存储译码模块,用于在输入的指令是访存扩展指令中的存储操作指令时,将源寄存器由一个扩展成多个相邻的寄存器,然后输出到访存执行单元执行; 所述多倍读取译码模块,用于在输入的指令是访存扩展指令中的读取操作指令时,将该读取操作指令译码为多条内部操作指令,将目标寄存器由一个扩展成多个相邻的寄存器,然后分配到所述多条内部操作中,输出到执行单元执行。
所述模式识别模块还包括前缀指令译码模块和标志位指令译码模块; 所述标志位指令译码模块,用于对处于模拟EFLAGS工作模式下的EFLAG标志位指令进行处理,根据不同的EFLAG标志位指令,将模拟标志寄存器译码为其指令的源寄存器和/或目标寄存器; 所述前缀指令译码模块,用于指示前缀指令后的多条指令处于X86虚拟机指令集模式下。
当前缀指令的范围参数为n时,译码器还包括前缀指令计数器,用于记录受前缀指令影响且不出现转移指令的指令序列的指令数n。
所述译码器还包括TOP指针寄存器,查找表模块,其中 所述TOP指针寄存器,用于维护一浮点栈操作指针,存储浮点栈栈操作指针的值; 所述查找表模块,用于根据查找表指令,利用查找表实现从X86源指令地址到MIPS目标指令地址的转换。
所述定点运算部件包括标志读写模块,标志运算模块,例外处理模块,前缀例外控制寄存器; 所述标志读写模块,用于读写模拟标志寄存器标志位的值; 所述标志运算模块,用于在运算过程中,当RISC处理器处于X86虚拟机工作模式时,根据模拟标志寄存器标志位的值,进行控制; 所述例外处理模块,用于在前缀指令只影响紧接其后的一条指令时,如果出现执行例外,则采用与延迟槽例外相同的方法,将Cause寄存器的bd位置1,同时将EPC指向前缀指令,例外服务程序完成后重新执行前缀指令; 所述前缀例外控制寄存器,用于记录发生例外的指令是否受所述前缀指令影响;在出现异常而中断进程的时候存入当前指令的计数,在异常结束返回被中断进程时,根据所述计数恢复所述被中断进程。
所述浮点运算部件包括指针操作模块,栈溢出判断模块,转换模块; 所述指针操作模块,用于对所述指针寄存器进行操作,在模拟所述浮点寄存器栈操作时,模拟所述指针寄存器的栈操作指针的栈操作,修改并监控栈操作指针的状态; 所述栈溢出判断模块,用于检查指定的浮点寄存器栈中的栈寄存器,并根据栈寄存器的值对溢出检查寄存器进行操作,进行浮点栈溢出检查; 所述转换模块,用于进行扩展双精度浮点数据和双精度浮点数据之间的相互转换。
为实现本发明目的还提供一种RISC处理器装置支持X86虚拟机的数据处理方法,包括下列步骤 步骤A,在RISC处理器中设置处于RISC处理器的X86虚拟机工作模式; 步骤B,读取指令,区分指令的虚拟机指令集模式;在指令译码过程中,根据区分出的指令的虚拟机指令集模式,将指令按照所区分的虚拟机指令集模式,进行译码后输出; 步骤C,根据所述输出,进行相应的计算或存取处理,输出执行的结果。
当处理器支持X86虚拟机的数据处理过程为对使用EFLAG指令的支持时,包括以下步骤 步骤A1,在RISC处理器中设置处于RISC处理器的X86虚拟机工作模式,即模拟标志寄存器可用; 步骤B1,译码器识别出运算是处于模拟EFLAGS工作模式下,然后根据不同的指令,将模拟标志寄存器译码为源寄存器和/或目标寄存器; 步骤C1,RISC处理器在运算过程中,当处于RISC处理器的X86虚拟机工作模式时,读写模拟标志寄存器标志位的值,和/或根据模拟标志寄存器标志位的值,进行控制。
当处理器支持X86虚拟机的数据处理过程为对X86浮点格式和浮点栈的支持时,包括以下步骤 步骤A2,根据栈使能位,决定是否选定浮点寄存器用于模拟浮点寄存器栈操作;或者设置一通用寄存器,其低8位由低到高分别表示浮点寄存器栈的栈寄存器0~7号的状态;或者选用任意三个通用寄存器,作为第一浮点寄存器,第二浮点寄存器和第三浮点寄存器,担任转换工作; 步骤B2,在译码器中3位的指针寄存器,存放栈操作指针的值;或者对新增的栈溢出判断指令译码;或者对扩展双精度浮点数据与双精度浮点数据的转换指令译码; 步骤C2,在模拟浮点寄存器栈操作时,对指针寄存器进行操作,模拟栈操作指针的栈操作,修改并监控栈操作指针的状态;或者检查指定的浮点寄存器栈中的栈寄存器,并根据栈寄存器的值对溢出检查寄存器进行操作,进行浮点栈溢出检查;或者执行扩展双精度浮点数据与双精度浮点数据之间的数据转换。
当处理器支持X86虚拟机的数据处理过程为对X86存储结构的支持时,包括以下步骤 步骤A3,在RISC处理器的X86虚拟机中,设置两个通用寄存器分别为上界地址寄存器和下界地址寄存器; 步骤B3,在进行X86虚拟机指令集到MIPS指令集翻译时,译码器将指令进行译码,得到可被RISC处理器处理的二进制代码; 步骤C3,定点运算部件在译码后的访存指令中,根据上界地址寄存器中存储的上界地址和/或下界地址寄存器中存储的下界地址,判断指令操作数地址和指令地址的有效性;当地址皆为有效时,执行访存操作;否则引发地址错例外。
当处理器支持X86虚拟机的数据处理过程为对虚拟机制的支持时,包括以下步骤 步骤A4,读取前缀指令,区分指令的虚拟机指令集模式;或者处理器取出多倍数据宽度指令输入到译码器;或者在RISC处理器的X86虚拟机启动时,初始化查找表,用得到的X86虚拟机指令地址到MIPS指令地址的内容来填写查找表; 步骤B4,在指令译码过程中,根据区分出的指令的虚拟机指令集模式,将指令按照所区分的虚拟机指令集模式,进行译码后输出;或者译码器判断指令类型,识别并译码多倍数据宽度指令;或者译码器识别查找表相关指令进行译码; 步骤C4,定点运算部件执行受前缀指令影响的指令,并根据运算结果计算相应的EFLAG标志位;或者将译码后的多倍数据宽度指令发送到执行单元执行操作;或者执行查找表相关指令,得到目标指令地址的值或者跳转到目标地址执行。
本发明的有益效果是本发明支持X86虚拟机的RISC处理器装置及方法,缩小了X86和RISC体系结构上的语义差距,实现了在RISC处理器上对X86虚拟机的支持,提高了RISC处理器中X86虚拟机的处理速度,提升了RISC处理器性能。



图1为本发明支持X86虚拟机的RISC处理器装置结构示意图; 图2为本发明支持X86虚拟机的RISC处理器数据处理方法流程图。

具体实施例方式 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明的支持X86虚拟机的RISC处理器装置及方法进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明实施例中,以MIPS64指令集的RISC处理器为例,对本发明支持X86虚拟机的RISC处理器装置及方法进行详细说明,但应当说明的是,其并不是对本发明的限制,本发明请求保护的范围,以权利要求书为准。
本发明的支持X86虚拟机的RISC处理器装置及方法,为解决X86和RISC处理器体系结构上的语义差距,实现在RISC处理器上对X86处理器兼容的支持,需要在RISC处理器上解决以下几个方面的问题 1、对使用EFLAG指令的支持; 2、对浮点格式和浮点栈的支持; 3、对存储结构的支持; 4、对虚拟机制的支持。
本发明的支持X86虚拟机的RISC处理器,包括指令模块1,译码器2,定点运算部件3,通用物理寄存器堆7,浮点运算部件4,浮点物理寄存器堆8,访存执行单元5,内存及数据通路6等。
所述指令模块1包括扩展指令模块,用于存储支持X86虚拟机的虚拟机指令集,所述虚拟机指令集包括多倍访存指令、前缀指令、EFLAG标志位指令、浮点栈相关指令、查找表指令中的一种或者一种以上的组合。
所述译码器2,用于在虚拟机指令集指令译码过程中,区分出指令的虚拟机指令集模式,将指令按照所区分的虚拟机指令集模式,进行译码后输出给定点运算部件3或者浮点运算部件4; 所述定点运算部件3用于根据译码器2的输出,对虚拟机指令集的定点指令进行处理,输出执行的结果。
所述浮点运算部件4用于根据译码器2的输出,对虚拟机指令集的浮点指令进行处理,输出执行结果。
所述访存执行单元5,用于根据译码器的输出,通过数据通路完成内部寄存器与内存之间的数据传输。
较佳地,所述译码器2包括指令处理模块21,模式识别模块24,TOP指针寄存器22,查找表模块23。
所述指令处理模块,用于对虚拟机指令集的指令进行指令译码,然后输出给定点运算部件3或者浮点运算部件4或者访存执行单元5; 所述模式识别模块24,用于在指令译码过程中,区分出指令的虚拟机指令集模式,进行相应的处理。
所述模式识别模块24包括多倍存储译码模块244和/或多倍读取译码模块245。
所述多倍存储译码模块244,用于在输入的指令是访存扩展指令中的存储操作指令时,将源寄存器由一个扩展成多个相邻的寄存器,然后输出到访存执行单元5执行; 所述多倍读取译码模块245,用于在输入的指令是访存扩展指令中的读取操作指令时,将该读取操作指令译码为多条内部操作指令,将目标寄存器由一个扩展成多个相邻的寄存器,然后分配到所述多条内部操作中,输出到访存执行单元5执行。
所述模式识别模块24还包括前缀指令译码模块241和标志位指令译码模块243。
所述标志位指令译码模块243,用于对处于模拟EFLAGS工作模式下的EFLAG标志位指令进行处理,根据不同的EFLAG标志位指令,将模拟标志寄存器71译码为其指令的源寄存器和/或目标寄存器; 所述前缀指令译码模块241,用于指示前缀指令后的多条指令处于X86虚拟机指令集模式下;进一步地,当前缀指令的范围参数为n时,译码器2还包括前缀指令计数器242,用于记录受前缀指令影响且不出现转移指令的指令序列的指令数n; 所述TOP指针寄存器22,用于维护一浮点栈操作指针,存储浮点栈栈操作指针的值; 所述查找表模块23,用于根据查找表指令,利用查找表实现从X86源指令地址到MIPS目标指令地址的转换。
所述定点运算部件3包括标志读写模块31,标志运算模块32,例外处理模块34,前缀例外控制寄存器33。
所述标志读写模块31,用于读写模拟标志寄存器71标志位的值; 所述标志运算模块32,用于在运算过程中,当RISC处理器处于X86虚拟机工作模式时,根据模拟标志寄存器71标志位的值,进行控制; 所述例外处理模块34,用于在前缀指令只影响紧接其后的一条指令时,如果出现执行例外,则采用与延迟槽例外相同的方法,将Cause寄存器的bd位置1,同时将EPC指向前缀指令,例外服务程序完成后重新执行前缀指令。
所述前缀例外控制寄存器33,用于记录发生例外的指令是否受所述前缀指令影响;在出现异常而中断进程的时候存入当前指令的计数,在异常结束返回被中断进程时,根据所述计数恢复所述被中断进程。
所述通用物理寄存器堆7包括溢出检查寄存器72,上界、下界地址寄存器74,模拟标志寄存器71,虚拟机模式控制寄存器73。
所述溢出检查寄存器72,用于在对所述栈寄存器进行浮点访问时检查是否存在栈溢出例外; 所述上界、下界地址寄存器74,用于模拟X86处理器的有界访存机制时存储作为上界、下界的有效地址; 所述模拟标志寄存器71,用于模拟实现CISC处理器的标志寄存器标志位; 所述虚拟机模式控制寄存器73,当该控制位标志为1时表示此时相应的指令运行在X86虚拟机指令集模式下;当该控制位标志为0时表示指令运行在非X86虚拟机指令集模式下。
所述浮点运算部件4包括指针操作模块41,栈溢出判断模块43,转换模块42。
所述指针操作模块41,用于对所述指针寄存器进行操作,在模拟所述浮点寄存器栈83操作时,模拟所述指针寄存器的栈操作指针的栈操作,修改并监控栈操作指针的状态; 所述栈溢出判断模块43,用于检查指定的浮点寄存器栈83中的栈寄存器,并根据栈寄存器的值对溢出检查寄存器72进行操作,进行浮点栈溢出检查; 所述转换模块42,用于进行扩展双精度浮点数据和双精度浮点数据之间的相互转换。
所述浮点寄存器堆8包括浮点控制寄存器81;0~7号浮点寄存器栈83;以及第1~3浮点寄存器82。
所述第1~3浮点寄存器82这三个寄存器可以与所述0~7号浮点寄存器栈83交叉重叠应用。
所述访存执行单元5包括合并单元,上下界判断模块。
所述合并单元,用于在多倍读取译码模块244对读取内存操作指令译码后,在执行单元执行前,把多个内部操作进行合并。
所述上下界判断模块,用于支持有界访存指令时对上界、下界地址判断访存指令所包含的地址进行有效性判断。
为实现本发明目的还提供一种RISC处理器装置支持X86虚拟机的数据处理方法,包括下列步骤 步骤A,在RISC处理器中设置处于RISC处理器的X86虚拟机工作模式; 步骤B,读取指令,区分指令的虚拟机指令集模式;在指令译码过程中,根据区分出的指令的虚拟机指令集模式,将指令按照所区分的虚拟机指令集模式,进行译码后输出; 步骤C,根据所述输出,进行相应的计算或存取处理,输出执行的结果。
当处理器支持X86虚拟机的数据处理过程为对使用EFLAG指令的支持时,包括以下步骤 步骤A1,在RISC处理器中设置处于RISC处理器的X86虚拟机工作模式,即模拟标志寄存器71可用; 步骤B1,译码器识别出运算是处于模拟EFLAGS工作模式下,然后根据不同的指令,将模拟标志寄存器71译码为源寄存器和/或目标寄存器; 步骤C1,RISC处理器在运算过程中,当处于RISC处理器的X86虚拟机工作模式时,读写模拟标志寄存器71标志位的值,和/或根据模拟标志寄存器71标志位的值,进行控制。
当处理器支持X86虚拟机的数据处理过程为对X86浮点格式和浮点栈的支持时,包括以下步骤 步骤A2,根据栈使能位,决定是否选定浮点寄存器用于模拟浮点寄存器栈83操作;或者设置一通用寄存器,其低8位由低到高分别表示浮点寄存器栈83的栈寄存器0~7号的状态;或者选用任意三个通用寄存器,作为第1~3浮点寄存器82,担任转换工作; 步骤B2,在译码器中3位的指针寄存器,存放栈操作指针的值;或者对新增的栈溢出判断指令译码;或者对扩展双精度浮点数据与双精度浮点数据的转换指令译码; 步骤C2,在模拟浮点寄存器栈83操作时,对指针寄存器进行操作,模拟栈操作指针的栈操作,修改并监控栈操作指针的状态;或者检查指定的浮点寄存器栈83中的栈寄存器,并根据栈寄存器的值对溢出检查寄存器72进行操作,进行浮点栈溢出检查;或者执行扩展双精度浮点数据与双精度浮点数据之间的数据转换。
当处理器支持X86虚拟机的数据处理过程为对X86存储结构的支持时,包括以下步骤 步骤A3,在RISC处理器的X86虚拟机中,设置两个通用寄存器分别为上界、下界地址寄存器74; 步骤B3,在进行X86虚拟机指令集到MIPS指令集翻译时,译码器将指令进行译码,得到可被RISC处理器处理的二进制代码; 步骤C3,定点运算部件在译码后的访存指令中,根据上界地址寄存器中存储的上界地址和/或下界地址寄存器中存储的下界地址,判断指令操作数地址和指令地址的有效性;当地址皆为有效时,执行访存操作;否则引发地址错例外。
当处理器支持X86虚拟机的数据处理过程为对虚拟机制的支持时,包括以下步骤 步骤A4,读取前缀指令,区分指令的虚拟机指令集模式;或者处理器取出多倍数据宽度指令输入到译码器;或者在RISC处理器的X86虚拟机启动时,初始化查找表,用得到的X86虚拟机指令地址到MIPS指令地址的内容来填写查找表; 步骤B4,在指令译码过程中,根据区分出的指令的虚拟机指令集模式,将指令按照所区分的虚拟机指令集模式,进行译码后输出;或者译码器判断指令类型,识别并译码多倍数据宽度指令;或者译码器识别查找表相关指令。
步骤C4,定点运算部件执行受前缀指令影响的指令,并根据运算结果计算相应的EFLAG标志位。或者将译码后的多倍数据宽度指令发送到执行单元执行操作。或者执行查找表相关指令,得到目标指令地址的值或者跳转到目标地址执行。
下面详细描述当处理器支持X86虚拟机的数据处理过程为对使用EFLAG指令的支持时,RISC处理器装置支持X86虚拟机的数据处理方法过程。
为了对使用EFLAG指令的支持,提供两种方式一种是将物理寄存器堆中每个物理寄存器扩展为72位,包括64位和数据位和8位的标志位。运算时把运算结果的数据部分和标志部分一起写回到目标寄存器中。同时在译码器2中设置一个最新标志位指针Reflag,指示与最新标志位结合的通用寄存器逻辑编号。另一种是在物理寄存器堆中增加设置一内部逻辑寄存器专门实现X86的EFLAG标志位,对于每一条修改EFLAG的运算指令都增加新的相关指令来专门修改EFLAG。
上述两种方式,第一种是在每一个寄存器中“横向”增加EFLAG位;第二种方法是在所有寄存器的“纵向”增加一个寄存器专门保存EFLAG位。
作为一种可实施方式,为进行支持X86_EFLAGS标志位,本发明的支持X86虚拟机的RISC处理器装置,所述模拟标志寄存器71(M-EFLAGS),用于模拟实现X86指令集的CISC处理器的标志寄存器(EFLAGS)标志位,该寄存器的低六位由低到高分别表示CF位、PF位、AF位、ZF位、SF位和OF位。
下面详细说明本发明支持X86虚拟机的RISC处理器的寄存器标志位处理过程,其包括下列步骤 步骤110,在RISC处理器中设置处于RISC处理器的X86虚拟机工作模式,即模拟标志寄存器71可用,译码器2识别出运算是处于RISC处理器的X86虚拟机工作模式,即模拟EFLAGS工作模式下,然后根据不同的指令,将模拟标志寄存器71译码为源寄存器和/或目标寄存器; 模拟标志寄存器(M-EFLAGS)模拟实现X86指令集的标志寄存器(EFLAGS)标志位,该寄存器的低六位由低到高分别表示CF位、PF位、AF位、ZF位、SF位和OF位。
在模拟标志寄存器71可用时,识别出该运算是在RISC处理器的X86虚拟机工作模式,即模拟EFLAGS工作模式下,根据执行结果修改相应模拟标志寄存器71的值,然后根据不同的指令,将模拟标志寄存器译码为源寄存器和/或目标寄存器,而可以不在原有目标寄存器中保存结果。
作为一种可实施方式,与模拟标志寄存器相关的指令在修改模拟标志寄存器的标志位时,该指令之前有一条标明该指令是在RISC处理器的X86虚拟机工作模式下的前缀指令SETFLAG,表示如果其后指令处于X86虚拟机模式下。
指令格式为SETFLAG/模拟EFLAGS工作模式前缀指令 表示紧跟在该指令后的一条指令处于模拟EFLAGS工作模式。
那么它在执行时,只根据执行结果修改相应的模拟标志寄存器71的标志位的值,而不在目标寄存器中保存结果,举例如下 正常的MIPS指令 ADD$5,$1,$2 表示将1号通用寄存器和2号通用寄存器中的值相加,结果存于5号通用寄存器中; 而修改模拟标志寄存器71的标志位的指令为 SETFLAG ADD$5,$1,$2 表示将1号通用寄存器和2号通用寄存器中的值相加,运算结果不保存,而根据结果修改模拟标志寄存器中的标志位相应位。
译码器2的输入集是所有可能的32位编码,包括所有合法及非法指令。对于这种方式,译码器2新增了一种合法输入,SETFLAG,表示紧跟在该指令后的一条指令处于RISC处理器的X86虚拟机工作模式,即模拟EFLAGS工作模式。
译码器2根据前缀指令,在前缀指令后一条指令译码时,其输出根据模拟EFLAGS工作模式,调整内部操作码送到定点运算部件3,此时这条指令的目的寄存器经过译码后变为模拟标志寄存器(M-EFLAGS),其中一个源寄存器也为模拟标志寄存器(M-EFLAGS)。因为有些运算只修改一部分模拟标志寄存器(M-EFLAGS),所以需要把原有的模拟标志寄存器(M-EFLAGS)送到定点运算部件3。
其中,所述调整内部操作码,包括经过重命名即逻辑寄存器到物理寄存器映射,以及读写寄存器端口等操作内容属于本领域技术人员熟知内容,因此在本发明中不再一一详细描述。
译码器2译码后,将指令输出到定点运算部件3,定点运算部件3判断内部操作码,如果是正常指令,按照正常步骤运算;如果是模拟EFLAGS工作模式下,则先计算结果,再按照计算结果和中间结果置模拟标志寄存器(M-EFLAGS)标志位,计算结果可以不保存到目标寄存器中。
作为另一种可实施方式,对于本发明中使用频度很大的修改模拟标志寄存器的标志位的指令,将对X86指令进行一对一的对应,这样一条指令等价于原来的两条指令(一条SETFLAG一条正常MIPS指令)。举例如下 对于使用频度很大的修改模拟标志寄存器的标志位的加指令(ADD),定义指令X86ADD,从而 X86ADD$5,$1,$2 等价于 SETFLAG ADD$5,$1,$2 这些使用频度很大的指令,在译码时分配单独的指令槽,功能部件在识别出这些指令后,产生的结果不送入目标寄存器中,而是根据结果产生相应的模拟标志寄存器(M-EFLAGS)标志位,把标志位送入模拟标志寄存器(M-EFLAGS)。
步骤120,RISC处理器在运算过程中,当处于RISC处理器的X86虚拟机工作模式时,读写模拟标志寄存器标志位的值,和/或根据模拟标志寄存器标志位的值,进行控制。
所述步骤120中,读写模拟标志寄存器标志位的值,包括下列步骤 步骤121,当处于RISC处理器的X86虚拟机工作模式时,提取一位或者多位模拟标志寄存器标志位的值,根据其中的8位掩码(mask)值来控制提取模拟标志寄存器中的一位或者几位,提取出来的模拟标志寄存器71标志位的值存入目标寄存器中; 步骤122,当处于RISC处理器的X86虚拟机工作模式时,修改一位或者多位模拟标志寄存器标志位的值,根据其中的8位掩码(mask)值来控制修改模拟标志寄存器中的一位或者几位,使用源寄存器中的值对模拟标志寄存器进行修改。
作为一种可实施方式,本发明实施例通过两条指令MTFLAG和MFFLAG修改或者读取模拟标志寄存器标志位的值,它们使用8位的掩码(mask)来修改或者读取模拟标志寄存器的相应标志位,它们分别可以写模拟标志寄存器标志位的值和将模拟标志寄存器标志位的值读出来到一指定的通用寄存器中。
MTFLAG指令实现提取一位或者多位模拟标志寄存器(M-EFLAGS)标志位的值,根据指令中的8位掩码(mask)值(由立即数来表示)来控制提取模拟标志寄存器中的一位或者几位,提取出来的模拟标志寄存器(M-EFLAGS)标志位的值存入目标寄存器GPR[rt]中。
由掩码(mask)提取模拟标志寄存器中标志位的实现由以下关系式表示 GPR[rt]←M-EFLAGS & mask 例如,掩码(mask)值为0x00000100,那么将提取模拟标志寄存器(M-EFLAGS)第2位即为AF位的内容,放入目标寄存器GPR[rt]中。
MTFLAG指令直接修改一位或者多位模拟标志寄存器(M-EFLAGS)标志位的值,根据指令中的8位掩码(mask)值(由立即数来表示)来控制修改模拟标志寄存器(M-EFLAGS)中的一位或者几位,使用GPR[rs]源寄存器中的值对模拟标志寄存器(M-EFLAGS)进行修改。
由掩码(mask)控制修改模拟标志寄存器(M-EFLAGS)中标志位的实现由以下关系式表示 M-EFLAGS & mask←GPR[rs] 比如,GPR[rs]低8位的内容为0x00010010,掩码(mask)字段的值为0x00110011,那么这条指令修该模拟标志寄存器(M-EFLAGS)中的CF、PF、SF和OF位,将这四位的值分别置0、1、1和0。
所述步骤120中,所述控制过程包括下列步骤 步骤121’,根据运算结果得到模拟标志寄存器(M-EFLAG)标志位; 例如,根据模拟标志寄存器(M-EFLAG)标志位,直接运算的指令如X86ADD指令。
x86ADD/只影响EFLAGS位的32位加法 指令格式 X86ADD rs,rt X86ADD指令实现GPR[rs]寄存器中32位的整数和GPR[rt]寄存器中32位整数相加,产生32位的结果,结果不保存,只根据结果修改模拟标志寄存器(M-EFLAGS)的OF/SF/ZF/AF/PF位。
步骤122’,根据模拟标志寄存器(M-EFLAG)标志位中的一位或者多位,执行分支跳转指令。
如X86J M-EFLAGS条件转移 指令格式 X86J.fmt offset X86J指令实现比较EFLAGS的某几位,根据相应的条件进行处理器相关的跳转。
其中不同的指令后缀(fmt)代表着不同的条件,如X86J.a fmt=0,表示当CF=0并且ZF=0时跳转。
MIPS64指令集的32位指令码的高6位(31bit:26bit)为opcode域。其中SPECIAL2(opcode为011100)指令槽按MIPS的规定是可以由用户自主定义的。本发明实施例新增指令全部都是利用现有MIPS64指令集中保留的SPECIAL2空槽的值来实现的。
下面详细描述当处理器支持X86虚拟机的数据处理过程为对X86浮点格式和浮点栈的支持时,RISC处理器装置支持X86虚拟机的数据处理方法过程。
X86提供一个特殊的运算部件,支持80位浮点精度,并且是栈操作方式,这些与RISC处理器有较大的不同。本发明为实现对浮点格式和浮点栈的支持,增加设置3条64位浮点数和80位浮点数之间的转换指令,从80位浮点数转换为64位浮点数设置一条指令,从64位浮点数转换为80位浮点数设置两条指令。
作为一种可实施方式,以包含MIPS指令集的RISC物理寄存器堆的32个通用浮点寄存器,动态选用任意三个通用寄存器,作为第1~3浮点寄存器82,担任转换工作。在转换工作结束后,这三个通用寄存器又可以与其它通用寄存器没有分别地被使用。
其中 所述第一浮点寄存器,用于存储扩展双精度浮点数据的符号位和阶,占用此寄存器的低16位; 所述第二浮点寄存器,用于存储扩展双精度浮点数据的尾数部分,共64位; 所述第三浮点寄存器,用于存储双精度浮点数据。
当处理器支持X86虚拟机的数据处理过程为对X86浮点格式和浮点栈的支持时,RISC处理器装置支持X86虚拟机的数据处理方法过程,包括以下步骤 步骤210,把内存中的80位扩展双精度浮点数据划分为符号位和阶部分,以及尾数部分,分别存储到不同的第一浮点寄存器和第二浮点寄存器中,通过浮点运算部件4转换为64位双精度浮点数据,并存储到第三浮点寄存器中。
步骤210具体包括下列步骤 步骤211,将内存中的80位扩展双精度浮点数据,分为符号位和阶部分,以及尾数部分。
在一个80位浮点数据的第64位处划分,第80位到第64位为第一部分,共16位,第63位到第0位为第二部分,共64位。划分好后,由用户选择一种现有的读入方式(MIPS提供了有多种读入方式),分别将两部分读入两个浮点寄存器$f(i),$f(j); 步骤212,浮点寄存器$f(i)中存放80位扩展双精度浮点数据的符号位和阶,占用此寄存器的低16位; 步骤213,浮点寄存器$f(j)中存放80位扩展双精度浮点数据的尾数部分,共64位; 步骤214,将浮点寄存器$f(i)和浮点寄存器$f(j)作为源寄存器,将浮点寄存器$f(t)作为目标寄存器,把浮点寄存器$f(i)和浮点寄存器$f(j)中存放的80位扩展双精度浮点数据转换为64位双精度浮点数据。
作为一种可实施方式,所述转换可以通过指令(1)而执行。
CVT.D.LD$f(t),$f(i),$f(j)//*扩展双精度转换为双精度(1) MIPS64指令集的32位指令码的高6位(31bit:26bit)为opcode域。其中SPECIAL2(opcode为011100)指令槽按MIPS的规定是可以由用户自主定义的。本发明实施例利用现有MIPS64指令集中保留的SPECIAL2空槽的值来定义。
式(1)表示把$f(i),$f(j)两个栈寄存器表示的扩展双精度数据转换为双精度数,存入到栈寄存器$f(t)中。
将输出的64位数据存入浮点寄存器$f(t)中,得到64位双精度浮点数据。
步骤220,把第三浮点寄存器中的64位双精度浮点数据提取符号位与阶部分,以及尾数部分,通过浮点运算部件4转换成80位浮点数据的符号位与阶部分,以及80位浮点数据的尾数部分,并分别存储在第一浮点寄存器和第二浮点寄存器中,用2个寄存器一起表示80位的扩展双精度浮点数据,得到80位浮点数据。
步骤220具体包括如下步骤 步骤221,将一64位双精度浮点数据存入浮点寄存器$f(t)中; 步骤222,提取浮点寄存器$f(t)中双精度浮点数据的符号位和阶部分共11位,转换为80位扩展双精度浮点数据的符号位和阶部分共16位,存储到浮点寄存器$f(i)中。
作为一种可实施方式,所述转换可以通过指令(2)而执行。
CVT.UD.D$f(i),$f(t)//*双精度转换为扩展双精度的高位(2) 把浮点寄存器$f(t)表示的双精度数转换为扩展双精度数的高16位存入$f(i)。
将转换后的阶进行0扩展后得到64位浮点数据。因为目标寄存器是64位的,这里其实只需要16位数据就够了,但是为了存入到一个64位的目标寄存器$f(i)中,所以必须对16位以上的48位进行0扩展,存入浮点寄存器$f(i)中; 步骤223,提取浮点寄存器$f(t)的尾数部分53位,转换为80位浮点数据的尾数部分64位,,存储到浮点寄存器$f(j)中。
提取工作在浮点运算部件4中完成,将提取出来的53位数据,转换为80位浮点数据的尾数部分64位。
作为一种可实施方式,所述转换可以通过指令(3)而执行。
CVT.LD.D$f(j),$f(t)//*双精度转换为扩展双精度低位(3) 把浮点寄存器$f(t)表示的双精度数转换为扩展双精度数的低64位存入浮点寄存器$f(j)中。
所述提取、转换可以按照IEEE754标准的相关规定进行,本领域技术人员可以根据指令(2)而实现本发明的转换,因此,在本发明中不再一一详细描述。
将转换后的尾数存入浮点寄存器$f(j)中; 步骤224,将浮点寄存器$f(i)的值作为符号位和阶,浮点寄存器$f(j)的值作为尾数,得到80位的扩展双精度浮点数据。
本发明的浮点数据转换,使得非X86体系结构的处理器能够支持X86中的特殊80位浮点数据类型,从而方便虚拟机进行二进制翻译工作,提高虚拟机效率,增强处理器兼容性。
另外,在X86架构中,部分浮点指令给出的浮点寄存器号是一个相对值,必须和浮点状态字中的浮点循环栈的栈顶指针TOP相加后才是真正的浮点寄存器号。为解决这一问题,本发明在译码器2设置TOP指针寄存器22,在浮点物理寄存器堆中的浮点控制寄存器81中设置维护一个栈使能信号,决定是否选定8个浮点寄存器用于模拟浮点栈,如果栈使能被置位,则在相应的浮点指令运算中,凡是寄存器号小于8的寄存器,在译码时根据TOP的值修改自己的源或目标逻辑寄存器号,并根据指令的内容修改TOP值;然后再发送到处理器;如果栈使能位被清零,则在运算中,认为寄存器模拟栈不存在,按照现有的工作步骤正常进行。
所述浮点控制寄存器81,用于控制利用浮点寄存器堆8使能或禁止模拟浮点寄存器栈83。
其维护一个栈使能位,当使能位置1时,表示处理器将模拟X86处理器的浮点寄存器栈操作;当使能位置0时,表示处理器将不模拟X86处理器的浮点寄存器栈操作,处理器按照正常的过程进行操作处理。
本发明实施例中,利用RISC处理器中编号为0~31的32个现有的浮点寄存器,模拟X86处理器的浮点寄存器栈操作。
所述TOP指针寄存器22,用于维护一个TOP指针,也就是栈操作指针,存储TOP指针的值,这个TOP指针可以被读、写、增1、减1等。
所述指针操作模块41,用于对指针寄存器进行操作,在模拟浮点寄存器栈操作时,模拟指针寄存器的栈操作指针的栈操作,修改并监控栈操作指针的状态。
作为一种可实施方式,如果浮点控制寄存器81中的栈使能位被置位,则选择32个浮点寄存器中的8个寄存器,用于模拟X86处理器的浮点寄存器栈的栈寄存器,序号为0~7。
如果浮点控制寄存器81中的栈使能位被置位1,则在运算中被使用,表示寄存器模拟的浮点寄存器栈存在,那么凡是浮点运算指令中用到的编号小于8的寄存器,都被当作浮点寄存器栈83的栈寄存器使用,从而模拟X86处理器的浮点寄存器栈。
其后指针操作模块使用TOP指针进行栈寄存器号进行转换,即用户所见的浮点寄存器号跟程序使用的浮点寄存器号转换,例如,寄存器号是指距离栈顶第i个单元的寄存器ST(i)加上TOP指针值。如果TOP指针值是2,则ST(0)为第2号寄存器,ST(1)为第3号寄存器。如果溢出也有相应处理,使得这组寄存器形成了一个循环栈,完成了本发明要实现的模拟x86中浮点寄存器栈的功能。然后进行后续工作,后续工作与没有置位栈使能相同; 如果浮点控制寄存器81中的栈使能位被置位0,即被清零,则在运算中,认为寄存器模拟栈不存在,按照现有的工作步骤正常工作。
下面进一步详细说明本发明支持X86虚拟机的RISC处理器的模拟浮点栈操作过程方法,其以RISC处理器的8个浮点寄存器组成浮点寄存器栈83,通过浮点控制寄存器81,并模拟X86的TOP指针功能,即栈指针操作功能,完成模拟浮点寄存器的栈操作。
本发明的支持X86虚拟机的RISC处理器模拟浮点栈操作的方法,包括如下步骤 步骤2100,根据栈使能位,决定是否选定8个浮点寄存器用于模拟浮点寄存器栈中8个栈寄存器,模拟浮点寄存器栈操作,并设置指针寄存器; 所述步骤2100包括下列步骤 步骤2110,在浮点控制寄存器81中选择一位为浮点栈使能位;当使能位置1时,表示将模拟X86处理器的浮点栈,进行浮点栈操作;当使能位置0时,表示不模拟X86处理器的浮点栈,不能进行浮点栈操作,处理器按照正常的过程工作; 步骤2120,设置一个至少3位的指针寄存器,存放TOP指针的值。
该TOP指针的值可以被读、写、增1、减1,TOP指针的范围是0~7。
TOP指针在压栈时压入7号寄存器,TOP指针的值被设置成6;在弹栈时如果TOP指针值为7,则弹栈后TOP指针值设置位0。
因为TOP指针永远指向栈顶寄存器,本栈为自顶向下生长,即压栈时TOP指针值减一,弹出时TOP指针值增一,所以向7号寄存器存入数据时(也就是向7号寄存器压栈),TOP指针值应该减一变为6。当从7号寄存器中弹出数据时,TOP指针值应该加1变为8,但是由于只有0~7号共8个寄存器,所以TOP指针值最大为7,当加一时,TOP指针应该指向下一个寄存器,也就是循环栈中的0号寄存器,此时TOP指针值应该变为0。
例如,如果TOP指针的值为3,当使能位为1时,如果参与运算的浮点寄存器为$f(i)i<=7,则用浮点寄存器$f(j)替换浮点寄存器$f(i)进行运算,其中j=(i+3)mod 8; 如果寄存器$f(i)i>7,则无需改变,直接使用浮点寄存器$f(i)。
步骤2200,在模拟浮点寄存器栈操作时,对指针寄存器进行操作,模拟栈操作指针的栈操作,修改并监控栈操作指针的状态。
所述步骤2200包括下列步骤 步骤2210,设置栈操作模式,浮点栈使能位置1,允许用户模拟浮点寄存器栈进行浮点栈操作; 作为一种可实施方式,设置模拟浮点栈模式,为X86浮点栈模式置位1可以通过下式指令而执行。
其指令格式为SETTM 本发明提供的扩展指令利用MIPS指令集中的SPECIAL2的空槽的保留值来定义扩展指令。
通过指令完成使能位置1操作,为X86浮点栈模式置位,允许用户使用x86浮点栈进行浮点操作。
步骤2220,清除栈操作模式,浮点栈使能位置0,不允许用户模拟浮点寄存器栈进行浮点栈操作; 作为一种可实施方式,本发明实施例清模拟浮点栈模式,X86浮点栈模式置位0的指令格式为CLRTM 其为X86浮点栈模式清位,不允许用户使用x86浮点栈,而只能使用MIPS处理器的浮点寄存器进行浮点操作。
该置位、清零的栈指针操作指令可以分别完成浮点寄存器栈的激活、禁用工作。
步骤2230,栈操作指针值增1,即TOP指针的值增1; 作为一种可实施方式,本发明实施例栈指针值增1,即TOP指针的值增1的指令格式为INCTOP 步骤2240,栈操作指针值减1,即TOP指针的值减1; 作为一种可实施方式,本发明实施例栈指针值减1,即TOP指针的值减1的指令格式为DECTOP 该TOP指针的值增1、减1指令可以分别模拟X86处理器浮点栈中的入栈、出栈工作; 步骤2250,读栈操作指针值,即读出TOP指针的值; 作为一种可实施方式,本发明实施例读出TOP指针值操作的指令格式为MFTOP rd 其指令功能为将X86浮点栈顶指针的值读入寄存器GPR[rd]。
步骤2260,写栈操作指针值,即在指针寄存器中写入当前TOP指针的值。
作为一种可实施方式,本发明实施例完成写TOP指针值操作的指令格式为MTTOP imm 其指令功能为将三位的立即数imm写入x86浮点栈顶指针。
该读、写TOP指针指令可以方便的控制操作浮点栈。
为了能更好地理解本发明的支持X86虚拟机的RISC处理器模拟浮点栈操作的过程,下面以加法运算中栈指针操作为例进行说明。
在使能位是1,TOP指针值为2时,运算add.s$f(6),$f(1),$f(9)在RISC处理器内部进行如下转换 模拟X86浮点栈操作被激活,即使能位置1; 用$f(0)替换$f(6);//6+2mod 8=0 用$f(3)替换$f(1);//1+2mod 8=3 $f(9)无需转换;//9>7所以无需变换,直接使用寄存器$f(9) 最终实际进行运算的表达式为add.s$f(0),$f(3),$f(9) 而此时没有入栈和出栈操作,所以TOP值不会发生变化。
同时,由于浮点栈的存在,就需要维护一个浮点栈溢出检查机制,实时监控浮点栈的状态,防止浮点栈溢出例外的蔓延。
本发明实施例中,本发明的RISC处理器,所述浮点寄存器栈83由8个可直接进行浮点运算的栈寄存器组成,按照顺序进行编号,分别为0~7; 本发明实施例的RISC处理器,所述溢出检查寄存器72,用于实现与X86的浮点标志寄存器中的TAG的功能,检测对浮点寄存器栈83中的栈寄存器进行浮点访问时会不会发生栈溢出例外,其为一至少8位的多位寄存器,表示TAG位,即溢出检查功能位,分别表示浮点寄存器栈83的栈寄存器0~7号的状态。
在本发明实施例中,选择一个通用寄存器r(i),其低8位由低到高分别表示浮点寄存器栈83的栈寄存器0~7号的状态。
通用寄存器r(i)的低8位中,每位对应一个浮点寄存器栈83中的栈寄存器,每位的值代表不同状态,其中,0表示空,可压栈,不可出栈,否则会溢出;1表示有效,不可再压栈,否则会溢出。
作为一种可实施方式,本发明的RISC处理器中,包括一个由0~31,共32个的多位浮点寄存器组成的浮点寄存器栈83,其中0~7号,共8个栈寄存器,模拟X86的浮点寄存器栈83的8个栈寄存器;在RISC处理器中,还包括一个32位的通用寄存器(定点)r(i),其低8位由低到高分别表示浮点寄存器栈83的栈寄存器0~7号的状态,完成X86浮点栈机制中的TAG功能。
所述栈溢出判断模块43,用于检查指定的浮点寄存器栈83中的栈寄存器,并根据栈寄存器的值对溢出检查寄存器72进行操作,进行浮点栈溢出检查。
下面进一步详细说明本发明的支持X86虚拟机的RISC处理器上进行浮点栈溢出检查的方法过程,其以RISC处理器的8个栈寄存器组成浮点寄存器栈83;以一通用寄存器为溢出检查寄存器72,其低8位模拟X86的TAG功能,每位对应一个栈寄存器的不同状态。
支持X86虚拟机的RISC处理器上进行浮点栈溢出检查的方法过程,包括如下步骤 步骤21000,检查指定的浮点寄存器栈中的栈寄存器,并根据栈寄存器的值对溢出检查寄存器72进行操作,进行浮点栈溢出检查; 所述步骤21000包括下列步骤 步骤21100,判断浮点寄存器栈中被指定的栈寄存器是否为空,如果为空,则将指定的溢出检查寄存器72的TAG位的相应位置1,并继续执行;否则,引发浮点栈溢出例外; 步骤21200,判断浮点寄存器栈中被指定的栈寄存器是否有效,如果有效,则将指定的溢出检查寄存器72的TAG位的相应位置0,并继续执行;否则,引发浮点栈溢出例外; 步骤21300,判断浮点寄存器栈中被指定的两个栈寄存器是否都有效,如果都有效,并且栈寄存器中的数据不需要出栈,则将指定的溢出检查寄存器72的TAG位的值保持,并继续执行;否则,引发浮点栈溢出例外; 步骤21400,判断浮点寄存器栈中被指定的两个栈寄存器是否有效,如果都有效,并且有一个栈寄存器中的数据需要出栈,则将数据出栈的栈寄存器对应的溢出检查寄存器72的TAG位所对应的位置0,然后继续执行;否则,引发浮点栈溢出例外; 步骤21500,判断浮点寄存器栈中被指定的两个栈寄存器是否有效,如果都有效,并且栈寄存器中的数据都需要出栈,则将对应的溢出检查寄存器72的TAG位所对应的两位都置0,然后继续执行;否则,引发浮点栈溢出例外。
下面以对浮点寄存器入栈的操作为例,进一步详细说明RISC处理器上进行浮点栈溢出检查的方法。
首先RISC处理器确定浮点寄存器栈的栈顶,并读取该栈顶的栈寄存器对应的溢出检查寄存器72的TAG位; RISC处理器根据本发明的浮点寄存器栈,判断确定浮点寄存器栈的栈顶,并确定对应的本发明的栈顶的栈寄存器对应的溢出检查寄存器72的TAG位,是一种现有技术,其不是本发明的发明创造,本领域技术人员根据本发明实施例的描述,可以实现上述操作,因此,在本发明中不再一一详细描述说明。
判断栈顶的栈寄存器对应的溢出检查寄存器72的相应TAG位是否为0; 如果是,则将栈顶的栈寄存器对应的溢出检查寄存器72的相应TAG位置1,并将数据写入该栈寄存器,并结束返回; 如果否,则引发栈溢出例外。
作为一种可实施的方式,本发明实施例中,选择通用寄存器r(3)作为溢出检查寄存器r(3)的低8位,也就是bit r(3)_0~bit r(3)_7分别对应浮点寄存器栈中的栈寄存器f(0)~f(7)的状态。
1)如果遇到入栈操作,并且栈顶在栈寄存器f(5); 则判断溢出检查寄存器r(3)的第5位,也就是bit r(3)_4是否为0; 如果为0,则先将溢出检查寄存器的bit r(3)_4置1,然后将数据入栈,存入栈寄存器f(5); 如果为1,则引发栈溢出例外。
2)如果出栈操作,并且栈顶在栈寄存器f(5), 则判断溢出检查寄存器r(3)的第5位,也就是bit r(3)_4是否为1; 如果为1,则先将溢出检查寄存器的bit r(3)_4清零,然后将数据出栈,存入指定的浮点寄存器; 如果为0,则引发栈溢出例外。
3)如果是运算操作,并且两个源操作数分别在栈寄存器f(4)和f(5)中, 则判断溢出检查寄存器r(3)的第4位,也就是bit r(3)_3是否为1; 如果为0,则引发栈溢出例外; 如果为1,则继续下面的步骤 则判断溢出检查寄存器r(3)的第5位,也就是bit r(3)_4是否为1; 如果为1,则继续运算操作; 如果为0,则引发栈溢出例外。
4)如果是运算并出栈操作,并且两个源操作数分别在栈寄存器f(4)和f(5)中; 如果栈顶在栈寄存器f(5),则判断溢出检查寄存器r(3)的第5位,也就是bit r(3)_4是否为1; 如果为0,则引发栈溢出例外; 如果为1,则继续下面的步骤 判断溢出检查寄存器r(3)的第4位,也就是bit r(3)_3是否为1; 如果为0,则引发栈溢出例外; 如果为1,则继续下面的步骤 先将溢出检查寄存器的第5位,也就是bit r(3)_4清零,然后继续运算操作; 5)如果是运算并连续出栈操作,并且两个源操作数分别在栈寄存器f(4)和f(5)中; 则判断溢出检查寄存器r(3)的第4位,也就是bit r(3)_3是否为1; 如果为0,则引发栈溢出例外; 如果为1,则将溢出检查寄存器的第4位,也就是bit r(3)_3清零,然后继续下面的步骤 判断溢出检查寄存器r(3)的第5位,也就是bit r(3)_4是否为1; 如果为1,则将溢出检查寄存器的第5位,也就是bit r(3)_4清零,然后继续运算操作; 如果为0,则引发栈溢出例外。
下面详细描述当处理器支持X86虚拟机的数据处理过程为对X86存储结构的支持时,本发明RISC处理器的数据处理过程。
由于X86处理器中段寄存器的存在,即使在用户态下,X86的存储访问寻址和保护方式也比较特殊。因此,本发明提供支持带判断访存地址是否越界的存取操作,即load和store操作的源寄存器中,有一个bound寄存器既不用来计算地址,也不用来存放数据,而是用来对访问地址进行比较,如果发现访问地址越出该bound寄存器规定的边界,就报地址越界例外。
地址界限分为上界或者下界,访存的有效地址要保证不能大于上界或者不能小于下界。这些指令如果访存地址满足条件则正常访存,否则引发地址错例外。
在RISC处理器上支持虚拟机,当进行从X86指令集到RISC处理器MIPS指令集的翻译过程中出现访存操作时,增加了对访存地址的判断,判断访存地址是否越界,进而对X86访存操作的翻译提高速度。
作为一种可实施方式,本发明实施例所述物理寄存器堆的上界地址寄存器,用于存储作为上界的有效地址;以及下界地址寄存器,用于存储作为下界的有效地址。
所述上界、下界地址寄存器可以是物理寄存器中任一通用寄存器。
所述上下界判断模块,用于在访存指令中,根据上界地址寄存器中存储的上界地址和/或下界地址寄存器中存储的下界地址,判断指令操作数地址的有效性。
在MIPS指令集中的每条访存指令,如load指令或者store指令中,增加界限的判断,这些指令如果访存地址满足条件则正常访存,否则引发MIPS中的地址错例外。
指令译码后,寄存器中的地址界限作为指令的一个寄存器操作数,当操作内容数据根据base方式形成有效地址后,该有效地址首先跟寄存器中的地址界限比较,如果符合指令的语义条件,即如果寄存器为上界地址寄存器,该有效地址小于或者等于寄存器中的地址界限,或者如果寄存器为下界地址寄存器,该有效地址大于或者等于寄存器中的地址界限,那么完成正常的该存操作;否则引发地址错例外。
本发明实施例中,作为一种可实施方式,对MIPS指令集中的共24条访存指令,包括load指令和store指令,增加界限判断。
其中 12条load指令,包含8条定点指令,4条浮点指令,寻址方式都是base方式。
这些指令分别为带上边界条件的取字节、带下边界条件的取字节、带上边界条件的取半字、带下边界条件的取半字、带上边界条件的取字、带下边界条件的取字、带上边界条件的取双字、带下边界条件的取双字、带上边界条件的取单精度浮点数、带下边界条件的取单精度浮点数、带上边界条件的取双精度浮点数、带下边界条件的取双精度浮点数指令中的一种或者一种以上组合。
指令的详细描述如下 gsLBLE rt,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则根据这个有效地址从内存中取出8位字节数据,将这个数据进行符号位扩展后存到GPR[rt]。
gsLBGT rt,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则根据这个有效地址从内存中取出8位字节数据,将这个数据进行符号位扩展后存到GPR[rt]。
gsLHLE rt,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则根据这个对齐的有效地址从内存中取出16位半字数据,将这个数据进行符号位扩展后存到GPR[rt]。
较佳地,所述有效地址是对齐的,如果低1位地址中任何一位非零,则发生地址错例外。
gsLHGT rt,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则根据这个有效地址从内存中取出16位半字数据,将这个数据进行符号位扩展后存到GPR[rt]。
较佳地,所述有效地址是对齐的,如果低1位地址中任何一位非零,则发生地址错例外。
gsLWLE rt,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则根据这个对齐的有效地址从内存中取出32位字数据,将这个数据进行符号位扩展后存到GPR[rt]。
较佳地,所述有效地址是对齐的,如果低2位地址中任何一位非零,则发生地址错例外。
gsLWGT rt,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则根据这个对齐的有效地址从内存中取出32位字数据,将这个数据进行符号位扩展后存到GPR[rt]。
较佳地,所述有效地址是对齐的,如果低2位地址中任何一位非零,则发生地址错例外。
gsLDLE rt,base,bound 先从GPR[base]的内容得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外否则根据这个对齐的有效地址从内存中取出64位双字到GPR[rt]。
较佳地,所述有效地址是对齐的,如果低3位地址中任何一位非零,则发生地址错例外。
gsLDGT rt,base,bound 先从GPR[base]的内容得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外否则根据这个对齐的有效地址从内存中取出64位双字到GPR[rt]。
较佳地,所述有效地址是对齐的,如果低3位地址中任何一位非零,则发生地址错例外。
gsLWLEC1 ft,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则根据这个对齐的有效地址从内存中取出32位数据存到FPR[ft]的低32位。
较佳地,所述有效地址是对齐的,如果低2位地址中任何一位非零,则发生地址错例外。
gsLWGTC1 ft,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则根据这个对齐的有效地址从内存中取出32位数据存到FPR[ft]的低32位。
较佳地,所述有效地址是对齐的,如果低2位地址中任何一位非零,则发生地址错例外。
gsLDLEC1 ft,base,bound 先从GPR[base]的内容得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外否则根据这个对齐的有效地址从内存中取出64位数据存到FPR[ft]。
较佳地,所述有效地址是对齐的,如果低3位地址中任何一位非零,则发生地址错例外。
gsLDGTC1 ft,base,bound 先从GPR[base]的内容得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外否则根据这个对齐的有效地址从内存中取出64位数据存到FPR[ft]。
较佳地,所述有效地址是对齐的,如果低3位地址中任何一位非零,则发生地址错例外。
本发明实施例利用现有MIPS64指令集中保留的LWC2和SWC2空槽的值来定义。由于MIPS64指令集的32位指令码的高6位(31bit:26bit)为opcode域。LWC2(opcode为110010)和SWC2(opcode为111010)指令槽按MIPS的规定是可以由用户自主定义的。
12条store指令,包含8条定点指令,4条浮点指令,寻址方式都是base方式。
这些指令分别为带上边界条件的存字节、带下边界条件的存字节、带上边界条件的存半字、带下边界条件的存半字、带上边界条件的存字、带下边界条件的存字、带上边界条件的存双字、带下边界条件的存双字、带上边界条件的存单精度浮点数、带下边界条件的存单精度浮点数、带上边界条件的存双精度浮点数、带下边界条件的存双精度浮点数指令中的一种或者一种以上组合。
指令的详细描述如下 gsSBLE rt,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则将GPR[rt]中的8位字节数据内容保存到内存中这个有效地址。
gsSBGT rt,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则将GPR[rt]中的8位字节数据内容保存到内存中这个有效地址。
gsSHLE rt,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则将GPR[rt]中的16位半字数据内容保存到内存中这个对齐的有效地址。
较佳地,所述有效地址是对齐的,如果低1位地址中任何一位非零,则发生地址错例外。
gsSHGT rt,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则将GPR[rt]中的16位半字数据内容保存到内存中这个对齐的有效地址。
较佳地,所述有效地址是对齐的,如果低1位地址中任何一位非零,则发生地址错例外。
gsSWLE rt,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则将GPR[rt]中的32位字数据内容保存到内存中这个对齐的有效地址。
较佳地,所述有效地址是对齐的,如果低2位地址中任何一位非零,则发生地址错例外。
gsSWGT rt,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则将GPR[rt]中的32位字数据内容保存到内存中这个对齐的有效地址。
较佳地,所述有效地址是对齐的,如果低2位地址中任何一位非零,则发生地址错例外。
gsSDLE rt,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则将GPR[rt]中的64位双字内容保存到内存中这个对齐的有效地址。
较佳地,所述有效地址是对齐的,如果低3位地址中任何一位非零,则发生地址错例外。
gsSDGT rt,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则将GPR[rt]中的64位双字内容保存到内存中这个对齐的有效地址。
较佳地,所述有效地址是对齐的,如果低3位地址中任何一位非零,则发生地址错例外。
gsSWLEC1 ft,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则将FPR[ft]中的低32位字数据内容保存到内存中这个对齐的有效地址。
较佳地,所述有效地址是对齐的,如果低2位地址中任何一位非零,则发生地址错例外。
gsSWGTC1 ft,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则将FPR[ft]中的低32位字数据内容保存到内存中这个对齐的有效地址。
较佳地,所述有效地址是对齐的,如果低2位地址中任何一位非零,则发生地址错例外。
gsSDLEC1 ft,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则将FPR[ft]中的64位双字内容保存到内存中这个对齐的有效地址。
较佳地,所述有效地址是对齐的,如果低3位地址中任何一位非零,则发生地址错例外。
gsSDGTC1 ft,base,bound 先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则将FPR[ft]中的64位双字内容保存到内存中这个对齐的有效地址。
较佳地,所述有效地址是对齐的,如果低3位地址中任何一位非零,则发生地址错例外。
在同时判断上下界的指令中,地址要同时满足上界条件和下界条件,一旦有一个边界不满足就会发出越界例外。
所述上下界判断模块,用于在访存指令中,根据上界地址寄存器中存储的上界地址和/或下界地址寄存器中存储的下界地址,判断指令地址的有效性。
作为一种可实施方式,在RISC处理器MIPS指令集中增加两条指令,用于进行寄存器值的比较,这两条指令用于地址是否越界的判断,如果地址满足条件则空操作,否则引发RISC处理器中的地址错例外。
另外,实现两条指令gsLE rs,rt和gsGT rs,rt。
指令的详细描述如下 gsLE rs,rt 比较寄存器中的值,置条件地址错例外。
比较通用寄存器GPR[rs]和通用寄存器GPR[rt]中的值,如果GPR[rs]中的值小于等于GPR[rt]中的值,则顺序执行下一条指令;否则引发adel例外。
gsGT rs,rt 比较寄存器中的值,置条件地址错例外。
比较通用寄存器GPR[rs]和通用寄存器GPR[rt]中的值,如果GPR[rs]中的值大于GPR[rt]中的值,则顺序执行下一条指令;否则引发adel例外。
这两条指令用于地址比较,rs寄存器中存放地址界限值,rt寄存器存放待比较的有效地址,如果满足条件则顺序执行下一条指令,否则引发地址错例外。
这两条指令分别比较通用寄存器GPR[rs]和通用寄存器GPR[rt]中的值,如果GPR[rs]中的值小于等于或者大于GPR[rt]中的值,其中,小于等于是对于gsLE rs,rt而言的;大于是对于gsGT rs,rt而言的,则顺序执行下一条指令;否则引发地址错例外。
本发明支持X86虚拟机的RISC处理器的有界访存过程,包括如下步骤 步骤31,在RISC处理器的X86虚拟机中,设置物理寄存器堆中两个通用寄存器分别为上界、下界地址寄存器74。
其中,上界地址寄存器存储作为上界的有效地址;下界地址寄存器存储作为下界的有效地址。
步骤32,在进行X86虚拟机指令集到MIPS指令集翻译时,译码器将指令进行译码,得到可被RISC处理器处理的二进制代码。
步骤33,定点运算部件3在译码后的访存指令中,根据上界地址寄存器中存储的上界地址和/或下界地址寄存器中存储的下界地址,判断指令操作数地址的有效性。
在MIPS指令集中的每条访存指令,如load指令或者store指令中,增加界限的判断,这些指令如果访存地址满足条件则正常访存,否则引发MIPS中的地址错例外。
所述步骤33包括下列步骤 步骤331,指令译码后,寄存器中的地址界限作为指令的一个寄存操作数,操作内容数据根据base方式形成有效地址; 步骤332,该有效地址首先跟寄存器中的地址界限比较; 步骤333,如果符合指令的语义条件,即如果寄存器为上界地址寄存器,该有效地址小于或者等于寄存器中的地址界限;或者如果寄存器为下界地址寄存器,该有效地址大于或者等于寄存器中的地址界限,那么完成正常的该存操作;否则引发地址错例外。
具体地,所述步骤333,对于取操作数(load)指令操作,则 如果为带上边界条件的取字节指令,则先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则根据这个有效地址从内存中取出8位字节数据,将这个数据进行符号位扩展后存到GPR[rt],即gsLBLE rt,base,bound。
如果为带下边界条件的取字节指令,则先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则根据这个有效地址从内存中取出8位字节数据,将这个数据进行符号位扩展后存到GPR[rt],即gsLBGT rt,base,bound。
如果为带上边界条件的取半字指令,则先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则根据这个对齐的有效地址从内存中取出16位半字数据,将这个数据进行符号位扩展后存到GPR[rt],即gsLHLE rt,base,bound。
较佳地,所述有效地址是对齐的,如果低1位地址中任何一位非零,则发生地址错例外。
如果为带下边界条件的取半字,则先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则根据这个有效地址从内存中取出16位半字数据,将这个数据进行符号位扩展后存到GPR[rt],即gsLHGT rt,base,bound。
较佳地,所述有效地址是对齐的,如果低1位地址中任何一位非零,则发生地址错例外。
如果为带上边界条件的取字指令,则先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则根据这个对齐的有效地址从内存中取出32位字数据,将这个数据进行符号位扩展后存到GPR[rt],即gsLWLE rt,base,bound。
较佳地,所述有效地址是对齐的,如果低2位地址中任何一位非零,则发生地址错例外。
如果为带下边界条件的取字指令,则先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则根据这个对齐的有效地址从内存中取出32位字数据,将这个数据进行符号位扩展后存到GPR[rt],即gsLWGT rt,base,bound。
较佳地,有效地址是对齐的,如果低2位地址中任何一位非零,则发生地址错例外。
如果为带上边界条件的取双字指令,则先从GPR[base]的内容得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外否则根据这个对齐的有效地址从内存中取出64位双字到GPR[rt],即gsLDLErt,base,bound。
较佳地,所述有效地址是对齐的,如果低3位地址中任何一位非零,则发生地址错例外。
如果为带下边界条件的取双字指令,则先从GPR[base]的内容得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外否则根据这个对齐的有效地址从内存中取出64位双字到GPR[rt],即gsLDGT rt,base,bound。
较佳地,所述有效地址是对齐的,如果低3位地址中任何一位非零,则发生地址错例外。
如果为带上边界条件的取单精度浮点数,则先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则根据这个对齐的有效地址从内存中取出32位数据存到FPR[ft]的低32位,即gsLWLEC1 ft,base,bound。
较佳地,所述有效地址是对齐的,如果低2位地址中任何一位非零,则发生地址错例外。
如果为带下边界条件的取单精度浮点数,则先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则根据这个对齐的有效地址从内存中取出32位数据存到FPR[ft]的低32位,即gsLWGTC1 ft,base,bound。
较佳地,所述有效地址是对齐的,如果低2位地址中任何一位非零,则发生地址错例外。
如果为带上边界条件的取双精度浮点数,则先从GPR[base]的内容得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外否则根据这个对齐的有效地址从内存中取出64位数据存到FPR[ft],即gsLDLEC1 ft,base,bound。
较佳地,所述有效地址是对齐的,如果低3位地址中任何一位非零,则发生地址错例外。
如果为带下边界条件的取双精度浮点数,则先从GPR[base]的内容得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外否则根据这个对齐的有效地址从内存中取出64位数据存到FPR[ft],即gsLDGTC1 ft,base,bound。
较佳地,所述有效地址是对齐的,如果低3位地址中任何一位非零,则发生地址错例外。
所述步骤S330,对于存操作数(store)指令操作,则 如果为带上边界条件的存字节指令,则先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则将GPR[rt]中的8位字节数据内容保存到内存中这个有效地址,即gsSBLErt,base,bound。
如果为带下边界条件的存字节指令,则先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则将GPR[rt]中的8位字节数据内容保存到内存中这个有效地址,即gsSBGT rt,base,bound。
如果为带上边界条件的存半字指令,则先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地吃错例外;否则将GPR[rt]中的16位半字数据内容保存到内存中这个对齐的有效地址,即gsSHLE rt,base,bound。
较佳地,所述有效地址是对齐的,如果低1位地址中任何一位非零,则发生地址错例外。
如果为带下边界条件的存半字指令,则先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则将GPR[rt]中的16位半字数据内容保存到内存中这个对齐的有效地址,即gsSHGT rt,base,bound。
较佳地,所述有效地址是对齐的,如果低1位地址中任何一位非零,则发生地址错例外。
如果为带上边界条件的存字指令,则先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则将GPR[rt]中的32位字数据内容保存到内存中这个对齐的有效地址,即gsSWLE rt,base,bound。
较佳地,所述有效地址是对齐的,如果低2位地址中任何一位非零,则发生地址错例外。
如果为带下边界条件的存字指令,则先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则将GPR[rt]中的32位字数据内容保存到内存中这个对齐的有效地址,即gsSWGTrt,base,bound。
较佳地,所述有效地址是对齐的,如果低2位地址中任何一位非零,则发生地址错例外。
如果为带上边界条件的存双字指令,则先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则将GPR[rt]中的64位双字内容保存到内存中这个对齐的有效地址,即gsSDLE rt,base,bound。
较佳地,所述有效地址是对齐的,如果低3位地址中任何一位非零,则发生地址错例外。
如果为带下边界条件的存双字指令,则先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则将GPR[rt]中的64位双字内容保存到内存中这个对齐的有效地址。即gsSDGTrt,base,bound。
较佳地,所述有效地址是对齐的,如果低3位地址中任何一位非零,则发生地址错例外。
如果为带上边界条件的存单精度浮点数,则先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则将FPR[ft]中的低32位字数据内容保存到内存中这个对齐的有效地址,即gsSWLEC1 ft,base,bound。
较佳地,所述有效地址是对齐的,如果低2位地址中任何一位非零,则发生地址错例外。
如果为带下边界条件的存单精度浮点数,则先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则将FPR[ft]中的低32位字数据内容保存到内存中这个对齐的有效地址,即gsSWGTC1 ft,base,bound。
较佳地,所述有效地址是对齐的,如果低2位地址中任何一位非零,则发生地址错例外。
如果为带上边界条件的存双精度浮点数,则先从GPR[base]的内容中得到有效地址,如果有效地址不小于等于GPR[bound]中的内容,则发出地址错例外;否则将FPR[ft]中的64位双字内容保存到内存中这个对齐的有效地址,即gsSDLEC1 ft,base,bound。
较佳地,所述有效地址是对齐的,如果低3位地址中任何一位非零,则发生地址错例外。
如果为带下边界条件的存双精度浮点数,则先从GPR[base]的内容中得到有效地址,如果有效地址不大于GPR[bound]中的内容,则发出地址错例外;否则将FPR[ft]中的64位双字内容保存到内存中这个对齐的有效地址,即gsSDGTC1 ft,base,bound。
较佳地,所述有效地址是对齐的,如果低3位地址中任何一位非零,则发生地址错例外。
所述步骤33还包括下列步骤 步骤334,在同时判断上下界的指令中,地址要同时满足上界条件和下界条件,一旦有一个边界不满足就发出越界例外。
更佳地,所述步骤S300之后还包括下列步骤 步骤34,在访存指令中,根据上界地址寄存器中存储的上界地址和/或下界地址寄存器中存储的下界地址,判断指令地址的有效性。
所述步骤34包括下列步骤 步骤341,在取操作数(load)指令中,比较通用寄存器GPR[rs],即上界地址寄存器和通用寄存器GPR[rt],即下界地址寄存器中的值,如果GPR[rs]中的值小于等于GPR[rt]中的值,则顺序执行下一条指令;否则引发adel例外,即gsLE rs,rt。
步骤342,在写操作数(store)指令中,比较通用寄存器GPR[rs],即上界地址寄存器和通用寄存器GPR[rt],即下界地址寄存器中的值,如果GPR[rs]中的值大于GPR[rt]中的值,则顺序执行下一条指令;否则引发adel例外,即gsGT rs,rt。
本发明RISC处理器的有界访存方法,在RISC处理器支持的虚拟机中,从X86虚拟机指令翻译到MIPS指令集的二进制代码,在RISC处理器上运行时,提高运行的速度,而将对虚拟机运行的速度影响降低,提高虚拟机的运行效率。
下面详细描述当处理器支持X86虚拟机的数据处理过程为对虚拟机制的支持时,RISC处理器装置支持X86虚拟机的数据处理方法过程。
除了X86指令和RISC处理器指令之间的功能差别外,虚拟机系统本身的开销也会引起虚拟机性能的降低,因此,需要对虚拟机的实现机制本身提供必要的支持,主要包括以下三个方面 N1)虚拟机代码和翻译后的MIPS代码切换的支持 在虚拟机的设计中,X86通用寄存器已经映射到固定的MIPS寄存器,但是在虚拟机的代码和翻译后的MIPS代码两种上下文切换时,需要保存或者恢复这些固定的MIPS寄存器的值,以保证这些寄存器在两种上下文中都可以自由的使用,而不互相干扰。
本发明提供数据宽度是原有数据宽度2倍的访存扩展指令,加快虚拟机上下文切换的同时也可以用于提高性能。
本发明的支持X86虚拟机的RISC处理器模式识别模块24,包括对多倍数据宽度进行访存指令。所述多倍数据宽度访存指令包括对多倍数据宽度的读取内存、写入内存、以及对浮点寄存器的多倍数据宽度的读取内存、写入内存共四类多倍数据宽度访存扩展指令。
作为一种可实施方式,本发明一共提出了四条多倍数据宽度的访存扩展指令,包括双倍数据宽度的读取内存、写入内存指令,以及对浮点寄存器的双倍数据宽度的读取内存、写入内存指令。
作为一种可实施方式,本发明提供的多倍数据宽度扩展指令利用现有MIPS64指令集中保留的LWC2和SWC2空槽的值,其中32位指令的高6位(31bit:26bit)为opcode域。其中LWC2(opcode为110010)和SWC2(opcode为111010)指令槽都是MIPS规定的可以由用户自主定义的。其访存的寻址方式是base+8bits offset的寻址方式。
其中,5位的base域表示基址,5位的rt(Register Target(Source/Destination))域表示源/目标寄存器,offset表示偏移地址,最后6位的func域用于区分各条扩展指令。
本发明的四条扩展指令是MIPS64指令集中给用户扩展的自定义指令。
对于存数指令SQ,译码器输出一个内部的sq操作; 对于取数指令LQ,译码器输出两个相邻的内部操作lq1和lq2,其中lq1带有LQ指令的低64位逻辑寄存器号,lq2带有LQ指令的高64位逻辑寄存器号。
译码器2对指令进行译码后送到访存执行单元5的发射队列(未示出),发射队列从中选取操作数准备好的操作,发射到访存执行单元5的访存部件(未示出)。
对于读取内存的四个字的共128位取数指令操作,所述访存执行单元5的合并单元,把两个内部操作在进入发射队列时进行合并。合并的方法是如果发现相邻的将要进入队列的两个操作是四个字的128位取数指令译码而成,则后一个操作不进入发射队列,而将其目的物理寄存器号存入前一操作的高64位目的物理寄存器号。
合并后的取数操作有两个目的物理寄存器号,在地址确定(对应源物理寄存器准备好)时会发射到访存执行单元5的访存部件执行。
访存执行单元5是执行存取数据的部件,其根据指令从内存中取出数据或者把数据存放到内存中。这个过程是现有的标准技术,对本领域技术人员是显而易见的,因此,本发明实施例中不再一一详细描述。
下面对双倍数据宽度的读取内存、写入内存指令,以及对浮点寄存器的双倍数据宽度的读取内存、写入内存指令共四条指令进行说明 gsLQ rt,offset(base)/读取四字数据到内存 从内存中取四字存入到寄存器中,先将带符号的8位offset和GPR[base]的内容相加得到有效地址,再根据这个对齐的有效地址从内存中取出128位四字,存放到相邻的2个通用寄存器中。
如果rt为偶数,则存放到寄存器rt和rt+1中;如果rt为奇数,则存放到寄存器rt-1和rt中。
有效地址是对齐的,如果低4位地址中任何一位非零,则发生地址错例外。
gsLQC1 ft,offset(base)/四字数据写入内存 先将带符号的8位offset和GPR[base]的内容相加得到有效地址,再根据这个对齐的有效地址从内存中取出128位四字,存放到相邻的2个浮点寄存器中。
如果ft为偶数,则存放到寄存器ft和ft+1中;如果ft为奇数,则存放到寄存器ft-1和ft中。
有效地址是对齐的,如果低4位地址中任何一位非零,则发生地址错例外。
gsSQ rt,offset(base)/存四字数据到内存 先将带符号的8位offset和GPR[base]的内容相加得到有效地址,然后将相邻2个通用寄存器中的四字存放到内存中的有效地址中。
如果rt为偶数,则取出寄存器rt和rt+1中的值存放到内存;如果rt为奇数,则取出寄存器rt-1和rt中的值存放到内存。
有效地址是对齐的,如果低4位地址中任何一位非零,则发生地址错例外。
gsSQC1 ft,offset(base)/从浮点寄存器存四字到内存 先将带符号的8位offset和GPR[base]的内容相加得到有效地址,然后将相邻2个浮点寄存器中的四字存放到内存中的有效地址中。如果ft为偶数,则取出寄存器ft和ft+1中的值存放到内存;如果ft为奇数,则取出寄存器ft-1和ft中的值存放到内存。
有效地址必须是对齐的,如果低4位地址中任何一位非零,则发生地址错例外。
为本发明支持X86虚拟机的RISC处理器的数据访存方法,其包括下列步骤 步骤N110,处理器首先取出一条指令输入到译码器; 步骤N120,译码器判断指令类型,识别并译码多倍数据宽度指令; 如果是现有的MIPS指令集中的指令,译码器就将其译为内部操作,比如给出相应的OP,源寄存器和目标寄存器等; 如果输入的指令是本发明提出的多倍访存扩展指令操作,译码器将源/或目标寄存器由一个自动扩展成两个成对的寄存器; 如果rt为偶数,则存放到寄存器rt和rt+1中;如果rt为奇数,则存放到寄存器rt-1和rt中。
如果输入指令是多倍数据宽度的读取指令时,译码器将目标寄存器由一个自动扩展成多个相邻的寄存器,并将读取操作分配到多个内部操作里,多个成对的寄存器分别为这多个内部操作的目标寄存器。
如果输入指令是多倍数据宽度的存储指令时,译码器将源寄存器由一个扩展成多个相邻的寄存器。
处理器首先取出一条指令输入到译码器,译码器判断指令类型,如果是原有MIPS指令集中的指令,译码器就将其译为内部操作,例如给出相应的操作(OP),源寄存器械和目标寄存器等,输出到存储运算部件执行;如果输入的指令是本发明提出的访存扩展指令中的存储操作,译码器将源/或目标寄存器由一个自动扩展成两个成对的寄存器,然后输出到存储运算部件执行。
处理器首先取出一条指令输入到译码器,译码器判断指令类型,并转换成内部操作。内部操作的编码对处理器的功能部件而言比指令更规整,有利于简化内部逻辑。RISC处理器中,通常外部的指令到内部操作是一一映射。译码器输出的内部操作由若干个域组成,如操作码(op)、扩展操作码(fmt)、源寄存器号、目的寄存器号、立即数等。
步骤N130,将译码后的多倍数据宽度指令发送到访存执行单元5执行操作。
译码器对输入指令译码后,发送到访存执行单元5,在访存执行单元5中,如果是读取操作指令,则读取操作指令LQ的2个内部操作lq1,lq2合并成一个操作,送到访存执行单元5的访存部件执行。
如果输入的指令是本发明提出的访存扩展指令中的四个字共128位的存数指令SQ,译码器3将源寄存器号由一个扩展成两个成对的寄存器号。比如4号寄存器扩展成4、5两个寄存器号;7号寄存器扩展成6、7两个。作为内部操作的两个源寄存器号送到访存执行单元5的发射队列。
如果输入的指令是本发明提出的访存扩展指令中的读取操作,译码器将该读取操作译码为两条内部操作,同样将目标寄存器由一个自动扩展为两个成对的寄存器,然后分配到上述两个内部操作里,输出到访存执行单元5执行,然后将其合并成一个操作送到访存执行单元5的访存部件中执行。
也就是说,如果输入的指令是本发明提出的访存扩展指令中的四个字共128位的存数指令LQ,译码器将目标寄存器号由一个扩展成两个成对的寄存器号。并且拆成两个相邻的内部操作lq1、lq2,分别带上这两个目标寄存器号,送入访存执行单元5的发射队列。访存执行单元5接收来自译码器的内部操作,选择其中源物理寄存器准备好的那些发射到访存执行单元5的访存部件。LQ指令作为一个访存操作发射到访存部件,因此由访存执行单元5的合并模块完成两个内部操作的合并。方法是把lq2的目的物理寄存器存入lq1操作的高64位目的物理寄存器中,lq2本身并不进入发射队列。访存部件执行访存操作,对于lq1,在结果中有两个值域,分别写入对应的物理寄存器。
N2)区分翻译后的代码是否处于X86模式下 在RISC处理器上支持X86虚拟机,对于一条指令来说需要区分其是处于原有的指令集模式下还是处于X86模式下。例如,以MIPS指令集为例,对于架法指令来说,MIPS指令集中对加法的处理是进行两个数的相加操作,但是对于X86指令集来说,加法指令不仅要计算两个操作数相加,还要依据加法的结果修改相应的EFLAG中的标志位。
本发明针对上述问题,提供方法用于区分一条RISC指令是否运行于X86虚拟机模式下。
根据不同指令的使用频度,本发明提供三种区分方式 (1)控制位标志执行方法本发明在RISC处理器中设置专门的控制位x86mode标志,当该位为1时表示此时刻相应的指令运行在x86模式下;当该标志为0时表示指令运行在非X86模式下。
(2)前缀指令执行方法本发明增加设置一条前缀指令SETFLAG,表示其后的指令处于X86模式下。根据前缀指令影响范围的不同,又分为两种方式,一种是前缀指令只影响其后一条指令,一种是前缀指令影响其后若干条指令。
(3)专用指令方法本发明对于指令频度特别高的X86指令,则需要在指令集中设置专门的指令来进行一对一的对应,以提高效率。所述设置的指令又可以归为两大类一种对X86指令集中与EFLAG标志相关的指令一一对应的指令,另一种是对X86指令集中的特殊结构进行操作的指令,如浮点栈操作的指令进行对应的指令,新增加设置的指令提供专门的指令对X86指令进行部分的支持,以减少相应的开销。
本发明的支持X86虚拟机的RISC处理器装置的模式识别模块24,用于区分指令的虚拟机指令集模式。
本发明的RISC处理器装置中,译码器除了具有现有技术的数据通路,包括了译码的输入输出,指令译码功能以外,还可以根据模式识别模块24区分指令的虚拟机指令集模式,然后该译码器将指令按照所区分的虚拟机指令集模式进行译码后输出给定点运算部件3,其增强了现有译码器的功能,直接译码,提高了处理器运算速度。
定点运算部件3接收到译码指令后,进行处理,输出执行的结果。
定点运算部件3除具有现有技术的数据通路,包括指令输入输出,指令执行外,还可以由译码器2对指令区分其指令集模式后,由定点运算部件3根据不同的指令模式执行相应的计算,输出执行的结果。
(一) 作为一种可实施的方式,本发明的RISC处理器装置的模式识别模块24,为一虚拟机模式控制寄存器73,所述虚拟机模式控制寄存器73,包括控制位标志X86MODE1,当该位为1时表示此时相应的指令运行在X86虚拟机指令集模式下;当该标志为0时表示此时相应的指令运行在非X86虚拟机指令集模式下。
在RISC处理器的MIPS64指令集中,有一些Coprocessor0(CP0)控制寄存器是预留给用户自定义的,如22号寄存器在所有Sel位的情况下都是预留给用户自定义的。
本发明实施例利用这些控制寄存器(CP0)中的一位来做X86模式控制标志位X86MODE1,在需要区分指令所处模式的时候,可以通过读取这个控制寄存器的相应位来进行判断。当该标志位为1时表示此时相应的指令运行在X86虚拟机指令集模式下;当该标志位为0时表示此时相应的指令运行在非X86虚拟机指令集模式下。
当RISC处理器取指令,由译码器2进行译码并执行时,译码器2首先读取虚拟机模式控制寄存器73的控制位标志X86MODE1,根据标志位的值为0或1区分的虚拟机指令集模式,并按其虚拟机指令集模式译码,直到虚拟机模式控制寄存器73的控制位标志X86MODE1被改写。
如一条加法指令进入译码器时,RISC处理器对相应的控制寄存器进行判断,区分其为X86虚拟机指令集模式或者非X86虚拟机指令集模式。
所述定点运算部件3的标志运算模块32,用于根据输入指令进行运算,然后根据运算结果计算相应的EFLAG标志位。
(二) 作为一种可实施的方式,本发明的RISC处理器装置,所述模式识别模块24为一包括在译码器中的前缀指令译码模块241,所述前缀指令译码模块241包括一前缀指令SETFLAG,用于表示该前缀指令后的多条指令处于X86虚拟机指令集模式下。
本发明实施例的前缀指令译码模块241中的前缀指令,利用MIPS指令集中的SPECIAL2的空槽的保留值实现。
译码器2的前缀指令译码模块241,在对该前缀指令译码时设置标志,这条指令后面的指令被译为X86虚拟机指令集模式,然后该前缀指令译为空操作NOP。
较佳地,所述前缀指令SETFLAG包括一范围参数,用于表示前缀指令SETFLAG的影响范围,其可以是1,表示该前缀指令只影响其后的一条指令;也可以是n,表示该前缀指令影响其后的n条指令。
较佳地,所述译码器2的前缀指令计数器242,用于记录受前缀指令影响且不出现转移指令的指令序列的指令数n; 当受影响的当前指令进入定点运算部件,即下一条指令进入译码器2时n减1。所述指令序列中不允许出现转移指令,即一旦出现转移指令则从转移指令开始的指令序列不受前缀指令的影响。
较佳地,作为一种可实施方式,所述定点运算部件3的例外处理模块34,用于在前缀指令只影响紧接其后的一条指令时,如果出现执行例外,则采用与延迟槽例外相同的方法,将Cause寄存器的bd位置1,同时将EPC指向前缀指令,例外服务程序完成后重新执行前缀指令。
较佳地,作为另一种可实施方式,所述定点运算部件3的前缀例外控制寄存器33,用于记录发生例外的指令是否受所述前缀指令影响。在出现异常而中断进程的时候向前缀例外控制寄存器33中存入当前指令的计数;在异常结束返回被中断进程时,根据所述计数,即根据之前前缀例外控制寄存器33保存的计数恢复被中断进程这个状态。
所述定点运算部件3的标志运算模块32,用于对于处于虚拟机指令集模式的指令,根据输入指令进行运算,然后根据运算结果计算相应的EFLAG标志位。
(三) 作为另一种可实施的方式,所述模式识别模块24为一指令处理模块21,用于在RISC处理器的MIPS指令中标志该指令的虚拟机指令集模式。
对于使用频度特别高的X86虚拟机指令,则需要地在RISC处理器的MIPS指令集中,通过指令处理模块21,设置一标志,标志该MIPS指令为在X86虚拟机指令集模式下执行的指令。这样,对使用频度高的X86虚拟机指令,标志该指令为X86虚拟机指令集模式,直接由RISC处理器的MIPS指令集执行,以减少相应的开销。
受指令处理模块21影响的指令,只能影响该条指令的译码执行,对其它指令则不影响,其它指令按其原有的虚拟指令集模式执行。
较佳地,所述RISC处理器的MIPS指令,包括在X86指令集中与EFLAG标志相关的指令对应的虚拟机指令,以及在X86指令集中,对特殊结构,如浮点栈进行操作的指令对应的虚拟机指令。
如指令处理模块21对RISC处理器的加法指令(Add),标志该指令的虚拟机指令集模式为X86虚拟机指令集模式X86Add,其可以利用RISC处理器MIPS指令集中SPECIAL2的空槽的保留值实现。这条指令并不是和原有的加法指令(Add)指令一样,而只是对原有的指令提供部分的支持,其对寄存器中的值进行相加操作,并且也根据结果修改相应的EFLAGS标志位,但是计算的结果并不存储到寄存器中,即寄存器的值并不会发生改变。
本发明的支持X86虚拟机的RISC处理器装置多模式下数据处理方法,包括如下步骤 步骤N210,读取指令时,区分指令的虚拟机指令集模式。
作为一种可实施的方式,所述步骤N210包括下列步骤 步骤N211,译码器读取一条前缀指令SETFLAG,表示该指令后的多条指令处于X86虚拟机指令集模式下,区分出指令的虚拟机指令集模式; 前缀指令SETFLAG还包括一范围参数,表示前缀指令SETFLAG的影响范围,其可以是1,表示该前缀指令只影响其后的一条指令;也可以是n(n≠1),表示该前缀指令影响其后的n条指令。
对该前缀指令译码时设置标志,这条指令后面的指令被译为X86虚拟机指令集模式,然后该前缀指令译为空操作NOP。
作为另一种可实施方式,所述步骤N210包括下列步骤 步骤N210’,当指令进入译码器2时,虚拟机模式控制寄存器73的控制位标志X86MODE1区分指令的虚拟机指令集模式。
所述步骤N210’包括下列步骤 步骤N211’,判断虚拟机模式控制寄存器73的控制位标志X86MODE; 步骤N212’,当该标志位为1时表示此时相应的指令运行在X86虚拟机指令集模式下; 步骤N213’,当该标志位为0时表示此时相应的指令运行在非X86虚拟机指令集模式下。
作为另一种可实施方式,所述步骤N210包括下列步骤 步骤N211”,译码器读取指令,按该指令中的标志的虚拟机指令集模式,区分指令的虚拟机指令集模式。
步骤N220,译码器在指令译码过程中,根据区分出的指令的虚拟机指令集模式,将指令按照所区分的虚拟机指令集模式,进行译码后输出给RISC处理器的定点运算部件3; 当以前缀指令区分出指令的虚拟机指令集模式时,包括下列步骤 步骤N221,译码器通过译码识别前缀指令,在译码器置一个标志位X86mode2=1, 所述步骤N220还包括下列步骤 步骤N222,译码器中的前缀指令计数器242,记录受前缀指令影响且不出现转换指令的指令序列的指令数n; 当受影响的当前指令进入定点运算部件,即下一条指令进入译码器2时n减1。
所述指令序列中不允许出现转移指令,即一旦出现转移指令则从转移指令开始的指令序列不受前缀指令的影响。
当以虚拟机模式控制寄存器73控制位标志X86MODE1区分出指令的虚拟机指令集模式时,所述步骤N220译码器进行译码,包括下列步骤 步骤N221’,当RISC处理器取指令,由译码器2进行译码并执行时,译码器首先读取虚拟机模式控制寄存器73的控制位标志X86MODE1,根据标志位的值为0或1区分的虚拟机指令集模式,并按其虚拟机指令集模式译码,直到虚拟机模式控制寄存器73的控制位标志X86MODE1被改写。
步骤N230,RISC处理器的定点运算部件根据译码器的输出,进行处理,输出执行的结果。
当以前缀指令区分出指令的虚拟机指令集模式时,包括下列步骤 步骤SN231,由于译码器将前缀指令译码为内部的空操作NOP,所以定点运算部件执行NOP指令; 为了避免在多模式指令集指令执行过程中,出现中断例外,较佳地,所述步骤N230包括下列步骤 步骤N232,定点运算部件在前缀指令只影响紧接其后的一条指令时,如果出现执行例外,则采用与延迟槽例外相同的方法,将Cause寄存器的bd(Branch delay)位置1,同时将EPC(The Exception Program Counter)指向前缀指令,例外服务程序完成后重新执行前缀指令。
一般地,EPC寄存器存放的是当例外服务程序执行完成后处理器继续原有操作的入口地址。
步骤N233,定点运算部件在前缀指令影响n条指令时,用前缀例外控制寄存器33记录发生例外的指令是否受所述前缀指令影响。在出现异常而中断进程的时候向前缀例外控制寄存器33中存入当前指令的计数。在异常结束返回被中断进程时,根据所述计数,即根据之前前缀例外控制寄存器33保存的计数恢复被中断进程这个状态。
步骤N234,定点运算部件根据输入指令进行运算,然后根据运算结果计算相应的EFLAG标志位输出。
下面以加法指令为例,以前缀指令的方式来具体本发明的RISC处理器装置多模式下数据处理方法 首先,一条前缀指令进入译码器; 然后,译码器2通过译码识别前缀指令,在译码器置一个标志位X86mode2=1,然后将前缀指令译码为内部的空操作NOP,执行后继的指令; 其后,当前缀指令的下一条指令即加法指令进入译码器时,判断前缀标志位是否存在,如果加法指令不在前缀指令的参数范围内,译码器正常译码出指令本身带有的源寄存器和目标寄存器以及内部操作的操作码(op);如果这条加法指令处于前缀指令参数范围内,即处于X86模式下的加法指令,则按照X86虚拟机指令集模式,根据计算结果修改EFLAGS标志位,因此译码器会将EFLAGS标志位译码为源寄存器中的一个,同时将EFLAGS标志位译码为目标寄存器,然后同时将加法指令本身所带有的源寄存器和目标寄存器以及内部操作的操作码(op)译码出来; 最后,定点运算部件将译码器的输出作为输入,如果是正常的MIPS指令集中的指令,进行加法计算;如果是受前缀指令影响的加法指令,定点运算部件会先进行加法计算,然后根据加法运算的结果运算出新的EFLAGS标志位的值。
本发明的RISC处理器装置及其多模式下数据处理方法,在RISC处理器装置中,当将不同模式下的虚拟机指令翻译成RISC处理器装置可以执行的指令时,直接译码并执行,节约了大量的翻译时间,处理器装置的运算速度得到指数级提高,从整体上提高处理器装置的性能。
N3)源处理器到目标处理器的地址转换的查表支持 虚拟机种类繁多,但其核心就是一个翻译或者解释的过程,即从目标代码翻译或者解释成本地代码,而在本地处理器上可以执行的过程。虚拟机在执行本地码的过程中,遇到跳转指令,需要将X86源程序的指令地址转换成相对应的MIPS目标程序的指令地址,然后根据目标程序的指令地址来实现跳转。本发明在RISC处理器中增加能够解决源指令地址(X86指令地址)到目标指令地址(MIPS指令地址)映射查找表的结构,加速从源指令地址到目标指令地址的转换,从而提高虚拟机的性能。
本发明实施例的支持X86虚拟机的RISC处理器的查找表模块23,用于利用查找表实现从X86源指令地址到MIPS目标指令地址的转换。
本发明在硬件上支持了一个查找表,对X86程序中的跳转地址到MIPS跳转地址的翻译进行快速查找,提高性能。
作为了一种可实施方式,所述查找表可以是按内容寻址的查找表,用内容可寻址存储器/随机存取存储器(Content-Addressable Memory/Random AccessMemory,CAM/RAM)来实现,其中,RAM是输入一个地址,输出对应地址中的数据;CAM是输入内容,输出存储了这个内容的单元的索引号或者是与这个索引号相关联的另一个单元的内容。
该查找表可以是按内容寻址的查找表,实现X86跳转地址到MIPS调转地址翻译,即在RISC处理器的X86虚拟机中,从X86源指令地址到MIPS目标指令地址的转换。其表项如表1所示。
表1查找表表项 如表1所述,X86源指令(SPC)到MIPS目标指令地址(TPC)转换使用3个域ASID域、SPC域和TPC域。
其中,ASID域用于存放在操作系统上启动多个X86虚拟机进程的ID号。这几个X86虚拟机进程都需要使用查找表时,使用操作系统为其分配的ID号(ASID)作区分,使之不会相互干扰; SPC域用于存放X86源指令地址; TPC域用于存放MIPS目标指令地址; 查找表模块23查找时,当前X86虚拟机进程的ASID与查表指令给出的SPC一起构成CAM的“地址”部分,送到所有表项,每个表项将自己存储的ASID、SPC与输入相比较,如果匹配就将其中存储的TPC输出。因此,就RISC处理器的X86虚拟机进程而言,只要输入它想查找的X86源指令地址,就可以从查找表23中查找到相对应的MIPS目标指令地址。
其中,查找表中的SPC域和TPC域的值由虚拟机在初始化时进行初始化处理,而ASID域的值由本地操作系统给出。
作为一种可实施方式,本发明实施例中,通过四条访问或修改该查找表结构的指令实现查找表模块23。
指令一,CAMPV指令。该指令查询查找表RAM表项值; 该指令的格式如下所示 CAMPV rd,rs 根据GPR[rs]中的内容索引查找表,得到RAM中的内容。根据通用寄存器GPR[rs]中的内容索引查找表。如果命中,那么将相应的RAM中的内容存入目标寄存器GPR[rd]中;如果表项不命中,将不命中服务程序的入口地址存入目标寄存器GPR[rd]中。
关于指令的执行过程,则是整个处理器指令执行的流程,包括取指译码执行等,它访问的部件就是上面所说的CAM查找表。
指令二,CAMPI指令。该指令查询查找表RAM表项的索引(index) 该指令的格式如下所示 CAMPI rd,rs 根据GPR[rs]中的内容索引查找表,得到该内容所在表项的索引(index)。根据通用寄存器GPR[rs]中的内容索引查找表。如果命中,那么将相应表项的索引(index)存入目标寄存器GPR[rd]中;如果表项不命中,将目标寄存器rd的最高位置1。
关于指令的执行过程,则是整个处理器指令执行的流程,包括取指译码执行等,它访问的部件就是上面所说的CAM查找表。
指令三,CAMWI指令。该指令根据查找表RAM表项的索引(index)填写查找表,该指令的格式如下所示 CAMWI rd,rs,rt 根据GPR[rd]的值填写查找表。根据通用寄存器GPR[rd]中的index值将GPR[rs]和GPR[rt]寄存器中的值分别写入查找表的CAM和RAM表项中。
如果索引(index)的值超出查找表表项的范围,则引发地址错例外。
关于指令的执行过程,则是整个处理器指令执行的流程,包括取指译码执行等,它访问的部件就是上面所说的CAM查找表。
指令四,RAMRI指令。该指令根据查找表RAM表项的索引(index)读取查找表RAM表项内容; 该指令的格式如下所示 RAMRI rd,rs 根据GPR[rs]的值读取查找表的RAM的内容。根据通用寄存器GPR[rs]中的index值读取查找表的RAM的内容,并存入目标寄存器GPR[rd]中。
如果index的值超出查找表表项的范围,则引发地址错例外。
下面详细说明查找不命中,即查找表查找不成功时,即CAM中并没有相应进程期望的一对SPC-TPC,相应的处理过程。
当查找不成功时,即不命中时,跳转到不命中服务程序入口地址,由不命中服务程序进行处理。
不命中服务程序是现有的一种例程,是MIPS指令集的RISC处理器的一种现有标准技术,因此在本发明实施例中不再一一详细描述。
作为一种可实施方式,所述不命中服务程序的入口地址利用一个CP0寄存器CAM.default保存实现,由虚拟机提供一个缺省值,保存在CP0寄存器CAM.default中,作为不命中服务程序的入口地址。
这是处理器的一个控制寄存器,使用与其它控制寄存器相同的读写方式(只是地址不同),由虚拟机提供一个缺省值,为不命中服务程序的入口地址。当CAM执行查表而不命中时,将所述保存在CAM.default中的缺省值送到目标寄存器,这样查表程序可以在命中的情况下,跳转到MIPS指令地址执行;而在不命中的情况下,跳转到不命中服务程序的入口地址,然后利用不命中服务程序查找得到的相应的地址填入查找表中。这样也可以避免查表后加入转移指令判断是否命中。
由于此时目标地址已经存入目标寄存器中,所以利用现有的MIPS64中的直接跳转指令JR rs即可实现跳转。
其中,rs就是放由目标地址的寄存器。
作为另一种可实施方式,不命中服务程序的入口地址可以存放在查找表表项的第0项,而不是实施例一中的一个控制寄存器中。
这种方法中又设置一条新指令VJR,缺省是用了第31号通用寄存器的内容作为SPC查表,VJR的指令功能类似于第一种方法里的CAMPV+JR两条指令的功能。
该指令的格式如下所示 VJR rt 根据31号通用寄存器的值读取查找表的RAM的内容。根据通用寄存器GPR[31]中的值读取查找表的RAM的内容(也就是转化后的目标地址)。如果查找成功,则存入目标寄存器GPR[rt]中。然后指令根据rt寄存器的值跳转到目标地址;否则将CAM表中第0项的RAM内容存入目标寄存器GPR[rt]中。指令根据rt寄存器的值跳转到不命中服务程序处理。
关于指令的执行过程,则是整个处理器指令执行的流程,包括取指译码执行等,它访问的部件就是上面所说的CAM查找表。
当出现使用源指令地址的跳转指令时,在该指令之前由一条指令将源指令地址的值放入一固定的寄存器(如31号寄存器),例如X86中的JMP rax指令; 由两条MIPS指令实现 Addiu $31,r2,0x0 VJRr4 跳转指令译码后,由VJR指令根据这个固定的寄存器中的值查表后,如果命中,就直接转换到目标指令地址指向的代码段执行;如果不命中,直接跳转到查找表的第0项,然后跳转到不命中服务程序。
下面详细描述本发明的支持X86虚拟机的RISC处理器装置的指令地址转换查找过程,包括下列步骤 步骤N310,在RISC处理器的X86虚拟机启动时,初始化查找表,用得到的X86虚拟机指令地址到MIPS指令地址的内容来填写查找表; 在RISC处理器的X86虚拟机初始化时,利用不命中服务程序,根据不命中服务程序所维护的哈希表的内容,通过CAMPI指令和CAMWI指令初始化得到相应的X86指令地址到MIPS指令地址的查找表。
步骤N320,RISC处理器的X86虚拟机的跳转指令由于需要完成从X86源指令地址到目标指令地址的转换而访问查找表; 所述步骤N320包括下列步骤 步骤N321,使用查询查找表表项值的CAMPV指令,根据寄存器中的源指令地址搜索查找表得到目标指令地址; 步骤N322,如果查找命中,则将直接得到的目标指令地址的值存入目标寄存器中,程序由跳转指令跳转至该目标地址指向的代码段执行; 步骤N323,如果查找不命中,则将得到不命中服务程序的地址,该地址由虚拟机给出,存入目标寄存器,程序跳转至不命中服务程序执行。
步骤N330,不命中服务程序根据虚拟机所维护的哈希表的内容而重新填写查找表; 所述步骤N330包括下列步骤 步骤N331,使用查询查找表表项的索引的CAMPI指令,根据源指令地址的值得到该值所在表项的索引(index),并将该索引存入目标寄存器中; 步骤N332,使用根据查找表表项的索引(index)填写查找表的CAMWI指令,将进程的ASID、源指令地址以及相对应的目标指令地址,根据目标寄存器中的索引值填表同时填入表中。
较佳地,所述指令地址转换查找方法过程,还包括下列步骤 步骤N340,无效查找表中的一项内容;或者读取查找表RAM的内容。
使用根据查找表RAM表项的索引(index)填写查找表的CAMWI指令,向指定的索引(index)的该项,填写固定的值,所述的固定的值不能与程序的源指令地址相匹配,也就是无效掉了该项。
使用根据查找表RAM表项的索引(index)读取查找表RAM表项内容的RAMRI指令,读取指定的索引(index)表项的查找表RAM的值,存入目标寄存器中,以方便调试。
本发明的RISC处理器装置及其指令地址转换查找方法,在RISC处理器中增加能够解决X86源指令地址到MIPS目标指令地址映射的查找表的结构,在RISC处理器的X86虚拟机中,加速从X86源指令地址到MIPS目标指令地址的转换,从而使用提高虚拟机的性能。
通过结合附图对本发明具体实施例的描述,本发明的其它方面及特征对本领域的技术人员而言是显而易见的。
以上对本发明的具体实施例进行了描述和说明,这些实施例应被认为其只是示例性的,并不用于对本发明进行限制,本发明应根据所附的权利要求进行解释。
权利要求
1、一种支持X86虚拟机的RISC处理器,其特征在于,包括指令模块,译码器,查找表,定点运算部件和浮点运算部件,其中
所述指令模块包括扩展指令模块,用于存储支持X86虚拟机的虚拟机指令集;
所述译码器,用于在虚拟机指令集指令译码过程中,区分出指令的虚拟机指令集模式,将指令按照所区分的虚拟机指令集模式,进行译码后输出给定点运算部件或者浮点运算部件;
所述查找表,用于对X86程序中的跳转地址到MIPS跳转地址的翻译进行快速查找,提高虚拟机性能;
所述定点运算部件用于根据译码器的输出,对虚拟机指令集的定点指令进行处理,输出执行的结果;
所述浮点运算部件用于根据译码器的输出,对虚拟机指令集的浮点指令进行处理,输出执行结果。
2、根据权利要求1所述的支持X86虚拟机的RISC处理器,其特征在于,还包括访存执行单元,内存及相应的数据通路;
所述访存执行单元根据译码器的输出,通过数据通路完成内部寄存器与内存之间的数据传输。
3、根据权利要求2所述的支持X86虚拟机的RISC处理器,其特征在于,还包括通用物理寄存器堆,所述通用物理寄存器堆包括溢出检查寄存器,上界、下界地址寄存器,模拟标志寄存器,虚拟机模式控制寄存器;
所述溢出检查寄存器,用于在对所述栈寄存器进行浮点访问时栈溢出例外检查;
所述上界、下界地址寄存器,用于模拟X86处理器的有界访存机制时存储作为上界、下界的有效地址;
所述模拟标志寄存器,用于模拟实现CISC处理器的标志寄存器标志位;
所述虚拟机模式控制寄存器,当该控制位标志为1时表示此时相应的指令运行在X86虚拟机指令集模式下;当该控制位标志为0时表示指令运行在非X86虚拟机指令集模式下。
4、根据权利要求3所述的支持X86虚拟机的RISC处理器,其特征在于,还包括浮点寄存器堆;
所述浮点寄存器堆包括浮点控制寄存器,浮点寄存器栈;以及第1~3浮点寄存器。
5、根据权利要求1至4任一项所述的支持X86虚拟机的RISC处理器,其特征在于,所述虚拟机指令集包括多倍访存指令、前缀指令、EFLAG标志位指令、浮点栈相关指令、查找表指令中的一种或者一种以上的组合。
6、根据权利要求5所述的支持X86虚拟机的RISC处理器,其特征在于,所述译码器包括指令处理模块,模式识别模块,其中
所述指令处理模块,用于对虚拟机指令集的指令进行指令译码,然后输出给定点运算部件或者浮点运算部件;
所述模式识别模块,用于在指令译码过程中,区分出指令的虚拟机指令集模式,进行相应的处理。
7、根据权利要求6所述的支持X86虚拟机的RISC处理器,其特征在于,所述模式识别模块包括多倍存储译码模块和/或多倍读取译码模块;
所述多倍存储译码模块,用于在输入的指令是访存扩展指令中的存储操作指令时,将源寄存器由一个扩展成多个相邻的寄存器,然后输出到访存执行单元执行;
所述多倍读取译码模块,用于在输入的指令是访存扩展指令中的读取操作指令时,将该读取操作指令译码为多条内部操作指令,将目标寄存器由一个扩展成多个相邻的寄存器,然后分配到所述多条内部操作中,输出到执行单元执行。
8、根据权利要求7所述的支持X86虚拟机的RISC处理器,其特征在于,所述模式识别模块还包括前缀指令译码模块和标志位指令译码模块;
所述标志位指令译码模块,用于对处于模拟EFLAGS工作模式下的EFLAG标志位指令进行处理,根据不同的EFLAG标志位指令,将模拟标志寄存器译码为其指令的源寄存器和/或目标寄存器;
所述前缀指令译码模块,用于指示前缀指令后的多条指令处于X86虚拟机指令集模式下。
9、根据权利要求8所述的支持X86虚拟机的RISC处理器,其特征在于,当前缀指令的范围参数为n时,译码器还包括前缀指令计数器,用于记录受前缀指令影响且不出现转移指令的指令序列的指令数n。
10、根据权利要求6所述的支持X86虚拟机的RISC处理器,其特征在于,所述译码器还包括TOP指针寄存器,查找表模块,其中
所述TOP指针寄存器,用于维护一浮点栈操作指针,存储浮点栈栈操作指针的值;
所述查找表模块,用于根据查找表指令,利用查找表实现从X86源指令地址到MIPS目标指令地址的转换。
11、根据权利要求5所述的支持X86虚拟机的RISC处理器,其特征在于,所述定点运算部件包括标志读写模块,标志运算模块,例外处理模块,前缀例外控制寄存器;
所述标志读写模块,用于读写模拟标志寄存器标志位的值;
所述标志运算模块,用于在运算过程中,当RISC处理器处于X86虚拟机工作模式时,根据模拟标志寄存器标志位的值,进行控制;
所述例外处理模块,用于在前缀指令只影响紧接其后的一条指令时,如果出现执行例外,则采用与延迟槽例外相同的方法,将Cause寄存器的bd位置1,同时将EPC指向前缀指令,例外服务程序完成后重新执行前缀指令;
所述前缀例外控制寄存器,用于记录发生例外的指令是否受所述前缀指令影响;在出现异常而中断进程的时候存入当前指令的计数,在异常结束返回被中断进程时,根据所述计数恢复所述被中断进程。
12、根据权利要求5所述的支持X86虚拟机的RISC处理器,其特征在于,所述浮点运算部件包括指针操作模块,栈溢出判断模块,转换模块;
所述指针操作模块,用于对所述指针寄存器进行操作,在模拟所述浮点寄存器栈操作时,模拟所述指针寄存器的栈操作指针的栈操作,修改并监控栈操作指针的状态;
所述栈溢出判断模块,用于检查指定的浮点寄存器栈中的栈寄存器,并根据栈寄存器的值对溢出检查寄存器进行操作,进行浮点栈溢出检查;
所述转换模块,用于进行扩展双精度浮点数据和双精度浮点数据之间的相互转换。
13、一种RISC处理器装置支持X86虚拟机的数据处理方法,其特征在于,包括下列步骤
步骤A,在RISC处理器中设置处于RISC处理器的X86虚拟机工作模式;
步骤B,读取指令,区分指令的虚拟机指令集模式;在指令译码过程中,根据区分出的指令的虚拟机指令集模式,将指令按照所区分的虚拟机指令集模式,进行译码后输出;
步骤C,根据所述输出,进行相应的计算或存取处理,输出执行的结果。
14、根据权利要求13所述的RISC处理器装置支持X86虚拟机的数据处理方法,其特征在于,当处理器支持X86虚拟机的数据处理过程为对使用EFLAG指令的支持时,包括以下步骤
步骤A1,在RISC处理器中设置处于RISC处理器的X86虚拟机工作模式,即模拟标志寄存器可用;
步骤B1,译码器识别出运算是处于模拟EFLAGS工作模式下,然后根据不同的指令,将模拟标志寄存器译码为源寄存器和/或目标寄存器;
步骤C1,RISC处理器在运算过程中,当处于RISC处理器的X86虚拟机工作模式时,读写模拟标志寄存器标志位的值,和/或根据模拟标志寄存器标志位的值,进行控制。
15、根据权利要求13所述的RISC处理器装置支持X86虚拟机的数据处理方法,其特征在于,当处理器支持X86虚拟机的数据处理过程为对X86浮点格式和浮点栈的支持时,包括以下步骤
步骤A2,根据栈使能位,决定是否选定浮点寄存器用于模拟浮点寄存器栈操作;或者设置一通用寄存器,其低8位由低到高分别表示浮点寄存器栈的栈寄存器0~7号的状态;或者选用任意三个通用寄存器,作为第一浮点寄存器,第二浮点寄存器和第三浮点寄存器,担任转换工作;
步骤B2,在译码器中3位的指针寄存器,存放栈操作指针的值;或者对新增的栈溢出判断指令译码;或者对扩展双精度浮点数据与双精度浮点数据的转换指令译码;
步骤C2,在模拟浮点寄存器栈操作时,对指针寄存器进行操作,模拟栈操作指针的栈操作,修改并监控栈操作指针的状态;或者检查指定的浮点寄存器栈中的栈寄存器,并根据栈寄存器的值对溢出检查寄存器进行操作,进行浮点栈溢出检查;或者执行扩展双精度浮点数据与双精度浮点数据之间的数据转换。
16、根据权利要求13所述的RISC处理器装置支持X86虚拟机的数据处理方法,其特征在于,当处理器支持X86虚拟机的数据处理过程为对X86存储结构的支持时,包括以下步骤
步骤A3,在RISC处理器的X86虚拟机中,设置物理寄存器堆中两个通用寄存器分别为上界地址寄存器和下界地址寄存器;
步骤B3,在进行X86虚拟机指令集到MIPS指令集翻译时,译码器将指令进行译码,得到可被RISC处理器处理的二进制代码;
步骤C3,定点运算部件在译码后的访存指令中,根据上界地址寄存器中存储的上界地址和/或下界地址寄存器中存储的下界地址,判断指令操作数地址和指令地址的有效性;当地址皆为有效时,执行访存操作;否则引发地址错例外。
17、根据权利要求13所述的RISC处理器装置支持X86虚拟机的数据处理方法,其特征在于,当处理器支持X86虚拟机的数据处理过程为对虚拟机制的支持时,包括以下步骤
步骤A4,读取前缀指令,区分指令的虚拟机指令集模式;或者处理器取出多倍数据宽度指令输入到译码器;或者在RISC处理器的X86虚拟机启动时,初始化查找表,用得到的X86虚拟机指令地址到MIPS指令地址的内容来填写查找表;
步骤B4,在指令译码过程中,根据区分出的指令的虚拟机指令集模式,将指令按照所区分的虚拟机指令集模式,进行译码后输出;或者译码器判断指令类型,识别并译码多倍数据宽度指令;或者译码器识别查找表相关指令;
步骤C4,定点运算部件执行受前缀指令影响的指令,并根据运算结果计算相应的EFLAG标志位;或者将译码后的多倍数据宽度指令发送到执行单元执行操作;或者执行查找表相关指令,得到目标指令地址的值或者跳转到目标地址执行。
全文摘要
本发明公开了一种支持X86虚拟机的RISC处理器装置及方法。该RISC处理器,包括指令模块包括扩展指令模块,用于存储支持X86虚拟机的虚拟机指令集;译码器,用于在虚拟机指令集指令译码过程中,区分出指令的虚拟机指令集模式,将指令按照所区分的虚拟机指令集模式,进行译码后输出给定点运算部件或者浮点运算部件;定点运算部件用于根据译码器的输出,对虚拟机指令集的定点指令进行处理,输出执行的结果;浮点运算部件用于根据译码器的输出,对虚拟机指令集的浮点指令进行处理,输出执行结果。其提高RISC处理器运行虚拟机的性能。
文档编号G06F9/30GK101256504SQ20081010208
公开日2008年9月3日 申请日期2008年3月17日 优先权日2008年3月17日
发明者李国杰, 胡伟武, 李晓钰, 苏孟豪 申请人:中国科学院计算技术研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1