CN105830023B - 用于在执行上下文中运行动态代码程序的方法和装置 - Google Patents

用于在执行上下文中运行动态代码程序的方法和装置 Download PDF

Info

Publication number
CN105830023B
CN105830023B CN201480068934.7A CN201480068934A CN105830023B CN 105830023 B CN105830023 B CN 105830023B CN 201480068934 A CN201480068934 A CN 201480068934A CN 105830023 B CN105830023 B CN 105830023B
Authority
CN
China
Prior art keywords
executable
code
image
virtual machine
application
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201480068934.7A
Other languages
English (en)
Other versions
CN105830023A (zh
Inventor
M·B·黛尔沙特
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Oracle International Corp
Original Assignee
Oracle International Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Oracle International Corp filed Critical Oracle International Corp
Publication of CN105830023A publication Critical patent/CN105830023A/zh
Application granted granted Critical
Publication of CN105830023B publication Critical patent/CN105830023B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45516Runtime code conversion or optimisation
    • G06F9/45525Optimisation or modification within the same instruction set architecture, e.g. HP Dynamo
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

用于促进调整在可执行存储器的写入受限的计算环境中运行的计算机代码的系统和方法。示例方法包括利用虚拟机从软件代码生成第一可执行映像,以及采用该第一可执行映像来选择性地修改虚拟机和第一可执行映像,从而产生更新的虚拟机和第二可执行映像。第二可执行映像表示第一可执行映像的更新版本。为了将动态代码(诸如本地产生的计算机代码)变换成用于在受约束的设备上运行的一个或多个可执行映像,实施例可以利用现有的动态代码生成器(例如,在Java HotSpot性能引擎(也被称为HotSpot)中),从而选择性地修改它们,以生成在关联软件应用的后续运行中可用的不同的(即,更新的)代码,由此有效地实现被用来运行该软件的可执行代码的修改。

Description

用于在执行上下文中运行动态代码程序的方法和装置
对相关申请的交叉引用
本申请要求于2013年12月20日提交的标题为“TRANSFORMING NATIVEINSTRUCTIONS INTO ANIMMUTABLE EXECUTABLE IMAGE”的美国临时专利申请序列号61/919,654的优先权,该申请通过引用被结合于此以用于所有目的,就好像在本申请中完全阐述了一样。
技术领域
本申请涉及软件并且更具体而言涉及用于在可执行存储器的写入受限的计算环境中促进动态计算机代码生成和使用的系统和方法。
背景技术
用于促进动态代码生成的软件在各种苛刻的应用中被采用,所述应用包括网络分布式企业软件、一般的基于Web的应用,等等。这种应用常常要求可以高效适应主机设备的特征的可移植的独立于平台的软件,所述主机设备包括具有显著软件行为限制(诸如可执行存储器写入限制)的主机设备。
计算机代码在主机设备(诸如移动设备或台式计算机)上的动态或自动生成可以使得对计算机程序的快速调整能够满足给定实现的潜在变化的需求。动态代码生成可以特别适于解释性编程语言和关联的解释性应用或程序,其中应用不是在执行之前首先被完全编译。在这种情况下,软件解释器或即时编译器可以在应用运行时期间处理计算机代码。
但是,利用动态代码生成的软件常常不能被移植到不允许可执行存储器的写入的计算环境和关联的操作系统,即,仅支持不可变的可执行代码的计算环境。具有限制可执行代码修改的操作系统(或其它特征)的计算设备表示表现出不可变的计算环境的受限的平台。类似地,限制可执行存储器的写入的操作系统可被称为受限的或受约束的操作系统。
按照惯例,为了克服这种限制并由此使动态解释性程序能够在不可变的环境(例如,表现出受约束的操作系统)中运行,程序通常必须与远程服务器交互。例如,程序可以由与目标设备通信的远程服务器执行。
但是,使用远程服务器来实现动态或自适应代码生成会是极其缓慢并低效的。此外,这种方法可能需要对潜在耗时的交叉编译的昂贵支持,以考虑定义或表征运行时计算环境的不同目标平台特性,诸如中央处理单元(CPU)特征、操作系统字节序(endiannes),等等。
发明内容
一种示例方法促进调整在可执行存储器的写入受限的计算环境中运行的计算机代码。该示例方法包括利用虚拟机从软件代码生成第一可执行映像,以及采用该第一可执行映像来选择性地修改虚拟机和第一可执行映像,从而产生更新的虚拟机和第二可执行映像,其中第二可执行映像表示第一可执行映像的更新版本。
在更具体的实施例中,第一可执行映像在存储器中被选择性地高速缓存。虚拟机的解释器和/或即时(JIT)编译器促进利用修改来更新第一可执行映像。第一可执行映像经由JIT编译器被选择性地运行,以促进生成第二可执行映像。因此,可以通过采用该可执行映像的先前版本递归地更新可执行映像来生成更新的可执行映像。
虚拟机的解释器或JIT编译器可以包括适于生成修改代码、然后将修改代码存储在汇编器文件中的代码生成器。具体的示例方法还可以包括采用汇编器文件生成表示修改代码的可执行库。编译链可以采用汇编器文件来促进生成可执行库。
虚拟机可以经由包括JIT编译器的修改的HotSpot(即,Java HotSpot性能引擎)虚拟机来实现。第二可执行映像(即,修改的映像)可以在也被称为主机平台或目标平台的目标设备上动态生成。修改的映像可以在其生成期间基于目标设备的一个或多个特性(诸如中央处理单元(CPU)特征)被调整。这种特性可以是在被用来动态生成计算机代码的代码生成器的初始化期间可发现的。其它特性可经由JIT编译器中的剖析器(profiler)获得。
因此,本文所讨论的实施例提供了用于促进将动态产生的计算机代码(诸如机器代码)变换为一个或多个可执行映像的各种特征和方法,其中可执行映像可以在以其它方式限制可执行计算机代码(例如可执行文件)的修改的本地设备和关联的环境中运行。在系统上维护的具有防止可执行文件的修改(诸如通过自修改)的保障措施的可执行文件在本文中被称为不可变的可执行映像,或简称为不可变的映像。
相应地,本文所讨论的某些实施例使得在目标设备上生成的动态生成的代码能够被修补。常规的解决方案缺乏有效的机制在受约束的计算环境中对动态生成的代码进行修补。此外,常规的解决方案不能自动使用动态信息,因为代码需要在不同的平台(诸如服务器主机)上生成。
对于现有的动态解决方案不能以其它方式无缝地应用的计算环境,本文讨论的某些实施例通过修改现有的动态解决方案(例如HotSpot解释器)可容易地实现。
本文所公开的特定实施例的本质和优点的进一步理解可以通过参照说明书和附图的其余部分来实现。
附图说明
图1是示出第一示例性系统的图,该系统使得动态产生的可修补本地指令能够变换成不可变的可执行映像。
图2是适于供图1的示例系统使用的第一示例方法的流程图。
图3是第二示例性系统的图,示出了在不可变的计算环境中用于递归地更新可执行映像的方法中所采用的关键功能块。
图4是适于供图1-4的实施例使用的第二示例方法的流程图。
具体实施方式
本文所讨论的各种示例系统和方法可以促进修改现有的动态计算解决方案,供在以其它方式先前不适合的计算环境中使用。
某些操作系统,诸如(来自公司)禁止可执行存储器可写入。相应地,在这种计算环境中的可执行代码被说成是不可变的。但是,只支持不可变的代码的计算环境和伴随的操作系统可能与基于动态代码生成和/或修补操作的常规高效方法不兼容,其中动态代码生成和/或修补操作可被用于运行经由解释性编程语言编写的软件。
为了克服这些问题,本文所讨论的某些实施例适于利用现有的动态代码生成器(例如,在HotSpot性能引擎中,也简单地称为HotSpotTM),选择性地修改它们,以生成在关联的软件应用的后续运行中有用的、更新的、或在其它方面不同的代码,由此有效地实现被用来运行该软件的可执行代码的修改。
图1示出了示例系统10,其适于在限制可执行映像的修改的(例如,计算设备的)计算环境中促进运行动态生成的可执行代码22。众所周知的部件和/或过程(无论是硬件还是软件,诸如硬盘驱动器、处理器、操作系统、电源、类加载器等等)可能没有在图或文字中示出或讨论。应当指出,在图1中示为12-44的各个模块可以与所示出的不同地组合和/或互连。模块可以与其它模块组合、被省略或修改。另外的模块可被添加。模块可以用不同的名称称呼,并且进行其它变化,并且仍然提供适于本文所描述的实施例的系统。
示例系统10可以在计算环境中运行,所述计算环境例如包括设备和伴随的受约束或不可变的操作系统,诸如iOS。系统10接收源代码12,例如Java代码,Java代码经由字节代码编译器14被转换成字节代码。结果所得的字节代码被转发到虚拟机16,诸如修改的HotSpot虚拟机。
示例虚拟机16包括具有即时(JIT)编译器20的解释器18。JIT编译器20包括适于促进生成可执行映像22的各种模块24-34,其中映像22可以连同JIT编译器20本身一起被更新。所产生的充当本地代码(例如,为系统10在其上运行的设备或者在该设备上产生或生成的机器代码)的可执行映像22可以包括更新的解释器代码38连同HotSpot代码40。然后,可执行映像22可被用来生成其自身的更新,等等。
示例JIT编译器20包括中间表示和优化模块24,该模块采用来自字节代码编译器14的字节代码以生成被转发到代码生成器28(其包括汇编器30)的中间代码表示,用于生成修改的所生成代码32。然后,变换器34促进将修改的代码32变换成可执行映像22。
剖析器26可以监视解释器18中的各个模块,以促进确定频繁使用的代码或者在其它方面适于包括在可执行映像22中的代码,可执行映像22可以在本地存储器中被高速缓存。
可执行映像22可以经由运行时引擎42被运行。虚拟机16的各个模块可以与一个或多个控制器(诸如控制器44)通信,以促进其间的通信和接口来满足给定实现的需求。
应当指出,在本示例实施例中,代码仍然是在目标设备上动态生成的(即使由于执行约束而使它不能立即被使用)。这允许对那个设备自动优化代码,利用例如实际的CPU特征(当代码生成器28被初始化时所发现的)或者在设备上运行应用时所收集的剖析信息。
在特定的实施例中,示例系统10实现迭代过程。先前生成的解释器可被用来开始Java应用在设备上的执行并产生对应的JIT代码36(而不立即使用该JIT代码)。新映像22将既包含JIT代码36又包含解释器38的新版本。更一般地,通过在设备上的先前执行所产生的映像被设备上的新运行用来创建新的改进的映像。
示例系统10可以使用已经在HotSpot中的动态代码生成器,修改它们以生成稍微不同的代码(即,迭代更新的代码),该代码随后被保存并变换成在应用将来运行时可使用的可执行代码。系统10还可以利用在HotSpot中存在的重定位和修补机构,修改它们以实现对稍微不同的代码的修补,例如修补迭代更新。
本地JIT代码36是基于其有效中央处理单元(CPU)特征在实际的目标设备上生成的。这还允许HotSpot JIT被原样使用,从而令剖析器26确定如何优化执行,例如,通过检测被频繁使用的代码部分并且将代码编译到HotSpot 40中。当前保存的格式可以经由(例如,汇编器30的)一个或多个汇编器文件被存储,其中汇编器文件可以直接或经由编译链被转换成本地可执行库。
实施例提供动态代码程序在HotSpot中高效运行。实施例可以利用HotSpot执行特征来促进生成在不可变的计算环境中可用的可执行映像。
或者因为用例(在若干过程之间共享的代码)或者因为执行上下文(不允许应用程序使用既可执行又可写入的存储器的操作系统),系统10促进实现用于将使用动态代码生成(像HotSpot解释器和即时编译器)的应用变换成可以在动态代码生成或修补不合适时使用的某物的方法。
图2是适于供图1的设备和系统10使用的示例方法50的流程图。示例方法50适于促进运行动态代码程序。为了本讨论的目的,动态代码程序可以是适于在被称为本地设备的设备上被编译或以其它方式被解释的任何程序。例如,某些动态代码程序适于经由解释器被解释,并且当由该代码指定的程序运行时被有效地编译。
示例方法包括第一步骤52,该步骤涉及使用虚拟机从软件代码生成第一可执行映像。
第二步骤54包括采用第一可执行映像选择性地修改虚拟机和第一可执行映像,从而产生更新的虚拟机和第二可执行映像,其中第二可执行映像表示第一可执行映像的更新版本。
在不背离本教导的范围的情况下,示例方法50可以被增强或以其它方式被修改。例如,方法50可被修改为指定第一虚拟机包括适于促进生成第二可执行映像的即时(JIT)编译器,其可以包括(可选地更新的)JIT代码。
备选示例方法包括使用虚拟机从软件代码生成第一可执行映像;选择性地高速缓存第一可执行映像;以及采用虚拟机和第一可执行映像利用修改更新第一可执行映像,从而产生第二可执行映像。第一可执行映像可被运行,以促进生成第二可执行映像。
该备选示例方法还可以包括通过采用可执行映像的先前版本递归地更新可执行映像,以生成更新的可执行映像。
困难会在变换某些类型的指令时产生。例如,在原始代码包括位置依赖于代码在哪里加载的寻址或其它引用的情况下,这种地址或其它绝对引用可能需要被修改。有时候,要被变换为用于在不可变的执行环境中执行的原始代码包括自修改代码的指令或操作,并且这种行为需要以不同的方式来实现。为了变换代码以用于不同的计算环境而改变原始代码行为的具体例子的另外的细节以及其它细节可以在上面标识出的美国临时专利申请中找到,该申请通过引用被结合于此。
图3是第二示例系统80的图,示出了在不可变的计算环境70中用于递归地更新可执行映像78的方法中所采用的关键功能块。示例系统80包括与剖析器检测模块72以及重定位和修补机构86通信的递归更新的解释器74。
应当指出,在不背离本教导的范围的情况下,系统80的各个模块的分组可以变化。例如,剖析器检测模块72以及重定位和修补机构86可以被包括在解释器74中,并且,在不背离本教导的范围的情况下,示为包括在解释器74中的某些模块可被包括在解释器74的外部。
此外,为了清晰,各个模块没有在图3中特别示出,诸如间接阵列(indirectionarray)、元数据解析器、宏汇编器、存储器管理器(及关联的垃圾收集堆)、个体C1和C2编译器(包括在HotSpot中的编译器的名称),等等,但是能访问本教导的本领域技术人员可以容易地根据需要为给定的实现确定要实现哪些部件以及如何实现它们,而无需过度实验。此外,本领域技术人员将认识到,在不背离本教导的范围的情况下,图3的系统80可以经由类似于图1所示的系统来实现。
为了本讨论的目的,解释器可以是适于无需首先编译(即,转换成机器语言或本地代码)整个程序就执行计算机程序的指令的任何软件或系统。经由解释性编程语言编写的代码常常在执行过程中根据需要在字节代码被处理之前被转换成字节代码。某些解释器可以经由适于按段(例如,个体字节代码)解释和执行字节代码指令并且顺序执行这些段的虚拟机来实现。虚拟机可以通过处理和执行个体字节代码来实现方法调用。
JIT编译器可以是一类解释器,其选择性地将代码(诸如字节代码)编译成本地语言或机器语言,然后本地语言或机器语言被高速缓存,供将来从高速缓存执行。对应于被频繁使用的(即,热的)过程(即,方法)的计算机代码的段可被高速缓存为本地机器代码以供快速执行,而其它执行得不太频繁的部分可以在解释之前保持为字节代码。剖析方法可以被采用,以确定哪些过程是热的以及哪些不是,以促进确定哪些方法应当被编译为本地代码并高速缓存。某些JIT编译器可以在应用执行期间以及在引起被处理的代码中(将使用机器代码的)对应方法调用前一刻为应用、类库等等生成机器代码。
示例解释器74包括应用执行模块76,该模块可以执行用解释性编程语言(诸如Java)编写的代码。执行引擎76可以被实现为修改的HotSpot执行引擎。代码生成器或产生器90可以监视应用执行,以促进产生新代码,诸如新的可执行映像78。
新的可执行映像78包括所产生的JIT代码82以及解释器的新修改版本84。在JIT代码82的产生期间,元数据(诸如在解释器74的初始化期间发现的CPU信息和在应用执行期间发现的剖析信息)被利用以产生JIT代码82和解释器的新修改版本84。元数据可以基于相对代码偏移量被解析。已知的偏移量可以为解释器74的将来运行保留,如下面更充分讨论的。
可以表示动态生成的代码的新的可执行映像78不要求存储在常规的可执行存储器中。例如,新的可执行映像78可以经由直接生成的本地库和/或经由低层类(例如,汇编器文件的汇编器)保存。此类库或文件可以在可执行映像78的编译期间由剖析器检测模块72的汇编链转换成可执行库。为了本讨论的目的,编译链可以是用来实现JIT编译的计算机代码的任意集合。
为了本讨论的目的,动态生成的代码可以是任何自动产生的代码。自动产生的代码可以由软件基于变化的计算环境上下文或条件来产生。当动态生成的代码(也被简称为动态代码)在目标设备或平台上被自动生成时,动态生成的代码被说成是本地产生的,其中目标设备或平台诸如由计算环境70表示。在本文讨论的各种实现中,动态代码是本地产生的,并且因此,术语“动态代码”和“本地产生的”代码在本文中可以互换使用。
重定位和修补机构86可以表示修改的HotSpot重定位和修补机构,其适于修补新的修改/更新的代码,诸如由解释器74的新修改版本84表示的代码。重定位和修补机构86可以采用本地指令类来促进管理可执行代码以及实现对解释器74的新修改版本84的修补。解释器74的新修改版本84表示在重新加载时可用来代替解释器74的计算机代码,如下面更充分讨论的。
在修补解释器的新修改版本84之后,剖析器检测和编译模块72采用指令重新加载模块88来重新加载解释器74,即,用表示新修改版本84的解释器代替解释器74。因此,指令重新加载模块88适于促进执行与解释器的新修改版本84对应的代码。
剖析器检测和编译模块72还适于检测热方法,即,频繁运行的过程,然后根据需要加载任何修补的或重定位的指令来实现将解释器74的新修改版本84代替解释器74。剖析器检测和编译模块72可以包括编译链,或者可以以其它方式与编译链通信,以促进将解释器的新修改版本84的汇编器文件转换成可用来生成用于运行解释器74的不可变的可执行映像的可执行库。在系统上维护的、具有防止可执行文件修改的保障措施的可执行文件在本文中被称为不可变的可执行映像,或简称为不可变的映像。
相应地,新的可执行映像78表示在目标设备(例如表示计算环境70的智能电话)上动态生成的代码。可以基于CPU特征和在代码生成器90初始化期间发现的其它信息以及在运行应用76时所收集的剖析信息对设备自动优化动态生成的代码78。
总之,系统80采用迭代过程,该过程使用先前生成的解释器74开始在设备上执行Java应用76;产生对应的JIT代码82;以及生成包括解释器74的新版本84的新的可执行映像78。由先前执行所产生的映像可被设备上的新运行用来创建新的改进的映像84。重定位和修补机构86适于修补与解释器74的新修改版本84对应的新代码。相应地,在目标设备上生成的动态代码78可以利用CPU特征、剖析信息等来生成可用作递归地更新的解释器的本地可执行映像。
本实施例的实现可以利用已经在商业虚拟机内的动态代码生成器(诸如HotSpot),修改它们以生成稍微不同的代码,所述稍微不同的代码随后被保存并变换成可执行映像78,该映像在应用76的将来运行时可用。
类似地,商业重定位和修补机构可以被增强,以实现稍微不同的修改代码84的修补。由于本地修改代码78是在实际目标设备上基于其有效CPU特征等等生成的,因此某些商业JIT(诸如HotSpot JIT)几乎可以原样使用。剖析器72可以在运行解释器74的时候确定哪些方法是热的,然后编译它们。结果所得的重新加载的可执行指令将等同于已生成的东西,即,等同于新的可执行映像78。应当指出,用于可执行映像78的保存格式包括可被编译链转换成可执行库的汇编器文件。作为替代,新的可执行映像78可以直接作为本地代码库被生成。
应当指出,所生成的代码(例如由代码生成器90输出的代码)被修改为对在不同上下文(例如,备用过程或将来运行)中的使用有效。按照惯例,当可执行代码被保护为不被写时,嵌在代码中并且在执行期间被动态修改的值和地址将是不可修改的。
为了解决这个问题,可以利用位置信息(诸如值和元数据自变量)调用汇编器类。位置信息被用来生成从可写存储器中的间接阵列读取在特定索引处的值的本地代码。代替读取与由动态代码使用的缺省索引位置关联的值,如果现有索引不可采用,则可以分配新的间接索引。
为了本讨论的目的,间接阵列可以是适于存储对其它对象或机构(例如,类)的引用(例如,名称、容器,等等)的任何编程语言机构(例如,数组、表,等等)或对象。阵列可以在目标平台上的存储器的可写数据段中并且可以容纳对符号信息、数值、字符串指针等等的引用。
对于间接阵列中的每个索引,重定位类型和值被记忆,以实现重用(当可共享时)并促进间接阵列和足够信息的后续保存,以便在将来运行时正确初始化阵列。初始化值可以是例如在用来实现解释器74的JVM中的C++代码的地址或者与新的可执行映像78对应的所生成代码中的其它地址。这种初始化值在保存格式(例如,汇编器文件)方面可以由在链接时由操作系统或编译链透明解析的符号信息代替。
为了促进修补,代替修补可执行代码,本地指令实现可以辨认间接指令,然后根据需要该从指令中自动提取索引,用于修补在该索引处的条目。
为了确保嵌在代码中的常数值和地址对备用过程或将来运行是正确的,HotSpot代码可以被容易地增强,以根据需要指定新的重定位类型以供间接阵列使用。
为了确保任何懒惰地生成的桩程序(即,直到它们第一次被需要才产生的桩程序,与它们可用时相对)(例如,用于本地方法调用的优化桩程序)不会从生成的代码中缺失,可以对本地方法调用优化用于解释器74的桩程序。代码产生器可以被增强,以便将唯一名称与这些桩程序关联,以实现从保存的可执行代码重新加载桩程序。这可以有助于确保为缺失的桩程序生成的新代码在不支持动态代码的系统上不被激活。
为了本讨论的目的,桩程序可以是用作其它编程语言功能的占位符或代替的代码段。示例桩程序表示声明的类、函数、过程、或向桩程序的位置的调用者返回有效值的其它例程。
为了支持编译的代码,当在本地代码、解释的代码和编译的代码之间切换时,提供强制桩程序。这可以通过确保强制桩程序不是懒惰地生成而是被唯一地命名并在编译时对所有编译的方法生成来进行。
按照惯例,编译器相关的动态桩程序是内联高速缓存(IC)桩程序。这些相对短命的动态修补IC桩程序在过渡期内被使用(例如,为了原子性目的)并定期被丢弃。为了本讨论的目的,内联高速缓存可以是任何技术,由此在计算机程序中的调用点处对例程(例如,方法查找)的先前调用的结果存储在该调用点。内联高速缓存方法可以促进运行时优化,从而通过直接在调用点(call sight)处记住先前方法查找的结果来加速运行时方法绑定。
为了实现本文所讨论的某些实施例,现有的HotSpot逻辑可以被更改,以使用由数据阵列参数化的两个不可变的桩程序。相应地,代替动态分配和修补IC桩程序,数据阵列可以被动态分配和修补。应当指出,利用可修补的数据阵列补充的通用的不可变的桩程序表现得像原始可修补的动态生成的代码。
应当指出,在一般情况下,HotSpot代码生成器(例如,解释器、编译器和桩程序生成器)利用被称为汇编器的低层类来产生可执行代码。代码随后通过本地指令类被管理,以处理代码修补。本领域技术人员将认识到,本文所讨论的涉及对现有HotSpot代码生成器的增强的实施例的实现可以经由对HotSpot代码生成器的低层分层(例如,汇编器类和本地指令类)的调整来实现。
为了确保动态修改的代码序列保持可修补,某些现有的HotSpot方法可以被扩展成将可修补代码与间接阵列中的加索引条目关联。按照惯例,这些现有的HotSpot方法涉及跳转到调用运行时文件以便在第一次运行时执行附加逻辑(例如,类加载、类初始化、字段解析,等等)的额外本地指令。在这些额外的步骤之后,初始跳转代码被优化的指令代替。经解析的常数直接在寄存器中加载或者利用访问存储器的偏移量或地址来解析。能访问本教导的本领域技术人员可以容易地扩展这种现有的HotSpot方法,以将可修补代码与间接阵列中的加索引条目关联,以根据需要满足给定实现的需要。
为了最小化对现有HotSpot代码所需的改变,可以仅当关联的间接条目具有指示它尚未被正确初始化的特定值时才跳转到调用运行时文件的额外本地指令。作为替代,初始化值可被用来迫使使用特定值的指令导致错误。这个错误可以被运行时文件捕获并辨认,由此触发额外的运行时逻辑的执行。在这两种情况下,由运行时文件执行的修补都更新间接值,而不修改代码。
应当指出,在本示例实施例中,用于保存所生成的代码(例如保存图3的新的可执行映像78)以及在将来运行或其它过程中重新加载所生成的代码的机构包括对增量代码生成的支持。此外,示例解释器74适于支持被HotSpot用于正被执行的所生成代码的元数据(例如,指定代码序列类型的元数据、用于该序列的栈、普通对象指针(OOP)映射,等等)。
元数据常常基于相对代码偏移量被解析。在本示例实施例中,本地代码是直接生成的,并且偏移量是已知的以及保留以用于将来运行。为了通过编辑和HotSpot解释器实现本文所讨论的某些实施例,本领域技术人员可以容易地确定哪些元数据经由绝对地址被引用,然后根据需要用相对地址代替绝对地址。
应当指出,每个代码序列(或代码序列的组)与唯一名称关联。该名称允许检索该代码序列(或代码序列的组)的先前生成的版本以及使用检索出的版本而不是新生成的版本。
重映射可被用来支持增量生成。对于每条生成的代码,新生成的代码地址与重新加载的版本(例如,已经在可执行映像中预生成的版本)的地址关联。重新加载的版本被发送回代码产生器(因为新生成的版本不是可执行的)。
当生成跳转到或以其它方式调用重映射的地址的指令时,使用重映射的地址。这有助于确保生成的代码是一致的并且不引用重新加载的映像。这种重映射可以由较低的汇编器层透明地执行。
此外,为了促进运行时执行,所生成的代码和间接阵列(或表)被转储(例如,转储到用于动态存储器分配的JVM存储器堆)。某些间接阵列值可以在链接-编辑时(例如,由编译链或操作系统链接器)自动处理。其它值可以根据新过程中动态分配的地址进行设置。
新过程解析重定位信息以发现哪些索引需要被固定,保存的值足以允许新过程发现用于这些索引的适当值。在本示例实施例中,转储的文件还包括字典,其允许检索与给定名称对应的保存块内的偏移量。
应当指出,某些实施例可以支持经由编译代码高速缓存方法对JIT编译代码的保存,由此编译代码利用包括编译代码的符号版本的符号信息被保存在数据文件中。
在后续执行中,数据文件被例如指令重新加载模块88重新加载。然后,编译器(例如,如由执行引擎76表示的)发现编译的先前结果、将所保存的代码(调用预生成的代码)拷贝到代码堆(即,转储代码),然后在执行重定位时(例如,经由重定位和修补模块86)解析所有的符号引用。
编译器优化可以被关闭,使得所生成的代码较少依赖于上下文信息,诸如假设类已经被初始化的信息。一旦被加载并安装,从高速缓存中加载的方法就等同于新动态生成的方法那样表现。
为了促进处理动态代码,代码堆(例如,由存储器管理器维护的堆,诸如系统80的模块可访问的垃圾收集器)的快照可以连同链接信息一起保存。然后,快照可以被变换成可执行代码,并链接到重建的JVM。当执行新JVM时,链接信息使得能够使用预生成的可执行代码来代替新的代码堆中的代码。
虽然预生成的可执行代码在被使用之前不修改,但是本JVM(用来实现系统80)适于选择预生成的版本,而不是在代码堆中的新代码。后端处理可以自动将简单的加载、存储、调用和其它类型的指令变换成通过读取来自可修补间接阵列的指令目标来启动的指令。
总之,系统80使得动态生成的可执行代码能够在以其它方式限制可执行映像的修改的计算环境中的运行。可执行映像可以根据本教导在不可变的计算环境中被递归更新。因此,系统80使得动态生成的可修补本地指令能够被变换成不可变的可执行映像。
图4是适于供图1-4的实施例使用的第二示例方法100的流程图。方法100促进在限制可执行映像的修改的计算环境中运行动态生成的可执行代码。
第二示例方法100包括初始执行步骤102,该步骤包括开始执行解释性应用(也称为解释性程序),即,适于经由解释器或JIT编译器进行处理的应用。
确定步骤104包括参照平台特性确定要对解释器或JIT编译器进行的一个或多个修改。
后续的生成步骤106包括使用解释器和伴随的代码生成器生成可执行映像,该可执行映像包括已根据在前面确定步骤104中确定的一个或多个修改被修改的解释器的版本。不必立即被运行(即,执行)的所生成的可执行映像可以包括JIT代码连同解释器的新修改版本。
接下来,修补步骤108包括采用重定位和修补机构(该机制可以被包括在解释器中),以修补关于解释器的新修改版本的代码。为了本讨论的目的,重定位和修补机构可以是适于促进调整对部分计算机代码(例如,编程语言类)的引用和/或代替或插入被其它计算机代码调用的部分计算机代码的任何计算机代码。本领域技术人员可以容易地增强或以其它方式修改JIT重定位和修补机构,以实现对修改的解释器代码的修补,以供根据本教导的实施例使用。
后续的重新加载步骤110包括采用修补的代码来促进用新修改的解释器重新加载解释器,从而产生解释器的新修改版本的执行。剖析器(诸如HotSpot JVM(Java虚拟机)剖析器)可以容易地被调整,以促进例如经由动态重新编译将解释器重新加载为更新的解释器。
除非发生断开(诸如由关断目标设备和/或底层软件所引起的断开),如在示例断开-检查步骤112中确定的,否则步骤102-110重复。
在不背离本教导的范围的情况下,方法100是说明性的并且可以变化。例如,在不背离本教导的范围的情况下,可以添加另外的步骤,并且某些步骤可以被省略或重新排列。
虽然已经关于其特定实施例描述了本说明书,但这些特定实施例仅仅是说明性的,而不是限制性的。例如,虽然本发明的实施例可以关于特定的操作系统或环境(诸如iOS)和语言(诸如Java)来描述,但是实施例的各个特征或方面可以根据期望在其它计算环境和语言中使用或被调整以在其中使用。对iOS和Java的引用仅仅是说明性的例子。虽然动态代码生成器是为了产生要变换的原始代码而描述的,但是用于生成原始代码的任何其它合适方法都可以适用于本发明的实施例。
此外,虽然某些实施例是参照解释器的动态更新讨论的,但是实施例不限于此。在不背离本教导的范围的情况下,本文所讨论的某些方法可以适于供用于与JVM的不同实例共享编译代码的提前编译器和系统使用。
任何合适的编程语言都可被用来实现特定实施例的例程,所述编程语言包括C、C++、Java、汇编语言等。可以采用不同的编程技术,诸如过程式的或者面向对象的。例程可以在单个处理设备上或者多个处理器上执行。虽然步骤、操作或者计算可以按具体的次序给出,但是这个次序在不同的特定实施例中可以变化。在一些特定的实施例中,在本说明书顺序示出的多个步骤可以同时执行。
特定的实施例可以在由指令执行系统、装置、系统或设备使用或者与其结合使用的计算机可读存储介质中实现。特定的实施例可以按控制逻辑的形式在软件或硬件或者这两者的组合中实现。当被一个或多个处理器执行时,控制逻辑可以操作以执行在特定实施例中所描述的方法。
特定的实施例可以通过使用编程的通用数字计算机、通过使用专用集成电路、可编程逻辑器件、现场可编程门阵列、光、化学、生物、量子或纳米系统、部件和机构来实现。一般而言,特定实施例的功能可以由本领域中已知的任何方式实现。可以使用分布式、联网的系统、部件和/或电路。数据的通信或传输可以是有线的、无线的或者通过任何其它方式。
还应当认识到,根据对特定应用有用而言,附图中绘出的一个或多个元素还可以按更分离或更集成的方式实现,或者甚至在某些情况下被除去或者使其不可操作。实现可以存储在机器可读介质中的程序或代码以便允许计算机执行上述任何方法也在所述精神与范围内。
如在本文描述中和贯穿以下权利要求所使用的,除非上下文明确地另外指明,否则“a”和“an”以及“该”也包括复数引用。而且,如在本文描述中和贯穿以下权利要求所使用的,除非上下文明确地另外指明,否则“在…中”的意义包括“在…中”和“在…上”。
因此,虽然本文已经描述了特定实施例,但是在上述公开内容中预期修改、各种变化和替换的自由度,而且应当认识到,在不背离所述范围与精神的情况下,在一些情况下,特定实施例的某些特征将在没有其它特征的对应使用的情况下采用。因此,可以进行许多修改,使特定的情形或材料适应基本范围与精神。

Claims (19)

1.一种用于在执行上下文中运行动态代码程序的方法,所述执行上下文不允许应用使用既可执行又可写入的存储器,由计算机系统执行的该方法包括以下动作:
执行虚拟机以从应用的软件代码生成第一可执行映像中的第一可执行代码,其中虚拟机包括优化功能,该优化功能分析第一可执行映像的执行以高速缓存频繁使用的可执行代码、以及修改可执行代码以用于在计算机系统上高效执行;
利用虚拟机在第一可执行代码被执行时分析和修改第一可执行代码,以生成第一修改的可执行代码;
由计算机系统存储所述第一修改的可执行代码作为第二映像;
将第二映像变换为第二可执行映像,第二可执行映像能够由计算机系统执行以运行所述应用;
利用虚拟机在第二可执行映像被执行时分析和修改第二可执行映像,以运行所述应用来生成第二修改的可执行代码;
由计算机系统存储第二修改的可执行代码作为第三映像;以及
将第三映像变换为第三可执行映像,第三可执行映像能够由计算机系统执行以运行所述应用。
2.如权利要求1所述的方法,其中虚拟机包括适于促进生成第二可执行映像的即时JIT编译器。
3.如权利要求1所述的方法,所述变换还包括:
在所述应用的将来运行中重新加载第二可执行映像。
4.如权利要求3所述的方法,还包括选择性地运行第一可执行映像,以促进生成第二可执行映像。
5.如权利要求3所述的方法,其中所述应用的软件代码包括字节代码。
6.如权利要求5所述的方法,其中虚拟机包括解释器,并且其中第一可执行映像存储解释器的可执行代码。
7.如权利要求6所述的方法,其中解释器包括适于生成修改的可执行代码的代码生成器。
8.如权利要求7所述的方法,还包括:
在汇编器文件中存储修改的可执行代码。
9.如权利要求8所述的方法,还包括:
采用汇编器文件来促进生成表示修改的可执行代码的可执行库。
10.如权利要求9所述的方法,还包括:
采用编译链和汇编器文件来促进生成可执行库。
11.如权利要求6所述的方法,其中所述解释器是HotSpot解释器。
12.如权利要求11所述的方法,其中HotSpot解释器包括即时JIT编译器。
13.如权利要求1所述的方法,还包括在目标设备上动态生成包括在第二可执行映像中的可执行代码。
14.如权利要求13所述的方法,还包括在动态生成的可执行代码的生成期间基于目标设备的一个或多个特性调整动态生成的可执行代码。
15.如权利要求14所述的方法,其中所述一个或多个特性包括目标设备的中央处理单元CPU的特性。
16.如权利要求15所述的方法,还包括在用来动态生成可执行代码的代码生成器的初始化期间发现所述一个或多个特性或关于所述一个或多个特性的信息。
17.如权利要求14所述的方法,其中所述一个或多个特性包括来自剖析器的信息。
18.一种用于在执行上下文中运行动态代码程序的装置,所述执行上下文不允许应用使用既可执行又可写入的存储器,所述装置包括:
一个或多个处理器;
非暂态处理器可读存储设备,包括能够由所述一个或多个处理器执行的指令以用于进行以下操作:
执行虚拟机以从应用的软件代码生成第一可执行映像中的第一可执行代码,其中虚拟机包括优化功能,该优化功能分析第一可执行映像的执行以高速缓存频繁使用的可执行代码、以及修改可执行代码以用于在计算机系统上高效执行;
利用虚拟机在第一可执行代码被执行时分析和修改第一可执行代码,以生成第一修改的可执行代码;
由计算机系统存储所述第一修改的可执行代码作为第二映像;
将第二映像变换为第二可执行映像,第二可执行映像能够由计算机系统执行以运行所述应用;
利用虚拟机在第二可执行映像被执行时分析和修改第二可执行映像,以运行所述应用来生成第二修改的可执行代码;
由计算机系统存储第二修改的可执行代码作为第三映像;以及
将第三映像变换为第三可执行映像,第三可执行映像能够由计算机系统执行以运行所述应用。
19.一种非暂态处理器可读存储设备,包括能够由一个或多个处理器执行的指令以用于在执行上下文中运行动态代码程序,所述执行上下文不允许应用使用既可执行又可写入的存储器,所述非暂态处理器可读存储设备包括用于进行以下操作的指令:
执行虚拟机以从应用的软件代码生成第一可执行映像中的第一可执行代码,其中虚拟机包括优化功能,该优化功能分析第一可执行映像的执行以高速缓存频繁使用的可执行代码、以及修改可执行代码以用于在计算机系统上高效执行;
利用虚拟机在第一可执行代码被执行时分析和修改第一可执行代码,以生成第一修改的可执行代码;
由计算机系统存储所述第一修改的可执行代码作为第二映像;
将第二映像变换为第二可执行映像,第二可执行映像能够由计算机系统执行以运行所述应用;
利用虚拟机在第二可执行映像被执行时分析和修改第二可执行映像,以运行所述应用来生成第二修改的可执行代码;
由计算机系统存储第二修改的可执行代码作为第三映像;以及
将第三映像变换为第三可执行映像,第三可执行映像能够由计算机系统执行以运行所述应用。
CN201480068934.7A 2013-12-20 2014-05-01 用于在执行上下文中运行动态代码程序的方法和装置 Active CN105830023B (zh)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
US201361919654P 2013-12-20 2013-12-20
US61/919,654 2013-12-20
US14/220,119 US9519466B2 (en) 2013-12-20 2014-03-19 Executable code for constrained computing environments
US14/220,119 2014-03-19
PCT/US2014/036396 WO2015094398A1 (en) 2013-12-20 2014-05-01 Executable code for constrained computing environments

Publications (2)

Publication Number Publication Date
CN105830023A CN105830023A (zh) 2016-08-03
CN105830023B true CN105830023B (zh) 2019-12-13

Family

ID=53400096

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201480068934.7A Active CN105830023B (zh) 2013-12-20 2014-05-01 用于在执行上下文中运行动态代码程序的方法和装置

Country Status (4)

Country Link
US (1) US9519466B2 (zh)
EP (1) EP3084596B1 (zh)
CN (1) CN105830023B (zh)
WO (1) WO2015094398A1 (zh)

Families Citing this family (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP5987501B2 (ja) * 2012-06-29 2016-09-07 富士通株式会社 分岐アドレス管理プログラム、方法、及び装置
US9110680B1 (en) * 2013-03-14 2015-08-18 Amazon Technologies, Inc. Avoiding or deferring data copies
US9529628B2 (en) 2014-03-21 2016-12-27 Vmware, Inc. Binary editing of applications executed by virtual machines
CN105511942B (zh) * 2015-12-02 2019-02-19 华为技术有限公司 语言虚拟机中热点中间代码的识别方法以及装置
JP7030426B2 (ja) * 2017-05-31 2022-03-07 キヤノン株式会社 画像形成装置及びその制御方法、並びにプログラム
US10331425B2 (en) * 2017-06-28 2019-06-25 Google Llc Automated source code adaption to inject features between platform versions
CN108415719B (zh) * 2018-03-29 2019-03-19 网易(杭州)网络有限公司 代码热更新方法和装置、存储介质、处理器及终端
US11762642B2 (en) 2018-04-29 2023-09-19 Meetingquality Pty. Ltd. Meeting survey system
US10747508B2 (en) * 2018-12-31 2020-08-18 Rockwell Automation Technologies, Inc. Function block framework generation
US10838750B2 (en) * 2019-01-10 2020-11-17 Red Hat, Inc. Combining ahead-of-time compilation and just-in-time compilation to improve application deployment
WO2021021126A1 (en) 2019-07-30 2021-02-04 Hewlett-Packard Development Company, L.P. Hash map of executable control blocks
US11182149B2 (en) 2019-09-30 2021-11-23 International Business Machines Corporation Just-in-time code patching
CN113010172B (zh) * 2019-12-18 2023-08-29 Oppo广东移动通信有限公司 配置文件的处理方法、装置、系统及存储介质
US11714657B2 (en) 2020-08-21 2023-08-01 Red Hat, Inc. Self optimizing application
CN111815310B (zh) * 2020-08-31 2021-08-17 支付宝(杭州)信息技术有限公司 一种执行智能合约的方法、区块链节点和存储介质
US11954510B2 (en) 2020-12-22 2024-04-09 Red Hat, Inc. Native-image in-memory cache for containerized ahead-of-time applications
CN113516557B (zh) * 2021-07-14 2022-09-23 桂林电子科技大学 一种有向无环图结构的区块链及其实现方法
US11809839B2 (en) 2022-01-18 2023-11-07 Robert Lyden Computer language and code for application development and electronic and optical communication

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1346465A (zh) * 1999-02-02 2002-04-24 太阳微电子公司 基于标记的链接
CN101093533A (zh) * 2006-06-19 2007-12-26 惠普开发有限公司 发现受许可证约束的软件代码
CN102609279A (zh) * 2010-12-27 2012-07-25 微软公司 在受限应用执行环境中的应用执行
CN102855179A (zh) * 2011-06-30 2013-01-02 国际商业机器公司 虚拟机环境下的程序调试方法和系统
CN103329093A (zh) * 2011-01-19 2013-09-25 国际商业机器公司 更新软件

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6112025A (en) 1996-03-25 2000-08-29 Sun Microsystems, Inc. System and method for dynamic program linking
US6272677B1 (en) * 1998-08-28 2001-08-07 International Business Machines Corporation Method and system for automatic detection and distribution of code version updates
US7051323B2 (en) 2002-10-08 2006-05-23 Sun Microsystems, Inc. Method and apparatus for initializing romized system classes at virtual machine build time
US8639787B2 (en) * 2009-06-01 2014-01-28 Oracle International Corporation System and method for creating or reconfiguring a virtual server image for cloud deployment
US8776053B2 (en) * 2009-09-25 2014-07-08 Oracle International Corporation System and method to reconfigure a virtual machine image suitable for cloud deployment
US11347498B2 (en) * 2013-02-26 2022-05-31 Red Hat, Inc. Bytecode modification
US9507718B2 (en) * 2013-04-16 2016-11-29 Facebook, Inc. Intelligent caching
US9411741B2 (en) * 2013-07-29 2016-08-09 Wipro Limited System and method for application level caching
US9478249B2 (en) * 2013-08-30 2016-10-25 Seagate Technology Llc Cache data management for program execution

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1346465A (zh) * 1999-02-02 2002-04-24 太阳微电子公司 基于标记的链接
CN101093533A (zh) * 2006-06-19 2007-12-26 惠普开发有限公司 发现受许可证约束的软件代码
CN102609279A (zh) * 2010-12-27 2012-07-25 微软公司 在受限应用执行环境中的应用执行
CN103329093A (zh) * 2011-01-19 2013-09-25 国际商业机器公司 更新软件
CN102855179A (zh) * 2011-06-30 2013-01-02 国际商业机器公司 虚拟机环境下的程序调试方法和系统

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
A Survey of Adaptive Optimization in Virtual Machines;M. Arnold etc.;《Proceedings or the IEEE》;20050228;第93卷(第2期);第449-466页 *

Also Published As

Publication number Publication date
WO2015094398A1 (en) 2015-06-25
US9519466B2 (en) 2016-12-13
EP3084596B1 (en) 2018-06-20
CN105830023A (zh) 2016-08-03
US20150178054A1 (en) 2015-06-25
EP3084596A1 (en) 2016-10-26

Similar Documents

Publication Publication Date Title
CN105830023B (zh) 用于在执行上下文中运行动态代码程序的方法和装置
CN113872948A (zh) 一种执行智能合约的方法、区块链节点和节点设备
CN107924326B (zh) 对经更新的类型的迁移方法进行覆盖
US20090259999A1 (en) Method and system for applying a patch during application execution
KR20040004551A (ko) 사전 습득된 프로그램 파일들을 생성 및 이용하기 위한방법 및 디바이스
US20080005719A1 (en) Methods, systems, and computer program products for providing a program execution environment
US20050028155A1 (en) Java execution device and Java execution method
JP2012527027A (ja) ランタイム環境を構築するためのシステムおよび方法
US10417024B2 (en) Generating verification metadata and verifying a runtime type based on verification metadata
US20080022265A1 (en) Methods, systems, and computer program products for generating and using object modules
US11573894B2 (en) Tracking garbage collection states of references
US6813762B1 (en) Method for processing program files in a programming language capable of dynamic loading
US10733095B2 (en) Performing garbage collection on an object array using array chunk references
US20060074931A1 (en) Configuring a shared library to accommodate relocatable data in a pervasive device
US11507503B1 (en) Write barrier for remembered set maintenance in generational Z garbage collector
WO2022245749A1 (en) Snapshot at the beginning marking in z garbage collector
WO2022245954A1 (en) Write barrier for remembered set maintenance in generational z garbage collector
US20060288338A1 (en) Offset threaded code
CN116909652A (zh) 一种启动WebAssembly程序的方法、计算机设备及存储介质
WO2022204033A1 (en) Consolidated and concurrent remapping and identification for colorless roots
EP4288866A1 (en) Implementing state-based frame barriers to process colorless roots during concurrent execution
WO2022204040A1 (en) Tracking frame states of call stack frames including colorless roots
WO2022245659A1 (en) Colorless roots implementation in z garbage collector
CN117597671A (zh) Z垃圾收集器中的开始时快照标记

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant