CN113168320A - 用类选择性替换遗留加载模块程序以在java虚拟机中执行 - Google Patents

用类选择性替换遗留加载模块程序以在java虚拟机中执行 Download PDF

Info

Publication number
CN113168320A
CN113168320A CN201980081717.4A CN201980081717A CN113168320A CN 113168320 A CN113168320 A CN 113168320A CN 201980081717 A CN201980081717 A CN 201980081717A CN 113168320 A CN113168320 A CN 113168320A
Authority
CN
China
Prior art keywords
lae
program
jvm
class
java
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.)
Pending
Application number
CN201980081717.4A
Other languages
English (en)
Inventor
J·杰格
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.)
Lz Laboratory Co ltd
Lzlabs GmbH
Original Assignee
Lz Laboratory Co ltd
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 Lz Laboratory Co ltd filed Critical Lz Laboratory Co ltd
Publication of CN113168320A publication Critical patent/CN113168320A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • 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/445Program loading or initiating
    • G06F9/44536Selecting among different versions
    • G06F9/44542Retargetable
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/47Retargetable compilers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/76Adapting program code to run in a different environment; Porting
    • 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/445Program loading or initiating
    • G06F9/44568Immediately runnable code
    • G06F9/44578Preparing or optimising for loading
    • 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/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/449Object-oriented method invocation or resolution
    • 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/45508Runtime interpretation or emulation, e g. emulator loops, bytecode interpretation
    • 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/4552Involving translation to a different instruction set architecture, e.g. just-in-time translation in a JVM
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/52Binary to binary
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/53Decompilation; Disassembly
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/54Link editing before load time

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虚拟机中执行的方法。

Description

用类选择性替换遗留加载模块程序以在JAVA虚拟机中执行
技术领域
本发明涉及用于在具有不同目标体系架构的机器上执行为源体系架构编译的程序的技术和系统。
背景技术
可执行应用(有时也称为程序)是从源代码编译的。计算机系统的限制是给定的可执行应用只能在其编译或组装所针对的操作系统和机器指令集下运行。这是正确的,因为可执行程序针对特定的指令集(即,系统识别并可以执行的指令),具有已知的寄存器集合,并且程序执行输入/输出操作的能力通常参考对已知操作系统的可用调用。例如,如图1a中所示,经编译的应用程序(10)被配置为在包括特定遗留操作系统(20)和遗留硬件平台(30)的特定遗留平台上执行。这种操作系统(20)和硬件平台(30)可以具有不同程度的复杂性。人们还可以将已针对其编译的软件以在其上运行的平台称为“遗留”系统。遗留系统不需要任何特定的年龄。更确切地说,遗留是指经编译的应用已针对其进行编译的系统。为了在实现不同的硬件指令集的非遗留系统中或者在具有不同函数调用的操作系统下运行经编译的应用,诸如系统不包括遗留操作系统、遗留平台或两者,通常必须重新编译应用程序。这个约束限制了经编译的应用程序在异构环境(包括非遗留系统)中操作的能力。
由特定计算机或处理器本机支持的硬件指令构成计算机或处理器的体系架构的一部分。一个平台的处理器或计算机可以具有不同的体系架构,因此与另一个平台上的处理器或计算机相比,允许不同指令的本机执行(native execution)。在大型机环境中,可重定位加载模块通常是指可执行应用的全部或部分,它被编译为运行大型机计算环境。编译器(诸如Cobol编译器)将由一个或多个源代码文件构成的源代码程序翻译成包括一个或多个机器语言程序文件的目标代码。这些目标代码文件,在一些情况下与附加目标文件一起,可以被链接并组装成可执行程序。
加载模块是指可执行计算机程序的全部或部分,通常被准备加载到遗留计算机平台(诸如S/370、S/390或z/OS大型机)的主存储器中。通常,加载模块包括为遗留平台编译的目标代码,可以包括针对相同遗留程序的汇编器代码,其已经由链接编辑器链接以在遗留平台上加载和执行。因为加载模块中的目标代码和/或汇编器代码是为目标遗留平台编译的,所以遗留加载模块通常不能在不同平台上运行。
使遗留加载模块能够在不同平台上运行的一种方法是仿真。例如,可以构建可以包括非遗留操作系统、非遗留硬件或两者兼有的仿真平台来仿真遗留操作系统和硬件,从而向应用提供呈现遗留环境的外观的虚拟容器。仿真的缺点是它常常降低系统性能,并且通常不提供对遗留存储器保护方案的支持。但是,可以通过实现优化的本机应用程序接口(API)以代替操作系统函数调用的仿真来改善系统性能。保护密钥存储器管理可以通过在通过引用整体并入本文的“Protection Key Management and Prefixing in VirtualAddress Space Legacy Emulation System”WO2017/103,651中描述的存储器管理系统来实现。
在使得应用能够在不同硬件平台上运行的另一种方法中,可以使用编译器或交叉编译器来重新编译程序,以便使用新的目标硬件平台的本机硬件指令来表达它。但是,在许多情况下,重新编译源代码是不期望的。重新编译会导致错误、系统性能的改变或系统行为的改变。解决这些问题可能要求更改原始源代码,这会导致代码库碎片化并增加管理复杂性。此外,用于特定应用的源代码可能并不总是可用,这进一步限制了在不同平台上操作给定程序的能力。
反编译器是反转编译器的过程的程序,它将用高级、通常是人类可读的语言编写的计算机程序翻译成机器语言程序。换句话说,反编译器将用机器语言编写的程序作为输入,并将该程序翻译成用高级语言编写的等效程序。反编译器可以被用于创建可以由程序员编辑并随后被重新编译或交叉编译以在具有不同机器体系架构的平台上执行的源代码文件。但是,反编译不会生成与最初生成机器语言代码或目标代码的原始源代码完全相同的源代码。特别地,在使用优化编译器来改善可执行性能的情况下,经常会丢失使用反编译器无法完全恢复的信息。此外,反编译目标代码是复杂的,因为难以将计算机代码与数据分离。不过,反编译已经在算法提取和分析中、在恶意软件检测中找到了应用,并且在有限的程度上用于源代码恢复,目的是将目标代码从一种环境修改或翻译到另一种环境。
反汇编器接收可执行程序作为输入,并将该程序转换成与机器无关的汇编代码表示。汇编语言通常在汇编指令和底层机器指令之间具有一一对应的关系。反汇编的程序可以由汇编器重新组装成可执行程序。
在相互依赖的软件程序的情况下,将代码从一种计算机体系架构转换成另一种计算机体系架构通常会引入改变,这打断了以前可互操作的程序之间的接口。例如,在将例程或函数的地址作为参数传递以允许接收程序调用调用程序中的例程的回调程序的情况下,通过反编译和重新编译到不同目标体系架构的翻译通常会改变地址,并且可以改变地址操作数的尺寸,从而破坏接收程序调用远程例程的能力。在遗留大型机系统中通常使用的EBCDIC格式与较新平台使用的ASCII格式之间转换数据。可以接收经编译的遗留加载模块(诸如为System 390大型机编译的Cobol加载模块)作为输入并且在继续使外部引用可访问的同时生成在64位x86平台上运行的可执行程序作为输出的加载模块编译器已在通过引用整体并入本文的“Load Module Compiler”WO2017/153815中进行了描述。加载模块编译器对新的目标本机环境启用可执行加载模块选择性反编译和重新编译,包括提供正确处理寻址和数据格式化改变的机构。但是,使用加载模块编译器迁移到新计算环境的计算机程序不能利用由新编程环境提供的编程功能。
在加载模块编译器的一个示例中,提供了加载模块反编译器,其可操作以接收先前编译为在32位大型计算机上运行的可重定位加载模块作为输入,并生成被编译为在64位计算机上运行的可执行程序作为输出。通过选择不能自修改并且其数据与指令可以分离的输入可执行程序,因为已知编译器的操作及其设置将数据与指令分离,有可能设计将输入的可执行程序翻译成中间代码表示的反编译器,所述中间代码表示随后可以被编译以在支持不同指令集的处理器上运行。使用Cobol编译器编译的Cobol加载模块就是此类程序的示例。为了保持与原始程序的外部引用地址的其它程序的互操作性,加载模块编译器生成可以潜在地从程序外部引用的地址的索引,并生成结合32位索引位置的输出目标代码来代替那些地址的64位地址。在操作中,运行时环境提供异常处理程序以将32位索引位置翻译成加索引的位置的正确64位存储器地址。在一个实施例中,通过对加载模块进行反编译而生成的中间代码表示是文件或文件的集合,其被结构化为使得Cobol加载模块的每个指令由根据C编程语言的规则的宏表示。然后,加载模块的中间代码表示由加载模块编译器接收,在支持64位指令集的x86平台上操作的遗留应用环境(LAE)中执行。由加载模块编译器调用C编译器将C宏指令翻译成64位X86指令。加载模块编译器将索引结合到输出机器语言程序中,以便可以解析对可执行输出程序的存储器位置的外部引用。加载模块编译器还可以调用操作系统函数的库以将操作系统函数调用翻译成本机X86指令。加载模块编译器将中间代码表示转换成X86机器语言程序,其被组装成可执行文件。
可以构造加载模块编译器来实现不同的指令格式,并在为新的目标平台编译中间表达之前开发不同的中间代码表示。虽然上面描述了x86目标平台,但可以使用不同的硬件体系架构,诸如ARM或其它体系架构。类似地,虽然上面描述了到64位地址空间的翻译,但也可以使用其它地址空间。加载模块编译器的反编译器可以被编写为以多遍或单遍对加载模块进行操作。加载模块可以调用已知的Binder API来获得关于用于对模块进行反编译的Cobol加载模块的信息。可替代地,可以从加载模块本身获得关于被用于对其进行反编译的Cobol加载模块的信息。可以以其它方式获得诸如退出列表、返回码、CSECT信息、重定位字典条目或外部符号目录条目之类的信息以启用加载模块的反编译。加载模块编译器可以包括脚本化的宏的集合,以通过调用编译器和库以生成x86代码来处理中间代码表示和索引。可替代地,经编译的程序可以执行等效的功能。
Java是被开发以促进程序的创建的面向对象的编程语言,其目标是在称为JVM(JVM)的可移植运行时环境中运行。虽然JVM是为各种不同的底层硬件和操作系统平台编写的,但JVM的意图是提供可移植的运行时,以便为一个运行时环境编写的Java程序可以在另一个运行时环境中操作。部分地由于它已根据公共许可证获得许可的事实,Java的采用已经很普遍。用Java编程语言为JVM编写的程序被编译成称为Java字节码的中间表示,而不是特定于本机硬件的指令集。
JVM提供存储器管理特征,包括提供可供JVM内运行的所有线程使用的共享存储器堆,以及分配给JVM中运行的个体线程(individual thread)的私有存储器堆栈,其存储器对于在那个线程外运行的程序是无法访问的。JVM使存储器管理过程自动化,部分原因是通过移除Java应用程序员进行存储器管理的责任而简化了编程。在JVM内的线程中运行的程序可以创建对象,并依靠JVM的隐式存储器分配和解除分配过程为堆栈内的此类对象创建空间。JVM内每线程堆栈空间的分配通常由默认模式下的操作系统设置控制,但可以通过在JVM初始化时设置的动态设置进行调整。
JVM包括可以适于为在JVM中运行的应用定义安全性策略的安全性管理器对象。默认情况下,JVM的安全性策略是许可的,但可以实现策略将某些动作识别为不安全,并且在安全性策略不允许任何动作的情况下,导致JVM抛出SecurityException。
Java本机接口是被设计为允许用Java编程语言编写并在JVM上运行的程序进行调用并由在JVM外运行的程序调用的编程框架,这些程序已被编译为在主机硬件和操作系统上本机运行。图2图示了JVM。通常,JNI被用于允许Java程序访问Java类库中没有的功能,利用以其它语言编写的预先存在的库,或调用为优化Java应用在特定平台上的性能而编写的汇编器例程。因为JVM使用与本机环境不同的数据表示,所以数据表示之间的翻译是个问题。而且,调用JNI方法以访问JVM外的资源的Java程序不可移植,因为它们无法在不能访问此类外部资源的JVM中正确执行。
当Java程序调用本机方法时,JNI为本机方法提供JNIEnv指针、对调用对象或类的引用,以及被调用方方法所需的任何自变量或参数。JNIEnv指针(210)包括对指向JNI接口的可用函数的函数表的引用,并且在图2中示出。JNIEnv的第一个自变量(220)是指向指针表(240)的指针,每个指针指示JNI的接口函数。第二个自变量(230)是对对象或类的引用。JNI函数允许调用程序与本机C/C++程序交互以获得版本信息、对类的操作、对异常的响应、引用对象、数据字段、获得对象标识符、执行调用、访问数据字段、通过Java和C/C++数据类型之间的翻译执行字符串和数组操作、注册方法、监视操作,并获得JVM接口指针。虽然接口可以被用于与用其它语言编写的程序进行通信,但JNI函数并未被编写为与遗留大型机环境交互,诸如可能用于批处理、CICS、IMS、VSAM。当在JVM中运行的程序使用JNI调用外部程序时,它传递JNIEnv指针、jobject指针和由Java方法声明的任何Java自变量。env指针是包含到JVM的接口的结构。它包括与JVM交互和使用Java对象工作所需的所有功能。
通常,通过经由命令行向JVM传递classpath、类名和可选地包括输入参数的字节字符串,实例化JVM并发起Java程序,命令行将字节字符串传递到类的main()子例程。
期望将由Java编程提供的灵活性引入遗留Cobol系统的应用开发人员可以使用面向对象的Cobol重写代码,面向对象的Cobol是Cobol编程语言的修改版本,其引入了定义类、封装的对象、用于类和对象的方法、继承、多态性和方法覆盖的能力,以及创建和管理对象以及在对象上调用方法的能力。通过在Object Cobol运行环境中创建COBOL代理对象,Object Cobol Program可以与Java Object通信。而且,Object Cobol中已编译为继承java接口类的对象可以被封装在Java包装器类中,这使得可以从Java对象调用它们。但是,将遗留Cobol应用迁移到面向对象的Cobol需要重写代码以利用新特征,并重新编译应用。
将Java引入遗留环境的另一种方法是在CICS区域内引入服务器和JVM,并允许CICS程序与CICS区域内的Java程序通信。这种方法的缺点是它需要重写和重新编译CICS程序,以使它们意识到JVM。这种方法的另一个问题是CICS环境不允许将不被视为线程安全的进程导出到JAVA,这进一步限制了用JAVA程序选择性地替换较旧的CICS程序的能力。
期望提供一种环境,该环境通过用可以在虚拟机中运行的Java程序替换个体加载模块或加载模块内的个体可执行程序来允许遗留应用的部分(诸如遗留Cobol应用)的选择性替换而无需或者通过重写或者重新编译遗留代码来修改其它可执行程序或加载模块。这种系统将显著降低与将应用迁移到新环境相关联的业务风险,因为原始代码的部分将保持不变,并且将大大促进可以在较新平台中轻松实现的新特征和能力到遗留应用的引入。在CICS的情况下,启用将未编写为线程安全的较旧程序替换到JVM中也将是有利的。
发明内容
根据一个实施例,本发明提供了一种用于在具有目标体系架构的机器上执行应用的计算机实现的方法,所述应用包括第一加载模块,所述第一加载模块调用用于源体系架构的第二加载模块,所述方法包括:
由加载器加载第一加载模块,所述第一加载模块包括调用LAE中的第二加载模块的目标代码;
由加载器检测第二加载模块中的至少一个CSECT具有相关联的替换Java程序;
由加载器将包括与替换Java程序对应的ENC指令的CSECT插入到LAE的存储器中;
识别指示所述替换Java程序的输入和输出参数的数量和结构的签名类型,并为每个所述替换Java程序在所述存储器区域中插入签名类型标识符;
预配置(provision)JVM;
在所述LAE中执行与所述ENC指令相关联的本机程序,其中所述本机程序:(a)将其线程附加到JVM;(b)将所述替换Java程序的classpath和方法名添加到JVM的存储器;(c)使用JVM中的classpath加载与替换Java程序对应的替换Java程序类;(d)在JVM的存储器中构造签名,所述签名包括根据所述签名类型和适合于所述签名类型的输出参数的存储器分配而结构化的输入参数;(e)调用与所述方法名对应的所述替换Java程序类的方法;以及(d)将自身与所述JVM分离。
根据另外的实施例,其可以与上述方法以及与本说明书的一个另一个或任何其它元素组合,除非明显相互排斥:
所述检测包括通过检查所述第二加载模块的元数据来确定所述第二加载模块已被替换;
所述检测包括由所述加载器执行表查找以确定所述第二加载模块内的个体CSECT是否已被替换;
所述至少一个替换Java程序包括两个或更多个Java程序,并且其中所述加载器将默认入口点写入LAE的所述存储器中;
所述加载器将所述classpath和类名插入到LAE的存储器中;
所述加载器将所述方法名插入到LAE的存储器中;
所述本机程序将接口类加载到所述JVM的堆中,其中所述接口类的私有方法实现到所述LAE的本机接口,并且其中接口类的公共方法允许通过调用所述私有方法中的一个或多个私有方法来访问LAE的资源;
所述替换Java程序类使用所述接口类的公共方法调用所述第一加载模块,所述接口类调用其私有方法中的一个或多个私有方法来访问LAE的资源;
所述替换Java程序类通过使用所述接口类的公共方法来调用LAE中的第三加载模块,所述接口类调用其私有方法中的一个或多个私有方法来访问LAE的资源;
所述本机程序调用接口类的方法以覆写JVM的一个或多个存储器区域;
所述接口类的所述私有方法包括用于以下的函数:写入到LAE日志,发起对在LAE中执行的程序的程序调用,获得或释放存储,打开或关闭文件,设置或清除错误设置,向LAE数据类型的文件放置字符串、字节或其它数据或从中获得字符串、字节或其它数据,从分区的转换到打包的、分组转换到分区的、整数转换到分区的、整数转换到打包的、打包的转换到整数、打包的转换到分区的、ASCII转换到EBCDIC、EBCDIC转换到ASCII数据格式;
所述预配置还包括对JVM启动指令设置锁,由所述本机程序确定JVM没有执行,发起LAE资源管理器,以及在加载所述接口类之后释放锁;
预配置JVM包括在执行时执行第一尝试,确定发生了存储器错误,然后在执行时执行第二尝试;
在执行时执行第一尝试包括使用第一存储器保护密钥并且在执行时执行第二尝试包括使用第二存储器保护密钥;
在执行时执行第一尝试包括使用第一地址并且在执行时执行第二尝试包括使用第二地址;
在执行步骤完成后,检测未捕捉到的异常并且终止而不向LAE提供执行步骤的输出;
所述目标体系架构是与所述源体系架构相同的体系架构;
所述目标体系架构与所述源体系架构不同;
该方法还包括配置安全性管理器以禁止停止和退出操作并禁止加载能够与LAE接口的类;
所述配置安全性管理器的步骤由所述接口类的方法执行;
LAE包括二进制接口,并且其中,在执行所述替换Java类的被调用方法以产生输出完成后,二进制接口调用SDM类的方法以根据签名类型来格式化输出并将输出返回到LAE;
本机程序访问由LAE建立的保护密钥控制的存储器。
根据第二实施例,可独立使用或与任何上述方法结合使用,特别是作为预配置JVM的方式,本发明提供了一种配置JVM以响应LAE中的调用程序的计算机化的方法,所述方法包括:
在JVM启动指令上设置锁;
由调用程序确定JVM没有正在执行;
实例化JVM;
将第一个类加载到所述JVM的堆中;
其中所述第一个类的私有方法实现到所述LAE的本机接口,并且其中第一个类的公共方法允许通过调用所述私有方法中的一个或多个私有方法来访问LAE的资源;
激活安全性管理器,所述安全性管理器被配置为防止加载包括到LAE的本机接口的任何附加类;
释放锁;
将在所述LAE中操作的线程附加到所述JVM;
加载第二个类;以及
由所述线程调用所述第二个类的方法;
其中所述第二个类的所述方法向所述第一个类的公共方法提供存储器密钥和参数以调用遗留程序环境中的遗留程序。
根据另外的实施例,其可以与上述方法以及与本说明书的一个另一个或任何其它元素组合,除非明显相互排斥:
该方法还包括将JVM的标准输出重定向到LAE中的日志;
该方法还包括基于与LAE相关联的设置来设置JVM的隐式诊断和追踪选项;
该方法还包括为JVM设置动态设置;
该方法还包括发起LAE中的资源管理器,所述资源管理器可操作以限制能够响应LAE中的调用程序的JVM的数量。
根据第三实施例,可独立使用或与任何上述方法结合使用,本发明提供了一种用于在共用操作系统上运行的两个运行时环境之间建立安全接口的方法,所述方法包括:
在第一运行时环境中的第一线程中发起第一程序的执行,所述第一程序包括用于在第二运行时系统内的线程中加载和执行第二程序的指令;
在分配给所述第二运行时环境的存储器中存储包括用于与所述第一运行时环境通信的本机接口例程库的第一个类;所述库包含在所述第一个类的私有方法的集合中,其中所述第一个类还包括用于提供对第一运行时环境的资源的访问的公共方法的集合;
在所述第二运行时环境中激活安全性管理器例程,所述安全性管理器例程被配置为禁止加载能够访问所述第一运行时环境而不调用所述第一个类的另外的代码;
将所述第一线程与所述第二运行时环境相关联;
由所述第一程序在所述第二运行时环境中加载第二程序;
由所述第二程序访问所述第一运行时环境中的资源,其中所述访问包括调用所述第一个类的公共方法。
根据另外的实施例,其可以与上述方法以及与本说明书的一个另一个或任何其它元素组合,除非明显相互排斥:
所述第一运行时环境是LAE;
所述第一运行时环境是适于支持加载模块在第二指令体系架构的平台上的执行的LAE,所述加载模块包括被编译用于在第一指令体系架构中执行的目标代码;
第二运行时系统是JVM;
所述关联包括由所述第一程序调用AttachCurrentThread()例程。
根据第四实施例,本发明还提供了一种系统,包括硬件、操作系统和LAE,所述系统可操作以执行被编译用于不同硬件、操作系统或环境的第一程序并执行如任何上述方法。
附图说明
为了更完整地理解本发明的实施例及其特征和优点,现结合附图参考以下描述,其中:
图1a是本领域中已知的在遗留硬件和操作系统平台上运行的软件应用或程序的示意图;
图1b是在遗留应用引擎上执行的遗留应用的示意图,其中调用本机API来执行ENC指令;
图2是本领域中已知的用于指向JNI接口函数的JNI接口指针结构的示意图;
图3是在遗留应用引擎上执行的遗留应用的示意图,其中遗留环境和JVM之间的二进制接口驻留在LAE中;
图4是描绘在JVM或其它环境中构造和加载替换模块的过程的流程图;
图5描绘了经由元素A与图4相关联的示例性签名类型;以及
图6是描绘与二进制接口一起使用的JVM的实例化和配置的流程图。
具体实施方式
在至少一个实施例中,本发明提供了二进制接口,以使得在遗留环境中操作的遗留加载模块能够与在JVM中操作的Java类的方法互操作,而无需重写或重新编译遗留源代码和遗留加载模块。在一个实施例中,可以构成一个或多个完整加载模块或可重定位加载模块内的一个或多个个体程序目标文件的一个或多个程序被替换为一个或多个Java方法,而无需修改包括应用的其它的可执行程序文件或加载模块。LAE识别出一个或多个可执行程序被对应的Java方法替换,并构造调用一个或多个ENC指令的加载模块,以调用在JVM中运行的Java方法。“ENC”或“执行本机命令”指令是目标平台的指令,它不是在仿真中运行,而是使得运行时环境执行本机API以替换原始指令、调用、子例程或程序。
图1b描绘了被设计为启用遗留加载模块(160)的操作的仿真系统,该模块可以是例如可重定位的Cobol加载模块,它被配置为在S/390操作系统下的大型机平台上、在不同的目标平台上操作。在所示示例中,目标平台硬件包括x86计算机(110),并且目标操作系统(120)是Linux。虽然用于用在JVM中运行的Java方法选择性地替换加载模块(160)或此类加载模块(160)内的可执行程序的加载模块和机构在LAE模块(150)中运行的程序的上下文中进行描述,该LAE模块(150)作为用于在不同目标平台上执行遗留工作负载的容器进行操作,但是本发明性技术的用于使得能够用Java选择性地替换遗留程序的方面也可以应用于遗留环境本身,诸如利用程序在遗留平台上运行的LAE中的执行。
如图1b中所描绘的,用于操作被编译为在不同目标环境中的遗留硬件和操作系统环境中运行的加载模块的一种选择是仿真系统。加载模块(160)可以代替地被配置为在LAE(“LAE”)(150)中执行,其作为用于加载模块(160)的容器和执行环境操作。优选地,加载模块(160)被处理为用调用本机API(140)的执行本机命令(“ENC”)调用替换遗留系统调用和其它指令,本机API是为了优化目标平台中的性能而编写的程序。在所示示例中,目标平台的主机OS(120)是Linux,而硬件平台(110)是x86计算机系统。可以使用其它操作系统,诸如Windows、macOS、iOS、Android或其它操作系统,或者也可以使用其它硬件平台,诸如刀片服务器、ARM、RISC或其它计算机平台。在LAE(150)中执行的加载模块(160)可以调用由遗留硬件环境模块(130)提供的遗留硬件功能。在一个实施例中,遗留硬件环境模块(130)包括函数的集合,每个函数与硬件指令对应,以提供与指令集(诸如System/360、ESA/390或z/Architecture大型机指令集)对应的仿真功能。可替代地,可以支持此类指令的选定子集,或者来自多于一个遗留硬件平台的指令的混合支持。在另一个实施例中,对宏指令或其它API调用的支持也可以包括在硬件环境模块(130)中。虽然示出了一个加载模块(160),但是包括一个或多个应用的多个加载模块可以在LAE(150)中运行。此外,一个或多个遗留加载模块(160)可以被加载模块编译的应用(未示出)替换,这些应用作为加载模块编译器的输出而被生成。此类加载模块编译的应用可以在由LAE(150)提供的容器和运行时环境中操作,但通常不会调用遗留硬件环境(130)的函数,因为它们已被修改为直接调用本机硬件(110)函数。可替代地,LAE(150)可以包括在遗留平台上本机运行的运行时环境,在这种情况下可以省略遗留硬件环境(130)和本机API(140)。
存储器管理单元(MMU)的重要功能是防止进程或任务执行存储器中尚未分配给那个进程或任务的指令。尝试执行尚未分配的存储器中的指令导致硬件故障,该故障被操作系统拦截,常常称为分段故障(SEGV),这一般造成进程的终止。
在运行Linux操作系统的实例的x86机器上实现的实施例中,处理器的MMU响应访问这些未分配给程序的用户空间的最低地址处的指令的尝试,并使得Linux操作系统生成调用异常处理程序的SEGV信号。在一个实施例中,异常处理程序被配置为访问32位地址的索引,并将32位地址翻译成由可执行程序使用的对应64位地址。异常处理程序还可以被配置为执行附加的验证,诸如以支持存储器地址的保护密钥管理。可以使用题为“ProtectionKey Management and Prefixing in Virtual Address Space Application”的PCT申请PCT/IB2015/059646中描述的异常处理程序和前缀方案。
图3描绘了在图1b的环境中在本机硬件和操作系统平台上运行的JVM,并添加了JVM的实例(370),该实例被配置为操作已被编写为或者替换一个或多个加载模块(260)或者替换包含在加载模块(360)中的一个或多个可执行程序的Java类(380)。如图所示,加载模块(360)在LAE(350)中操作,并且在操作中可以调用由遗留硬件环境模块(330)提供的遗留硬件功能,或者由调用本机API(340)的ENC指令调用的系统和其它调用。图3的示例性系统在主机OS(320)上运行,该OS优选地是Linux,并且不同于遗留加载模块旨在为其执行的遗留环境的遗留操作系统(诸如S/390)。而且,图3的示例性系统在x86服务器平台上操作,其体系架构和本机指令不同于遗留加载模块旨在在其上执行的硬件平台。图3中还描绘了二进制JVM接口(355),它允许在LAE(350)中操作的遗留加载模块(360)或遗留编译的加载模块的程序调用在JVM(370)中运行的Java代码或响应来自在JVM(370)中运行的Java代码的调用。
在一个实施例中,遗留硬件环境模块(330)、本机API(340)、LAE(350)、二进制JVM接口(355)和JVM(370)在基于云的部署中部署在Docker容器中。基于云的部署可以允许提供系统所需的计算机资源(诸如服务器容量和网络存储)。优选地,本机API(340)是通过具有可切换设置的编译程序来实现的,这些设置被设计为优化性能,这取决于它们被编译为在x86平台还是ARM平台上执行。在另一个实施例中,堆栈部署在x86服务器硬件(310)上并在作为主机OS(320)的Linux下运行。
图4描绘了系统(诸如图3中描绘的系统)的各方面的操作。当在LAE(350)中操作的程序依赖于另一个加载模块时,系统加载器检查程序及其元数据,如步骤(405)中所描绘的。在一个实施例中,其可执行程序代码已被Java替换的加载模块包括两字节标识符,其指示加载模块是遗留加载模块的替换。也可以采用其它类型的标识符,或者使用位于加载模块之外的数据结构或对象,或者向加载器发信号通知特定加载模块的修改后的状态的其它类型。在步骤(410)中,加载器确定加载模块是否是其可执行代码未被Java或其它代码替换的常规遗留模块。在常规加载模块的情况下,加载器接下来确定它是否旨在在24位、31位或64位地址空间步骤中运行(412),并建立适当的存储来接收加载模块。为了允许加载模块内的个体CSECT可能已经被替换的可能性,在一个实施例中,加载器在步骤(414)执行表查找以确定这种替换是否已经发生。接下来,如果CSECT尚未被替换,那么基于加载模块中的元数据,加载器将程序加载到存储器中(420)。如果CSECT已被替换,那么加载器将查找适当的ENC指令并将其插入加载模块(415)中,在步骤(416)处将classpath、类、方法名和可选的JVM参数和可选的入口点插入与CSECT相关联的存储器中,然后在步骤(417)处识别并插入适当的签名类型。在存在替换加载模块中的单个CSECT的多个Java程序的情况下,优选地插入用于每个这种程序的入口点以启用在相应入口点处的访问。优选地,classpath被提供为统一资源标识符(URI),其使得类能够驻留在JVM可访问的任何地址处。可选地,在用于程序替换的专用ENC指令的情况下,classpath、类名、方法和可选的JVM参数对于由ENC指令调用的本机API将是已知的,并且不需要在步骤(416)处插入。如果加载模块中存在附加CSECTS,那么加载器在步骤(422)处前进到下一个CSECT,并且如果最后一个CSECT已被带入存储器,那么通过将地址常量解析为适当的虚拟地址来执行重定位(425),并将参数传递到加载模块(430)。然后识别存储器位置和入口点(433),以便可以将其传送到调用程序。此时,在加载的情况下,控制不传递到加载模块,而是在步骤(445)处在寄存器零中返回其地址(入口点)。在链接的情况下,程序执行在步骤(447)处开始,如图所示。
在加载器在步骤(410)处检测到加载模块不是常规加载模块的情况下,加载器检查程序元数据以指示替换类型。如果元数据指示Java替换(450),那么根据一个实施例,加载器在LAE(350)内构造被配置为执行一个或多个ENC指令的新的加载模块(455)。在一个实施例中,每个ENC指令包括指示它已经替换的遗留程序的参数,并且单独的ENC指令被用于每个这样的程序。在另一个实施例中,参数的数组指示程序的替换。在构造加载模块时,加载器首先检查程序元数据,确定是应用24位、31位还是64位寻址,并建立适当的存储以插入新的加载模块。然后,在步骤(460)处,加载器在存储器中插入与加载模块相关联的classpath、类名、方法名和任何可选的JVM参数。在使用多个ENC指令的情况下,为第一个类设置默认入口点,以便在调用方未指定应当首先调用哪个ENC指令的情况下,将遵循正确的指令序列。优选地,classpath被提供为统一资源标识符(URI),其使得类能够驻留在JVM可访问的任何地址处。可选地,在将专用ENC指令指派给单个程序替换的情况下,classpath、类名、方法和可选的JVM参数将是由ENC指令调用的本机API已知的,并且不需要在步骤(460)处作为加载替换加载模块过程的一部分被插入。在另一个特别适合于调用频繁的小程序的实施例中,在加载模块内插入替换Java类,并且classpath参数指示该类的内部位置。
因为已替换了遗留程序(诸如遗留加载模块中的可执行Cobol程序)的Java程序必须能够接收已由被替换的Cobol程序处理的参数,并且必须以调用程序期望的格式返回输出,本发明性系统检查从调用程序传递和返回到调用程序的参数的结构,并将参数与签名类型相关联。在一个实施例中,并且在输入和输出参数的特殊结构的情况下,在编写替换程序时确定签名类型。在另一个实施例中,输入和输出参数的结构可以随着调用方的程序而变化,或者如果调用方是汇编器、PL/1、Cobol、Java或其它程序,那么输入和输出参数的结构可以变化,并且可以根据调用方插入不同的签名类型。在另一个实施例中,不是在不同的调用方程序或程序环境的情况下采用不同的签名类型,而是可以采用不同的ENC指令来处理对不同输入/输出数据格式化的需要。无论识别签名类型的方法是什么,在步骤(465)处,加载器都将签名类型标识符插入与加载模块相关联的存储器中。在替换Java程序具有专用ENC指令的情况下,如果签名的识别和插入作为由专用ENC指令调用的本机API的一部分提供,那么可以在步骤(465)处省略签名的识别和插入。在步骤(470)处,如果存在更多的ENC指令,那么加载器针对后续类返回到步骤(460)。加载器接下来在步骤(430)处传递Java替换加载模块的参数,如图所示。
根据一个实施例,签名被实现为与遗留应用的输入和输出参数的典型模式对应的枚举数据类型。使用Java本机接口(JNI)从虚拟机外部调用Java程序的常用方法是提供单个文本字符串来传达字节码输入。采用单个寄存器自变量(例如,寄存器1)或返回单个寄存器值(例如,寄存器15)的遗留程序调用具有对应的签名。呈现16个字节或16个寄存器设置的字节数组的签名也是常见的。在CICS程序调用的情况下,提供多个字符串的签名是典型的。
在批处理程序被替换的情况下,通常会使用签名ASV、ASI、SV和SI。ASV签名在输入参数作为单独的字符串的集合被传递时使用。ASI签名在输入参数作为单独的字符串的集合被传递并且预期返回值位于最初为其创建加载模块的遗留硬件的寄存器15中时使用。SV签名在输入参数作为单个字符串被传递时使用。SI参数在输入参数作为单个字符串被传递并且预期返回值位于最初为其创建加载模块的遗留硬件的寄存器15中时使用。ABV签名在输入参数作为字节数组被传递时使用。ABI签名在输入参数作为字节数组被传递并且预期返回值位于最初为其创建加载模块的遗留硬件的寄存器15中时使用。AIV签名在输入参数作为在入口上(on entry)包含遗留系统寄存器R0..R15的内容的16个整数的数组被传递时使用。AII签名在输入参数作为在入口上包含遗留系统寄存器R0..R15的内容的16个整数的数组被传递并且预期返回值位于最初为其创建加载模块的遗留硬件的寄存器15中时使用。IV签名在输入参数包含遗留系统寄存器R1的内容时被使用。II签名在输入参数包含遗留系统寄存器R1的内容并且预期返回值位于最初为其创建加载模块的遗留硬件的寄存器15中时被使用。PIV签名在输入参数包括在入口上包含标准参数列表的整数数组时被使用,对于该列表,最后一个参数是高位终止。PII签名在输入参数在入口上包含标准参数列表时(最后一个参数是高位终止)并且预期返回值位于最初为其创建加载模块的遗留硬件的寄存器15中时被使用。
传统上,当Cobol应用(诸如用Object Cobol编写的应用)试图使用JVM调用类时,它会通过实例化JVM并通过命令行接口提供类和字符串自变量的名称来实现。这种布置是不灵活的,因为它需要在Object Cobol中重写COBOL应用,并且因为使用公共静态方法voidmain(String[])调用类将调用限制到指定类的main()函数。
如图6中所示,在执行后,ENC指令将调用调用Java程序的本机API。接下来,二进制接口在步骤(610)处检查JVM是否正在运行。如果JVM没有运行,那么在LAE上运行的二进制接口线程通过在发起JVM的指令(615)上获得进程范围的锁(例如,pthread互斥锁)、然后在步骤(618)处检查JVM是否正在运行(因为它可能在获得锁之前已被另一个进程启动)、设置隐式选项(620)并将JVM的标准输出(623)重定向到LAE日志来发起JVM的实例。接下来,在步骤(625)处,二进制接口线程通过禁用安全性管理器中的退出和暂停操作来发起对中止和退出的拦截。隐式选项(620)的示例包括与环境的追踪、诊断或性能相关的设置。例如,在调用程序是在追踪模式下运行的CICS程序的情况下,将期望要配置JVM以执行追踪。优选地,安全性管理器配置有扩展以检查存在和暂停方法,并检查许可、禁止JNI的加载,并限制由除LAE SDM类以外的程序的程序调用。接下来,在步骤(628)处,二进制接口线程识别选项,诸如CICS规范、追踪和日志设置,然后相应地设置动态设置(630)(诸如存储器的量、最大堆栈尺寸、垃圾收集参数)。在系统部署在微服务容器中的情况下,与更通用的基于服务器的部署相比,可以在更小的配置中调整存储器分配和堆栈尺寸。一旦设置被设置,二进制接口线程就实例化JVM(635),并发起LAE资源管理器(640)的执行,以便当LAE停止执行时,LAE资源管理器将终止JVM,清除和释放先前指派给JVM的存储器,并释放与JVM相关联的其它资源。然后,在步骤(645)处,线程将称为LAE SDM类的类加载到JVM的共享堆中,以便JVM中运行的线程可以访问它。
根据优选实施例,LAE SDM类加载JNI接口,该接口优选地由LAE SDM类实现为私有方法的集合。照此,并且鉴于安全性管理器的操作阻止任何其它进程单独加载JNI,一般而言对外部程序的访问以及对在LAE(350)中运行的存储器和程序的访问限于LAE SDM类本身。以这种方式,通过限制在JVM中运行的Java程序访问SDM资源的可用方法,LAE SDM类用作接口类。为了使得能够执行替换程序,或者访问LAE的存储器、程序或其它资源,LAE SDM优选地实现公共方法或函数调用。此类公共函数调用的示例包括打开、关闭、读取或写入遗留数据集、读取或写入日志、执行CICS、IMS、Cobol或PL/1函数、附加附加线程、读取遗留寄存器内容、执行类型转换、激活或停用遗留环境的追踪、操纵遗留环境、获得遗留日期/时间数据、执行遗留等待或发布操作或者获得遗留系统作业ID数据的调用。
LAE SDM类将JVM的标准系统输出和系统错误调用重定向到SDM日志或另一个SDM数据集。LAE SDM类还实例化Java安全性管理器。默认情况下,JVM安全性管理器是许可的。在初始化完成后释放对JVM的控制之前,LAE SDM类配置安全性管理器以防止进程调用暂停或退出,并且可以被配置为限制对外部函数、遗留数据集的访问以及加载其它java类的能力。安全性管理器防止加载可以除了通过SDM自己的方法以外访问LAE(350)的其它类。
上述JNI的实施方式与标准TNI有很大不同,因为它对众多遗留系统功能的支持、它转换数据格式的方法,以及它以允许在JVM中运行的Java程序优雅地对此类错误做出反应的方式与使用保护密钥控制的外部存储器交互并且正确响应遗留系统错误的能力在标准TNI中是找不到的。
在一个实施例中,TNI包括如下函数:写入LAE日志、发起对在LAE中执行的程序的程序调用、获得或释放存储、打开或关闭文件、设置或清除错误设置、向LAE数据类型的文件放置字符串、字节或其它数据或从中获得字符串、字节或其它数据,诸如,从分区的转换成打包的、分组转换成分区的、整数转换成分区的、整数转换成打包的、打包的转换成整数、打包的转换成分区,......列举了TNI的函数。TNI中包括的示例性函数包括:
private static native void lz_log(int level,String message);
private static native int lz_wto(String message);
private static native int lz_mlwto(String[]messages);
private static native int LLE_pgmcall(String epname,int parm,intflags,int dcb,int lang,int type);
private static native int LLE_syncall(int epa,int parm,int flags,intdcb,int lang,int type);
private static native int LLE_storage_obtain(int size,int subpool,intflags);
private static native int LLE_storage_release(int addr,int size,intsubpool,int flags);
private static native long lzfopen(String[]args,int lrecl);
private static native int lzfclose(long file);
private static native int lzfeof(long file);
private static native int lzferror(long file);
private static native void lzclearerr(long file);
private static native int lzfputs(String str,long file);
private static native int lzputs(String str);
private static native String lzfgets(int len,long file);
private static native String lzgets(int len);
private static native byte[]lzfread(int len,long file);
private static native int lzfwrite(byte[]v,int len,long file);
private static native byte[]convert_zoned_to_packed(int packed_len,byte[]zoned,int zoned_len);
private static native byte[]convert_packed_to_zoned(int zoned_len,byte[]packed,int packed_len);
private static native byte[]convert_uint64_to_zoned(int zoned_len,long uint64);
private static native byte[]convert_int64_to_zoned(int zoned_len,longint64);
private static native byte[]convert_uint64_to_packed(int packed_len,long uint64);
private static native byte[]convert_int64_to_packed(int packed_len,long int64);
private static native long convert_zoned_to_uint64(byte[]zoned,intlen);
private static native long convert_zoned_to_int64(byte[]zoned,intlen);
private static native long convert_packed_to_uint64(byte[]packed,intlen);
private static native long convert_packed_to_int64(byte[]packed,intlen);
private static native int LAE_storage_obtain(int size,int subpool,intflags);
private static native int LAE_storage_release(int addr,int size,intsubpool,int flags);
private static native int LAE_rfetch(int r);
private static native void LAE_rstore(int r,int v);
private static native byte LAE_vfetchb(int a);
private static native void LAE_vstoreb(byte v,int a);
private static native short LAE_vfetch2(int a);
private static native void LAE_vstore2(short v,int a);
private static native int LAE_vfetch4(int a);
private static native void LAE_vstore4(int v,int a);
private static native byte[]LAE_vfetchc(int a,int l);
private static native void LAE_vstorec(byte[]v,int a,int l);
根据一个实施例,除了数据自变量之外,诸如lzfopen、lzfclose、各种字符串函数、读取、写入、获取和存储函数之类的执行输入或输出的函数还将数据定义名称、字符串模式和遗留记录格式作为自变量。字符串模式设置指示数据是否从EBCDIC格式转换成ASCII格式、ASCII格式转换成EBCDIC格式,以及是否在小尾数(little endian)和大尾数(big endian)格式之间转换,或者将数据保留为由调用程序呈现的格式。可替代地,可以单独地实现用于执行此类数据格式转换的单独函数。
根据本发明系统的JNI的实施例可以包括对诸如/TEST MFS、
/TES MFS、/TEST MFS NODE LTEM、/FORMAT、/DISPLAY、/START TRAN、/STA PROG、/STA DB、/STOP TRAN、/STO PROG、/STO DB、/DBRECOVERY、/DBR、/RESTART、/END in之类的命令的支持,以启用IMS操作员命令的调用。JNI可以数据库调用(诸如CLSE、DEQ、GU、GHU、GUR、GN、GHN、GNP、GHNP、DLET、REPL、ISRT、FLD、POS)、消息调用(诸如AUTH、GU、GN、ISRT、CHNG、CMD、GCMD、PURG、SETO),以及服务调用(诸如PCB、CHKP、INIT、INQY、ICAL、GMSG、GSCD、ICMD、RCMD、JAVA、LOG、APSB、DPSB、ROLB、ROLL、ROLS、SETS、SETU、SNAP、STAT、SYNC、TERM和XRST)。类似地,JNI可以包括CICS命令接口,包括例如Abend支持、APPC基本和映射对话调用、认证、批处理数据交换、BMS消息传递、BIF、CICS业务事务服务、信道命令、控制台支持、诊断服务(例如,DUMP TRANSACTION、ENTER TRACENUM)、文档服务、环境服务(例如,ADDRESS、ADDRESSSET、ASSIGN)、事件处理、异常支持、文件控制服务、间隔控制服务、日志记录、监视、命名计数器服务器命令,程序控制命令(例如,INVOKE APPLICATION、LINK、LOAD、RELEASE、RETURN、XCTL)、调度服务、安全性服务、存储控制(例如,GETMAIN、FREEMAIN)、SYNCPOINT和SYNCPOINT ROLLBACK、任务控制服务、终端控制、瞬态数据、CICS Web支持命令,以及其它CICS命令接口。类似地,JNI可以包括与VSAM宏指令对应的命令,包括:
int LAE_vsam_get(VADR rpladdr,REGS*regs);
int LAE_vsam_put(VADR rpladdr,REGS*regs);
int LAE_vsam_point(VADR rpladdr,REGS*regs);
int LAE_vsam_endreq(VADR rpladdr,REGS*regs);
int LAE_vsam_erase(VADR rpladdr,REGS*regs);
int LAE_vsam_idalkadd(VADR rpladdr,REGS*regs);
如果JVM正在运行,那么执行步骤(405)的本机API的线程在步骤(655)处使用AttachCurrentThread()调用将自身附加到JVM。使用AttachCurrentThread()调用,本机线程可以将自身附加到虚拟机并获得JNI接口指针。一旦附加,本机线程就像在本机方法中运行的常规Java线程一样操作,并保持附加状态,直到它调用DetachCurrentThread()来分离自己。一旦附加,本机API线程就在步骤(657)处接收classpath、类名、方法、签名类型和参数列表,并将classpath添加到线程堆栈(660),并在步骤(665)中加载类。接下来,在步骤(670)处,二进制接口线程调用SDM类的方法以在线程堆栈中构造适当的签名,将接收到的参数按需插入对象中以使Java替换方法能够像遗留程序会完成的那样访问它们。接下来,在步骤(675)处,二进制接口例程调用在步骤(605)处输入参数列表中指定的方法。
当该方法完成执行时,控制返回到本机API程序,该程序使用签名以调用程序所需的形式对输出进行结构化。
该方法不必是实现Java替换程序的类的main()例程,因为它由与线程相关联的LAE例程而不是从JVM外部调用。该方法对在步骤(670)中构造的签名进行操作,该签名包含由调用程序传递的参数。如以上所讨论的,调用程序可以是被构造为在遗留平台中运行的加载模块、已被适配为在LAE(350)中运行但尚未被编译或以其它方式意识到被调用方程序已替换为Java程序的遗留加载模块。调用程序也可以是在JVM中运行的另一个Java程序。在完成方法的执行后,控制返回到LAE本机API,它使用在步骤670中创建的签名来格式化输出以供返回(670)。
在JVM内运行的Java程序通过调用SDM类中的方法与LAE(350)通信。这些通信可以涉及由WO2017/103,651中描述的保护密钥机构控制的存储器访问,当使用错误的存储密钥或发生其它存储器访问错误时,会产生存储器异常。类似地,通信可以涉及访问遗留程序,这可以产生由于程序加载或执行而可能出现的无数异常中的任何一个。二进制JVM接口将LAE(350)中出现的异常传达给Java程序,因为它们可以由Java程序作为其普通操作的一部分进行处理。在由Java程序的执行完成后,控制权返回到LAE线程,该线程使用签名以调用程序所需的方式对输出进行结构化。然后,在步骤(677)处,LAE将线程与JVM分离。在异常未被Java程序捕捉到的情况下,JVM的异常处理程序可以在步骤(679)处抛出异常,从而产生ABEND。OC4存储器异常被翻译成Java非法访问异常。OC7打包的十进制错误异常被翻译成Java数字格式异常。除以零异常被翻译成Java算术异常。诸如无法启动线程时将出现的通用异常被翻译成非法状态异常。在被调用方法的执行完成后,二进制接口在步骤(680)处调用SDM类的方法以根据签名类型格式化输出,包括进行任何所需的ASCII到EBCDIC和字节序(endianness)转换,并且SDM调用实现JNI的私有方法以将输出返回到LAE中的调用程序。
在CICS应用的情况下,LAE(350)调度线程安全和非线程安全作业以供执行。这是因为,在遗留CICS中,所有应用都在同一个线程中运行并且固有地是序列化的。当CICS开始允许多线程操作时,一些程序被编写为线程安全的,而其它的则不是。传统上,CICS不允许对非线程安全的进程进行Java调用。在非线程安全的CICS程序的情况下,LAE(350)而不是CICS应用设置锁以确保两个非线程安全的CICS应用不会造成非法资源争用或死锁。因为CICS应用的调度是在LAE(350)内控制的,所以CICS加载模块或加载模块内不是线程安全的CICS程序可以由Java程序替换,而不会有JVM内的替换Java程序的操作将产生错误行为的风险。
如图5中所示,如果被替换的加载模块不是Java,那么在步骤(510)处,加载器检查它是否已被Python脚本替换。在Python脚本的情况下,加载器构造加载模块以执行与Python脚本的执行对应的ENC指令,将输入参数放入分配给Python执行的存储器中(520),并且在步骤(525)处LAE(350)执行Python脚本。在完成后,和/或在异常的情况下,LAE在步骤(530)处向调用方发出适当的返回和/或异常。如果替换程序不是Python脚本,加载器在步骤(535)处检查加载模块是否被Rexx EXEC替换,如果是,那么构造加载模块以执行对应的ENC、将参数写入分配给Rexx执行的存储器(545),并执行Rexx EXEC(550)。在完成后,和/或在异常的情况下,LAE在步骤(555)处向调用方发出适当的返回和/或异常。在替换程序不是Rexx EXEC的情况下,在步骤(560)处加载器检查加载模块是否已被C-Shell脚本替换,如果是,那么构建加载模块以执行对应的ENC(565)、将参数写入分配给tsch执行的存储器(570),并执行tsch脚本(575)。在完成后,和/或在异常的情况下,LAE在步骤(580)向调用方发出适当的返回和/或异常。加载器可以被配置为类似地识别遗留加载模块已被其它解释或JIT编译的程序替换,并且可以构造对应的加载模块、用输入参数配置存储器、执行替换程序,并将结果返回到调用程序。在一些实施例中,可以将Python、Rexx、C-shell/tsch或其它脚本的解释的指令插入到加载模块中,并且对应的解释器指向脚本,而不是将脚本包括在实现ENC指令的本机API中。
虽然未示出,但是加载模块可以用多于一个Python、Rexx、C-Shell或其它脚本替换。在那种情况下,系统将创建一个包括多个ENC指令的加载模块,并将在指派给执行对应脚本的存储器中迭代插入对应参数的过程。如在Java示例中一样,系统将或者指派默认的ENC指令序列的入口点以便为替换程序建立隐式默认入口点。在一些实施例中,相同的ENC指令可以被用于实现多个Python、Rexx或C-shell/tsch脚本,并提供标识符作为自变量以将对应的脚本与指令相关联。如果加载器用尽了可用选项,并且没有为加载模块找到对应的替换程序,那么加载器返回并异常。
用于实现LAE(350)、二进制JVM接口(JVM)、遗留硬件环境模块(330)、本机API(340)、Java类(380)、JVM(370)或本发明的其它方面的计算机可读指令可以从硬盘驱动器、软盘、闪存、光盘、磁带库或其它非易失性存储介质或者从多个这样的存储介质加载。硬件平台(310)或其它硬件平台可以包括x86、ARM或其它平台,并且主机OS(320)可以包括Linux、Unix、Windows或其它操作系统。系统可以部署在单个计算机、计算机的网络、计算机的联网的集群上、云部署中或涉及Docker或其它容器技术的微服务部署中。
用于执行本文描述的本发明性系统和方法的指令可以是计算机汇编器指令、用于特定硬件体系架构的指令、机器指令、微代码、固件,以及源代码或目标代码。本专利的图和流程图中描述的过程可以通过在计算机硬件上执行的计算机程序指令来实现,计算机硬件可以是通用计算机、专用计算机或适于执行此类指令的其它数据处理机器。图中描绘的方框或步骤可以由程序片段、函数或模块来实现。程序模块可以包括在各种平台上执行时执行任务的例程、程序代码、逻辑、数据结构、对象、组件。
上面讨论的Java类和对象可以在类的其它布置中实现,并且可以结合子类和子子类以继承或覆盖特性以实现本文描述的行为。对JVM中Java对象的讨论被理解为指计算机程序指令和数据,并且对此类对象或类的公共或私有方法的引用被理解为指在计算机平台中执行的对象(诸如在计算机平台上运行的JVM)中的计算机指令的部分。其它编程语言和虚拟机环境可以与本文描述的本发明的系统和方法一起使用。
元件可以安装在不同的平台上,该平台可以是示例性x86平台,本文描述的系统安装在该平台上。可替代地,在本文描述的本发明的精神内,系统的各个部分可以分布在多个平台上。当使用多于一个平台来安装和操作本发明性系统的不同部分时,不同的平台通过计算机网络耦合,计算机网络可以包括有线、光学或无线局域网、广域网、卫星或其它电信网络。在操作中,系统可以从非易失性存储介质(诸如盘、带、硬盘驱动器、闪存驱动器或其它非易失性存储介质)加载,使得系统的组件的部分或全部同时驻留在组成系统的一个或多个计算机的易失性存储器中。
本文提供了许多示例。在不脱离本发明的精神的情况下可以修改这些示例。本文描述的示例和实施例是作为示例提供的,并且也可以使用其它组件、例程或模块。

Claims (33)

1.一种用于在具有目标体系架构的机器上执行应用的计算机实现的方法,所述应用包括第一加载模块,所述第一加载模块调用用于源体系架构的第二加载模块,所述方法包括:
由加载器加载第一加载模块,所述第一加载模块包括调用遗留应用环境(LAE)中的第二加载模块的目标代码;
由加载器检测第二加载模块中的至少一个CSECT具有相关联的替换Java程序;
由加载器将包括与替换Java程序对应的ENC指令的CSECT插入到LAE的存储器中;
识别指示所述替换Java程序的输入和输出参数的数量和结构的签名类型,并为每个所述替换Java程序在所述存储器区域中插入签名类型标识符;
预配置Java虚拟机(JVM);
在所述LAE中执行与所述ENC指令相关联的本机程序,其中所述本机程序:(a)将其线程附加到JVM;(b)将所述替换Java程序的classpath和方法名添加到JVM的存储器;(c)使用JVM中的classpath加载与替换Java程序对应的替换Java程序类;(d)在JVM的存储器中构造签名,所述签名包括根据所述签名类型和适合于所述签名类型的输出参数的存储器分配而结构化的输入参数;(e)调用与所述方法名对应的所述替换Java程序类的方法;以及(d)将自身与所述JVM分离。
2.如权利要求1所述的方法,其中所述检测包括通过检查所述第二加载模块的元数据来确定所述第二加载模块已被替换。
3.如权利要求1所述的方法,其中所述检测包括由所述加载器执行表查找以确定所述第二加载模块内的个体CSECT是否已被替换。
4.如权利要求1所述的方法,其中所述至少一个替换Java程序包括两个或更多个Java程序,并且其中所述加载器将默认入口点写入LAE的所述存储器中。
5.如权利要求1所述的方法,其中所述加载器将所述classpath和类名插入到LAE的存储器中。
6.如权利要求5所述的方法,其中所述加载器将所述方法名插入到LAE的存储器中。
7.如权利要求1所述的方法,其中所述本机程序将接口类加载到所述JVM的堆中,其中所述接口类的私有方法实现到所述LAE的本机接口,并且其中接口类的公共方法允许通过调用所述私有方法中的一个或多个私有方法来访问LAE的资源。
8.如权利要求7所述的方法,其中所述替换Java程序类使用所述接口类的公共方法调用所述第一加载模块,所述接口类调用其私有方法中的一个或多个私有方法来访问LAE的资源。
9.如权利要求7所述的方法,其中所述替换Java程序类通过使用所述接口类的公共方法来调用LAE中的第三加载模块,所述接口类调用其私有方法中的一个或多个私有方法来访问LAE的资源。
10.如权利要求7所述的方法,其中所述本机程序调用接口类的方法以覆写JVM的一个或多个存储器区域。
11.如权利要求7所述的计算机实现的方法,其中所述接口类的所述私有方法包括用于以下的函数:写入到LAE日志,发起对在LAE中执行的程序的程序调用,获得或释放存储,打开或关闭文件,设置或清除错误设置,向LAE数据类型的文件放置字符串、字节或其它数据或从中获得字符串、字节或其它数据,从分区的转换到打包的、分组转换到分区的、整数转换到分区的、整数转换到打包的、打包的转换到整数、打包的转换到分区的、ASCII转换到EBCDIC、EBCDIC转换到ASCII数据格式。
12.如权利要求7所述的方法,其中所述预配置还包括对JVM启动指令设置锁,由所述本机程序确定JVM没有执行,发起LAE资源管理器,以及在加载所述接口类之后释放锁。
13.如权利要求7所述的方法,其中预配置JVM包括在执行时执行第一尝试,确定发生了存储器错误,然后在执行时执行第二尝试。
14.如权利要求13所述的方法,其中在执行时执行第一尝试包括使用第一存储器保护密钥并且在执行时执行第二尝试包括使用第二存储器保护密钥。
15.如权利要求13所述的方法,其中在执行时执行第一尝试包括使用第一地址并且在执行时执行第二尝试包括使用第二地址。
16.如权利要求13所述的方法,其中,在执行步骤完成后,检测未捕捉到的异常并且终止而不向LAE提供执行步骤的输出。
17.如权利要求1所述的方法,其中所述目标体系架构是与所述源体系架构相同的体系架构。
18.如权利要求1所述的方法,其中所述目标体系架构与所述源体系架构不同。
19.如权利要求1所述的方法,还包括配置安全性管理器以禁止停止和退出操作并禁止加载能够与LAE接口的类。
20.如权利要求19所述的方法,其中所述配置安全性管理器的步骤由所述接口类的方法执行。
21.如权利要求1所述的方法,其中LAE包括二进制接口,并且其中,在执行所述替换Java类的被调用方法以产生输出完成后,二进制接口调用SDM类的方法以根据签名类型来格式化输出并将输出返回到LAE。
22.如权利要求1所述的方法,其中本机程序访问由LAE建立的保护密钥控制的存储器。
23.一种配置java虚拟机(JVM)以响应遗留应用环境(LAE)中的调用程序的计算机化的方法,所述方法包括:
在JVM启动指令上设置锁;
由调用程序确定JVM没有正在执行;
实例化JVM;
将第一个类加载到所述JVM的堆中;
其中所述第一个类的私有方法实现到所述LAE的本机接口,并且其中第一个类的公共方法允许通过调用所述私有方法中的一个或多个私有方法来访问LAE的资源;
激活安全性管理器,所述安全性管理器被配置为防止加载包括到LAE的本机接口的任何附加类;
释放锁;
将在所述LAE中操作的线程附加到所述JVM;
加载第二个类;以及
由所述线程调用所述第二个类的方法;
其中所述第二个类的所述方法向所述第一个类的公共方法提供存储器密钥和参数以调用遗留程序环境中的遗留程序。
24.如权利要求23所述的方法,还包括将JVM的标准输出重定向到LAE中的日志。
25.如权利要求23所述的方法,还包括基于与LAE相关联的设置来设置JVM的隐式诊断和追踪选项。
26.如权利要求23所述的方法,还包括为JVM设置动态设置。
27.如权利要求23所述的方法,还包括发起LAE中的资源管理器,所述资源管理器可操作以限制能够响应LAE中的调用程序的JVM的数量。
28.一种用于在共用操作系统上运行的两个运行时环境之间建立安全接口的方法,所述方法包括:
在第一运行时环境中的第一线程中发起第一程序的执行,所述第一程序包括用于在第二运行时系统内的线程中加载和执行第二程序的指令;
在分配给所述第二运行时环境的存储器中存储包括用于与所述第一运行时环境通信的本机接口例程库的第一个类;所述库包含在所述第一个类的私有方法的集合中,其中所述第一个类还包括用于提供对第一运行时环境的资源的访问的公共方法的集合;
在所述第二运行时环境中激活安全性管理器例程,所述安全性管理器例程被配置为禁止加载能够访问所述第一运行时环境而不调用所述第一个类的另外的代码;
将所述第一线程与所述第二运行时环境相关联;
由所述第一程序在所述第二运行时环境中加载第二程序;
由所述第二程序访问所述第一运行时环境中的资源,其中所述访问包括调用所述第一个类的公共方法。
29.如权利要求28所述的方法,其中所述第一运行时环境是遗留应用环境(LAE)。
30.如权利要求28所述的方法,其中所述第一运行时环境是适于支持加载模块在第二指令体系架构的平台上的执行的LAE,所述加载模块包括被编译用于在第一指令体系架构中执行的目标代码。
31.如权利要求28所述的方法,其中第二运行时系统是JVM。
32.如权利要求31所述的方法,其中所述关联包括由所述第一程序调用AttachCurrentThread()例程。
33.一种系统,包括硬件、操作系统和LAE,所述系统可操作以执行被编译用于不同硬件、操作系统或环境的第一程序并执行如权利要求1-33所述的任何方法。
CN201980081717.4A 2018-11-02 2019-10-24 用类选择性替换遗留加载模块程序以在java虚拟机中执行 Pending CN113168320A (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US201862755230P 2018-11-02 2018-11-02
US62/755,230 2018-11-02
PCT/IB2019/059149 WO2020089750A1 (en) 2018-11-02 2019-10-24 Selective substitution of legacy load module programs with classes for execution in a java virtual machine

Publications (1)

Publication Number Publication Date
CN113168320A true CN113168320A (zh) 2021-07-23

Family

ID=68387374

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201980081717.4A Pending CN113168320A (zh) 2018-11-02 2019-10-24 用类选择性替换遗留加载模块程序以在java虚拟机中执行

Country Status (6)

Country Link
US (1) US20220147376A1 (zh)
EP (1) EP3874366A1 (zh)
CN (1) CN113168320A (zh)
AU (1) AU2019372246A1 (zh)
CA (1) CA3118057A1 (zh)
WO (1) WO2020089750A1 (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116305129A (zh) * 2023-05-16 2023-06-23 北京安天网络安全技术有限公司 一种基于vsto的文档检测方法及装置、设备及介质

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11681508B2 (en) * 2020-08-24 2023-06-20 Cisco Technology, Inc. Source code analysis to map analysis perspectives to events

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CA2266291A1 (en) * 1998-09-03 2000-03-03 Brian J. Sullivan Method and apparatus for cobol to java translation
CN1341238A (zh) * 1999-11-17 2002-03-20 布尔Cp8公司 在配备数据处理资源的多用途平台式系统中加载应用的方法,对应的执行系统和方法
US20030110024A1 (en) * 2001-06-21 2003-06-12 Broussard Scott J. Standardized interface between java virtual machine classes and a host operating environment
US20120042314A1 (en) * 2009-04-09 2012-02-16 Alev Aydin Method and device enabling the execution of heterogeneous transaction components
US20120167067A1 (en) * 2010-12-23 2012-06-28 International Business Machines Corporation Batch dispatch of java native interface calls
US20180232319A1 (en) * 2015-12-15 2018-08-16 Lzlabs Gmbh Protection key management and prefixing in virtual address space legacy emulation system

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
PT3427148T (pt) 2016-03-11 2022-03-23 Lzlabs Gmbh Compilador de módulo de carregamento
JP7057571B2 (ja) * 2017-04-28 2022-04-20 エルゼットラブズ ゲーエムベーハー モノリシックレガシーアプリケーションに基づくマイクロサービスのコンテナ化展開

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CA2266291A1 (en) * 1998-09-03 2000-03-03 Brian J. Sullivan Method and apparatus for cobol to java translation
CN1341238A (zh) * 1999-11-17 2002-03-20 布尔Cp8公司 在配备数据处理资源的多用途平台式系统中加载应用的方法,对应的执行系统和方法
US20030110024A1 (en) * 2001-06-21 2003-06-12 Broussard Scott J. Standardized interface between java virtual machine classes and a host operating environment
US20120042314A1 (en) * 2009-04-09 2012-02-16 Alev Aydin Method and device enabling the execution of heterogeneous transaction components
US20120167067A1 (en) * 2010-12-23 2012-06-28 International Business Machines Corporation Batch dispatch of java native interface calls
US20180232319A1 (en) * 2015-12-15 2018-08-16 Lzlabs Gmbh Protection key management and prefixing in virtual address space legacy emulation system

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116305129A (zh) * 2023-05-16 2023-06-23 北京安天网络安全技术有限公司 一种基于vsto的文档检测方法及装置、设备及介质
CN116305129B (zh) * 2023-05-16 2023-08-15 北京安天网络安全技术有限公司 一种基于vsto的文档检测方法及装置、设备及介质

Also Published As

Publication number Publication date
AU2019372246A1 (en) 2021-05-27
EP3874366A1 (en) 2021-09-08
WO2020089750A1 (en) 2020-05-07
US20220147376A1 (en) 2022-05-12
CA3118057A1 (en) 2020-05-07

Similar Documents

Publication Publication Date Title
US11354144B2 (en) Java native interface and windows universal app hooking
Richter Applied Microsoft. NET framework programming
US9779111B2 (en) Method and system for configuration of virtualized software applications
US9864600B2 (en) Method and system for virtualization of software applications
Richter CLR via C
US6986132B1 (en) Remote incremental program binary compatibility verification using API definitions
US7231635B2 (en) Remote incremental program verification using API definitions
CN107924326B (zh) 对经更新的类型的迁移方法进行覆盖
US9830448B2 (en) Enhanced security for java virtual machines
US20040268301A1 (en) Adding new compiler methods to an integrated development environment
US6834391B2 (en) Method and apparatus for automated native code isolation
US7155703B2 (en) Virtual method protection
US8200938B2 (en) Computer system and method providing a memory buffer for use with native and platform-independent software code
US20150067653A1 (en) Automatic generation of analysis-equivalent application constructs
CN113168320A (zh) 用类选择性替换遗留加载模块程序以在java虚拟机中执行
US7213098B2 (en) Computer system and method providing a memory buffer for use with native and platform-independent software code
US10120777B1 (en) Remediating serialization incompatibilities
US7266804B2 (en) Strategy for selectively making non-public resources of one assembly visible to another
US10394610B2 (en) Managing split packages in a module system
US7526752B1 (en) Introspection support for generic types
Minnich et al. U-root: A Go-based, firmware embeddable root file system with on-demand compilation
US11568047B2 (en) Distinguished nest-based access control
van Rossum Python Setup and Usage
Lee et al. Runtime System
Puder CORBA 2.2 Implementation

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
REG Reference to a national code

Ref country code: HK

Ref legal event code: DE

Ref document number: 40052953

Country of ref document: HK