公开/公告号CN103744641A
专利类型发明专利
公开/公告日2014-04-23
原文格式PDF
申请/专利权人 龙芯中科技术有限公司;
申请/专利号CN201410032331.3
申请日2014-01-23
分类号G06F9/30(20060101);
代理机构11205 北京同立钧成知识产权代理有限公司;
代理人刘芳
地址 100095 北京市海淀区中关村环保科技示范园龙芯产业园2号楼
入库时间 2024-02-19 23:15:09
法律状态公告日
法律状态信息
法律状态
2016-08-17
授权
授权
2014-05-21
实质审查的生效 IPC(主分类):G06F9/30 申请日:20140123
实质审查的生效
2014-04-23
公开
公开
技术领域
本发明涉及计算机技术,尤其涉及一种禁止已翻译指令序列执行的方法、 装置和虚拟机。
背景技术
虚拟机(英文:Virtual Machine简称:VM)的核心是执行引擎,包括 解释器和编译器,其中编译器通常为即时编译器(英文:Just-in-time Compiler,简称:JIT)。VM JIT在翻译某个方法时,为了尽可能地提升 翻译后生成的本地机器指令的质量,通常会基于某些假设(如对象的类型、 分支是否可能被执行等)进行深度优化,对于这种基于若干假设的优化, 同时生成相应的假设条件监测语句。当某项假设不再成立时,虚拟机需要 禁止先前基于该假设翻译生成的本地机器指令序列的执行。
虚拟机禁止已翻译指令序列的执行,一般采用将需要被禁止执行的 指令序列的若干条首部指令修改为实现跳转到一个固定处理例程 (fix_handler)首地址功能的若干条指令,然后在这个固定处理例程中启 动解释执行或者重新翻译等后续动作。在虚拟机修改已翻译指令序列的 同时需要保证修改操作的原子性从而保证多线程安全:使得可能正在执 行该指令序列的多个线程所执行的要么是修改之前的指令序列,要么是 修改完成之后的指令序列,以避免引发执行错误。
指令序列的原子性修改通常要求硬件所提供的最大原子访存位数不 小于所需更改的指令序列(即实现跳转到固定处理例程的首地址功能的指 令序列)总长度,然而标准的MIPS体系结构,在64位硬件系统中所能提 供的最大原子访存长度为8字节,通常小于完成指令修改所需的长度。在 保证多线程安全并且满足硬件直接支持的原子性修改操作限制的前提 下,现有技术中,虚拟机禁止已翻译指令序列执行,通常采用下述方 法:JIT翻译方法时,在生成的本地指令序列的头部为实现远跳转的指令 预留足够的存储空间,并向其写入跳转到固定处理例程的首地址的远跳 转指令序列;当需要禁止已翻译指令序列的执行时,首先将第一条指令 原子性地修改为一条短跳转指令,通过该短跳转指令跳转到之前指令序 列头部所预留的存储空间的首地址,然后继续执行先前写入的远跳转指 令序列以跳转到固定处理例程的首地址,从而完成禁止已翻译指令序列 的执行。
上述方法,通过增加一次额外的短跳转指令满足了硬件直接支持的原 子性修改操作的限制,并且由于虚拟机在修改指令序列时,仅存在修改前 和修改后两个状态,因此在多线程环境下也是安全的。然而,由于现代处 理器对跳转指令的执行通常代价较高,采用上述方法,虚拟机禁止已翻译 指令序列执行的效率不高。
发明内容
鉴于此,本发明提供一种禁止已翻译指令序列执行的方法、装置和虚拟 机,以提高虚拟机禁止已翻译指令序列执行的效率。
本发明的第一方面提供一种禁止已翻译指令序列执行的方法,包括:
判断已翻译指令序列对应的监测语句中包括的假设条件是否成立;
若所述假设条件不成立,则从所述已翻译指令序列对应的线程控制结 构中获取固定处理例程的首地址;
修改所述已翻译指令序列首部的至少一条指令为跳转到所述固定处 理例程的首地址的跳转指令序列,以执行所述跳转指令序列禁止所述已翻 译指令序列的执行。
进一步地,上述从所述已翻译指令序列对应的线程控制结构中获取固 定处理例程的首地址之前,还包括:
在所述线程控制结构中增加一数据域;
将所述固定处理例程的首地址存储在所述数据域中;
上述从所述已翻译指令序列对应的线程控制结构中获取固定处理例 程的首地址,包括:
从所述数据域中获取所述固定处理例程的首地址。
进一步地,上述从所述数据域中获取所述固定处理例程的首地址,包 括:
获取所述线程控制结构的首地址;
将所述线程控制结构的首地址增加一个固定偏移量得到所述数据域 对应的地址,所述固定偏移量为所述数据域在线程控制结构中对应的偏移 量;
根据所述数据域对应的地址获取所述固定处理例程的首地址。
进一步地,上述跳转指令序列,包括加载指令和跳转指令,其中所述 加载指令用于加载所述固定处理例程的首地址到临时寄存器,所述跳转指 令用于跳转到所述临时寄存器中保存的固定处理例程的首地址。
本发明的第二方面提供一种禁止已翻译指令序列执行的装置,包括:
监测模块,用于判断已翻译指令序列对应的监测语句中包括的假设条 件是否成立;
获取模块,用于若所述假设条件不成立,则从所述已翻译指令序列对 应的线程控制结构中获取固定处理例程的首地址;
修改模块,用于修改所述已翻译指令序列首部的至少一条指令为跳转 到所述固定处理例程的首地址的跳转指令序列,以执行所述跳转指令序列 禁止所述已翻译指令序列的执行。
进一步地,上述装置,还包括:
存储模块,用于在所述获取模块从所述已翻译指令序列对应的线程控 制结构中获取固定处理例程的首地址之前,在所述线程控制结构中增加一 数据域;以及
将所述固定处理例程的首地址存储在所述数据域中;
上述获取模块,具体用于:
从所述数据域中获取所述固定处理例程的首地址。
进一步地,上述获取模块,具体用于:
获取所述线程控制结构的首地址;
将所述线程控制结构的首地址增加一个固定偏移量得到所述数据域 对应的地址,所述固定偏移量为所述数据域在线程控制结构中对应的偏移 量;
根据所述数据域对应的地址获取所述固定处理例程的首地址。
进一步地,上述跳转指令序列,包括加载指令和跳转指令,其中所述 加载指令用于加载所述固定处理例程的首地址到临时寄存器,所述跳转指 令用于跳转到所述临时寄存器中保存的固定处理例程的首地址。
本发明的第三方面提供一种虚拟机,包括如本发明的第二方面所述的 禁止已翻译指令序列执行的装置。
本发明提供的禁止已翻译指令序列执行的方法和装置,通过当需要禁 止已翻译指令序列执行时,从当前线程控制结构中获取固定处理例程的首地 址,并原子性修改指令序列首部的至少一条指令为跳转到固定处理例程的首 地址的指令,实现了一次跳转就可以禁止已翻译指令序列的执行,提高了禁 止已翻译指令序列执行时的处理效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实 施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下 面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在 不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明提供的禁止已翻译指令序列执行的方法实施例一的流程图;
图2为本发明提供的禁止已翻译指令序列执行的方法实施例二的流程图;
图3为图2所示方法实施例中获取固定处理例程首地址的流程图;
图4为本发明提供的禁止已翻译指令序列执行的方法实施例三的流程图;
图5为本发明提供的禁止已翻译指令序列执行的装置的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发 明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述, 显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于 本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获 得的所有其他实施例,都属于本发明保护的范围。
图1为本发明提供的禁止已翻译指令序列执行的方法实施例一的流程 图,如图1所示,该方法实施例,包括如下步骤:
步骤101、判断已翻译指令序列对应的监测语句中包括的假设条件是否 成立;
步骤102、若假设条件不成立,则从已翻译指令序列对应的线程控制结 构中获取固定处理例程的首地址;
步骤103、修改已翻译指令序列首部的至少一条指令为跳转到固定处 理例程的首地址的跳转指令序列,以执行跳转指令序列禁止已翻译指令序 列的执行。
其中,该修改指原子性修改。值得注意的是,此处“修改已翻译指令 序列首部的至少一条指令”指根据实现该跳转功能所需指令的条数,确定 所需修改的已翻译指令序列首部的指令条数,举例来说,若实现该跳转功 能需要2条指令,则可通过硬件支持的访存指令原子性修改已翻译指令序 列首部前2条指令为该跳转指令序列。
进一步地,在本发明实施例中该跳转指令序列,包括加载指令和跳转 指令,其中加载指令用于加载固定处理例程的首地址到临时寄存器,跳转 指令用于跳转到临时寄存器中保存的固定处理例程的首地址。
具体来说,执行已翻译指令序列时,若监测到监测语句中包含的假设条 件不成立或者失效时,从当前线程控制结构获取固定处理例程的首地址,并 通过硬件支持的访存指令原子性地将需要禁止执行的已翻译指令序列首部指 令修改为跳转到固定处理例程的首地址的跳转指令序列:加载固定处理例程 的首地址,并跳转到该固定处理例程的首地址,从而禁止已翻译指令序列 的执行。在多线程环境下,硬件直接支持的原子性修改保证了其他线程执 行的要么是修改前的指令序列要么是修改后的指令序列,从而保证了多线 程安全。
现有技术中,需要使用短跳转指令跳转到指令序列头部所预留的存储空 间的首地址,然后继续执行先前写入的远跳转指令序列来跳转到固定处理 例程的首地址,需要执行2次跳转。
该方法实施例,通过从当前线程控制结构中获取固定处理例程的首地址, 并原子性修改指令序列首部的至少一条指令为跳转到固定处理例程首地址的 指令序列,实现了一次跳转就可以禁止已翻译指令序列的执行,提高了禁止 已翻译指令序列执行时的处理效率。
图2为本发明提供的禁止已翻译指令序列执行的方法实施例二的流程 图,该实施例在图1所示方法实施例一的基础上,主要包括步骤102的具体 实施方式,如图2所示,该实施例,包括如下步骤:
步骤201、在线程控制结构中增加一数据域;
步骤202、将固定处理例程的首地址存储在数据域中;
步骤203、从数据域中获取固定处理例程的首地址。
其中,步骤203为图1所示方法实施例一中步骤102进一步的具体实施 方式。
进一步地,图3为图2所示方法实施例中获取固定处理例程首地址的流 程图,如图3所示,步骤203可包括的下述步骤:
步骤301、获取线程控制结构的首地址;
其中,可指定一个通用寄存器,用于存储当前线程控制结构的首地址, 该通用寄存器不宜再参与翻译时的寄存器分配;若JIT在翻译过程中必须使 用该寄存器,则要注意对其进行保护。由于对线程控制结构的访问十分频繁, 将线程控制结构的首地址存储到通用寄存器中,可以加快频繁访问操作的速 度,提高运行效率。
步骤302、将线程控制结构的首地址增加一个固定偏移量得到数据域对 应的地址,固定偏移量为数据域在线程控制结构中对应的偏移量;
步骤303、根据数据域对应的地址获取固定处理例程的首地址。
具体来说,在虚拟机的线程控制结构中增加一数据域,专门用于保存禁 止已翻译指令序列执行时,需要跳转到的固定处理例程的首地址。当有新线 程创建时,进行线程初始化,同时向线程控制结构的新增数据域中存入上述 固定处理例程的首地址,然后在执行方法对应的已翻译指令序列时,若需要 禁止已翻译指令序列的执行,首先获取线程控制结构的首地址,然后根据数 据域对应的固定偏移量获取该数据域对应的地址,并从该数据域中获取固定 处理例程的首地址。
对于64位虚拟机而言,任一内存地址的表示仅需8字节,因此该数据域 需占用8字节的存储空间,并且该线程控制结构中的该数据域保存的固定处 理例程的首地址可适用于当前线程中包含的所有待执行的方法对应的指令序 列。对于每个当前线程,其包含的待执行的方法可能包括成百上千个,以当 前线程包含100个方法举例来说,现有技术中,通过在方法对应的指令序列 头部预留存储空间以保存远跳转所需的指令序列,对于64位虚拟机,每个方 法都需要预留8条指令的空间,每条指令4字节,此时需要预留的存储空间 至少为100×8×4=3200字节。
该方法实施例,在图1所示方法实施例具有的技术效果的基础上,通过 在线程控制结构中增加数据域以保存固定处理例程首地址,大大节省了禁止 已翻译指令序列执行时需要的存储空间,并且可通过通用寄存器保存线程控 制结构的首地址,以加快频繁访问操作的速度,提高运行效率。
图4为本发明提供的禁止已翻译指令序列执行的方法实施例三的流程 图,该实施例在图1和图2所示方法实施例的基础上,以MIPS架构处理器 64位虚拟机为例来进行说明该方法实施例的工作原理。需说明的,本发明提 供的方法实施例适用于但不限于MIPS架构处理器这类不直接支持32位立即 数跳转的处理器,举例来说,本发明提供的方法实施例还可以在Sparc架构 的处理器上适用。如图4所示,该方法实施例,包括如下步骤:
步骤401、在线程控制结构中增加一个名为fixed_handler的数据域,用 于保存禁止已翻译指令序列执行时,需要跳转到的固定处理例程的首地址;
步骤402、指定通用寄存器T9,专门用于存储当前线程控制结构的首地 址,该通用寄存器T9不再参与翻译时的寄存器分配;
步骤403、创建新线程,进行线程初始化,将固定处理例程的首地址保 存到线程控制结构中的“fixed_handler”数据域,并且将线程控制结构的首地 址加载到寄存器T9中;
步骤404、执行目标程序,判断目标程序中的方法是否已翻译;
步骤405、若未翻译,判断该方法是否满足翻译条件,即判断该方法是 否为热点方法;
步骤406、若满足翻译条件,则调用即时编译器进行翻译得到该方法对 应的已翻译指令序列,并将已翻译指令序列的第一条指令按8字节对齐,以 满足8字节原子访存操作要求;
步骤407、若已翻译,判断监测语句中包括的假设条件是否成立;
步骤408、若不成立,通过MIPS指令集提供的8字节访存指令“sd”, 原子性地将需要禁止的已翻译指令序列首部的前面两条指令修改为下面两条 指令:
“ld AT,off(T9)”
“jr AT”
sd指令是所有MIPS架构CPU均支持的一条标准指令,该指令是由 CPU硬件直接支持的,用于对内存以8字节为单位进行写操作。经过上述 修改,在执行已翻译指令序列时,首先通过ld指令加载线程控制结构 fixed_handler数据域中保存的固定处理例程的首地址到临时寄存器AT,然后 通过jr指令跳转到临时寄存器AT中保存的固定处理例程的首地址,以进行 解释执行或者重新翻译等后续操作,其中,off为fixed_handler数据域在线 程控制结构中对应的偏移量;
步骤409、若不满足翻译条件,调用解释器解释执行该方法;
步骤410、若已翻译且假设条件成立,执行该方法对应的已翻译指令序 列。
其中,步骤401中,在线程控制结构中增加数据域以保存固定处理例程 的首地址,不需要使用短跳转指令跳转到现有技术中指令序列头部所预留 的存储空间的首地址,然后继续执行先前写入的远跳转指令序列来跳转到 固定处理例程的首地址,减少了一次短跳转,提高了执行效率;步骤406中, 可根据字节对齐需求进行对齐,若不需要字节对齐,则不需要执行字节对齐 相关的步骤;步骤408,通过硬件支持的8字节访存指令进行原子性修改, 在满足硬件原子性修改要求的同时,保证了多线程安全。
需说明的是步骤408中,不同的处理器,在实现相同功能时所用的指令 不同,例如,对于Sparc处理器,可以通过ldx指令加载固定处理例程首地 址,jmp指令跳转到该固定处理例程的首地址,然后通过访存指令stx修改 已翻译指令序列首部的指令。
该方法实施例,通过从当前线程控制结构中获取固定处理例程的首地址, 并原子性修改指令序列首部的至少一条指令为跳转到固定处理例程首地址的 指令序列,实现了一次跳转就可以禁止已翻译指令序列的执行,提高了禁止 已翻译指令序列执行时的处理效率,并且通过在线程控制结构中增加数据域 以保存固定处理例程首地址,大大节省了禁止已翻译指令序列执行时需要的 存储空间。
图5为本发明提供的禁止已翻译指令序列执行的装置的结构示意图, 如图5所示,该禁止已翻译指令序列执行的装置500,包括:监测模块501、 获取模块502、修改模块503和存储模块504,其中
监测模块501,用于判断已翻译指令序列对应的监测语句中包括的假 设条件是否成立;
获取模块502,用于若假设条件不成立,则从已翻译指令序列对应的 线程控制结构中获取固定处理例程的首地址;
修改模块503,用于修改已翻译指令序列首部的至少一条指令为跳转 到固定处理例程的首地址的跳转指令序列,以执行跳转指令序列禁止已翻 译指令序列的执行。
存储模块504,用于在获取模块502从已翻译指令序列对应的线程控 制结构中获取固定处理例程的首地址之前,在线程控制结构中增加一数据 域;以及
将固定处理例程的首地址存储在数据域中;
相应地,获取模块502,具体用于:
从数据域中获取固定处理例程的首地址。
进一步地,获取模块502,具体用于:
获取线程控制结构的首地址;
将线程控制结构的首地址增加一个固定偏移量得到数据域对应的地 址,固定偏移量为数据域在线程控制结构中对应的偏移量;
根据数据域对应的地址获取固定处理例程的首地址。
进一步地,修改模块503中的跳转指令序列,包括加载指令和跳转指 令,其中加载指令用于加载固定处理例程的首地址到临时寄存器,跳转指 令用于跳转到临时寄存器中保存的固定处理例程的首地址。
该装置实施例,可以用于执行上述图1~图3所示的方法实施例中提供 的技术方案和图4所示的方法实施例中的相应步骤,其实现原理和技术效 果类似,不再赘述。
本发明还提供一种虚拟机,该虚拟机,可包括图5所示的装置实施例 中给提供的禁止已翻译指令序列执行的装置500,可用于执行上述图1~图 3所示的方法实施例中提供的技术方案和图4所示的方法实施例中的相应 步骤,其实现原理和技术效果类似,不再赘述。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对 其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通 技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改, 或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并 不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
机译: 定序器和在可重编程的I / O接口中选择性禁止时钟信号执行减少指令序列的方法
机译: 定序器和在可重编程的I / O接口中选择性禁止时钟信号执行减少指令序列的方法
机译: 通过测量在每个可选硬件预取深度处循环的指令序列的执行时间以及通过禁用每个软件预取指令来循环的指令序列的执行时间来进行预取优化的方法