CN115421875A - 二进制翻译方法及装置 - Google Patents

二进制翻译方法及装置 Download PDF

Info

Publication number
CN115421875A
CN115421875A CN202211326583.8A CN202211326583A CN115421875A CN 115421875 A CN115421875 A CN 115421875A CN 202211326583 A CN202211326583 A CN 202211326583A CN 115421875 A CN115421875 A CN 115421875A
Authority
CN
China
Prior art keywords
instruction
access instruction
set architecture
type
instruction set
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.)
Granted
Application number
CN202211326583.8A
Other languages
English (en)
Other versions
CN115421875B (zh
Inventor
吕蓊鉴
李�根
唐遇星
黄能超
罗昌杰
胡鑫垚
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.)
Phytium Technology Co Ltd
Original Assignee
Phytium Technology 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 Phytium Technology Co Ltd filed Critical Phytium Technology Co Ltd
Priority to CN202211326583.8A priority Critical patent/CN115421875B/zh
Publication of CN115421875A publication Critical patent/CN115421875A/zh
Application granted granted Critical
Publication of CN115421875B publication Critical patent/CN115421875B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

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/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
    • 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/3017Runtime instruction translation, e.g. macros
    • G06F9/30174Runtime instruction translation, e.g. macros for non-native instruction set, e.g. Javabyte, legacy 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/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5016Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory

Landscapes

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

Abstract

本申请提供了一种二进制翻译方法及装置,该方法用于对基于第一指令集架构的目标程序进行二进制翻译,以在基于第二指令集架构的主机上运行目标程序,目标程序包括主程序以及主程序的一个或多个依赖库,主机包括一个或多个依赖库中的至少部分依赖库对应的本地原生库,该方法包括:加载目标程序对应的线程数据,线程数据的TLS内存布局符合第二指令集架构对应的TLS内存布局;对线程数据的访问指令进行二进制翻译,使得翻译后的访问指令与第二指令集架构对应的TLS内存布局相匹配。本申请实施例以主机的TLS内存布局方式加载目标程序对应的线程数据,通过在翻译侧进行处理以正确访问该线程数据,有助于实现跨指令集架构的TLS数据的加载和访问。

Description

二进制翻译方法及装置
技术领域
本申请涉及计算机领域,更为具体的,涉及一种二进制翻译方法及装置。
背景技术
二进制翻译(binary translation)技术可以将基于一种指令集架构的目标程序运行在基于另一种指令集架构的主机上。有些二进制翻译系统需要在内存中加载不同指令集架构的程序或库文件对应的线程局部存储(thread local storage,TLS)数据。在此类系统中,应当如何对TLS数据进行加载和/或访问,是亟待解决的问题。
发明内容
本申请提供一种二进制翻译方法及装置。下面对本申请实施例涉及的各个方面进行介绍。
第一方面,提供一种二进制翻译方法,该方法用于对基于第一指令集架构的目标程序进行二进制翻译,以在基于第二指令集架构的主机上运行所述目标程序,所述目标程序包括主程序以及所述主程序的一个或多个依赖库,所述主机包括所述一个或多个依赖库中的至少部分依赖库对应的本地原生库,且在所述主机运行所述目标程序的过程中,所述主程序调用所述本地原生库,以实现所述至少部分依赖库的功能,所述方法包括:加载所述目标程序对应的线程数据,所述线程数据的TLS内存布局符合所述第二指令集架构对应的TLS内存布局;对所述线程数据的访问指令进行二进制翻译,使得翻译后的访问指令与所述第二指令集架构对应的TLS内存布局相匹配。
第二方面,提供一种二进制翻译装置,该装置用于对基于第一指令集架构的目标程序进行二进制翻译,以在基于第二指令集架构的主机上运行所述目标程序,所述目标程序包括主程序以及所述主程序的一个或多个依赖库,所述主机包括所述一个或多个依赖库中的至少部分依赖库对应的本地原生库,且在所述主机运行所述目标程序的过程中,所述主程序调用所述本地原生库,以实现所述至少部分依赖库的功能,所述装置包括:加载模块,用于加载所述目标程序对应的线程数据,所述线程数据的TLS内存布局符合所述第二指令集架构对应的TLS内存布局;第一翻译模块,用于对所述线程数据的访问指令进行二进制翻译,使得翻译后的访问指令与所述第二指令集架构对应的TLS内存布局相匹配。
第三方面,提供一种计算设备,包括:存储器,用于存储代码;处理器,用于执行所述存储器中存储的代码,以执行如第一方面或第一方面中的任意一种可能的实现方式所述的方法。
第四方面,提供一种计算机可读存储介质,其上存储有用于执行如第一方面或第一方面中的任意一种可能的实现方式所述的方法的代码。
第五方面,提供一种计算机程序代码,包括用于执行如第一方面或第一方面中的任意一种可能的实现方式所述的方法的指令。
本申请实施例以主机的TLS内存布局方式加载目标程序对应的线程数据,通过在翻译过程中,对线程数据访问指令进行处理,以正确访问该线程数据,有助于实现跨指令集架构的TLS数据的加载和访问。
附图说明
为了更清楚地说明本申请实施例或背景技术中的技术方案,下面将对本申请实施例或背景技术中所需要使用的附图进行说明。
图1为可应用本申请实施例的主机的系统架构示例图。
图2为TLS_TCB_AT_TP的一个示例。
图3为TLS_DTV_AT_TP的一个示例。
图4为本申请实施例提供的二进制翻译方法的流程示意图。
图5为主程序gedit及其依赖库的TLS数据在内存中的一种可能的布局方式。
图6为访问地址与目标地址相对关系的一种示意图。
图7为本申请实施例提供的一种二进制翻译过程的示意图。
图8为本申请实施例提供的一种二进制翻译装置的结构示意图。
图9为本申请另一实施例的计算设备的结构示意图。
具体实施方式
下面结合本申请实施例中的附图对本申请实施例进行描述。以下描述中,参考形成本申请一部分并以说明之方式示出本申请实施例的具体方面或可使用本申请实施例的具体方面的附图。应理解,本申请实施例可在其它方面中使用,并可包括附图中未描绘的结构或逻辑变化。因此,以下详细描述不应以限制性的意义来理解,且本申请的范围由所附权利要求书界定。例如,应理解,结合所描述方法的揭示内容可以同样适用于用于执行所述方法的对应设备或系统,且反之亦然。例如,如果描述一个或多个具体方法步骤,则对应的设备可以包含如功能单元等一个或多个单元,来执行所描述的一个或多个方法步骤(例如,一个单元执行一个或多个步骤,或多个单元,其中每个都执行多个步骤中的一个或多个),即使附图中未明确描述或说明这种一个或多个单元。另一方面,例如,如果基于如功能单元等一个或多个单元描述具体装置,则对应的方法可以包含一个步骤来执行一个或多个单元的功能性(例如,一个步骤执行一个或多个单元的功能性,或多个步骤,其中每个执行多个单元中一个或多个单元的功能性),即使附图中未明确描述或说明这种一个或多个步骤。进一步,应理解的是,除非另外明确提出,本文中所描述的各示例性实施例和/或方面的特征可以相互组合。
本申请实施例涉及二进制翻译(binary translation)技术中的有关线程局部存储(thread local storage,TLS)数据的加载和访问。为了便于理解,下面先分别介绍二进制翻译以及TLS数据的加载和访问。
二进制翻译
图1是可应用本申请实施例的主机(或称宿主机或宿主机平台)的系统架构示例图。如图1所示,主机100的底层设置有支持主机运行的硬件110。该硬件110例如可以包括以下中的一种或多种:中央处理单元(central processing unit,CPU)、内存、内存管理单元(memory management unit,MMU)等。该MMU可以是支持硬件虚拟机技术的MMU。例如,该MMU可以支持嵌套页表技术或扩展页表技术。在硬件110之上,运行有主机的操作系统120。主机100可以通过操作系统120运行各种类型的应用130。
该主机100支持客户机运行模式(即该主机上可以运行客户机或客户机平台)。为了对客户机运行模式进行维护和/或管理,主机100上可以运行虚拟机管理系统140。该虚拟机管理系统140可以是虚拟机管理器(virtual machine manager,VMM),也可以是仿真器。
该虚拟机管理系统140可用于管理运行在主机100上的客户机150(包括图1中的客户机150a和客户机150b)。例如,该虚拟机管理系统140可以为客户机150提供运行所需的硬件环境,如CPU、内存等。
主机100与客户机150所基于的指令集架构(也可称为体系结构)可以不同。例如,主机100所基于的指令集架构可以为ARM指令集架构;客户机150所基于的指令集架构可以是X86指令集架构。又如,主机100所基于的指令集架构可以为X86指令集架构;客户机150所基于的指令集架构可以是ARM指令集架构。此外,客户机150a与客户机150b可以基于相同的指令集架构,也可以基于不同的指令集架构。
客户机的应用程序160(包括图1中的应用程序160a和应用程序160b)可以包括主程序以及主程序调用的依赖库(依赖库指的是主程序运行所需的库文件,该库文件也可称为共享库或动态库)。以linux下常见的gedit程序为例,gedit为主程序,gedit的运行可以调用客户机的依赖库(如libgedit.so、libc.so),也可以调用主机中与客户机中依赖库相关的原生库文件(如libc.so)。
由于主机100和客户机150基于不同的指令集架构,因此,如果希望在主机100上运行应用程序160,需要先对应用程序160的指令进行二进制翻译。下面对二进制翻译技术进行简单介绍。
二进制翻译技术是一种直接翻译并运行可执行程序二进制指令的技术,是实现不同指令集架构兼容的重要手段。对于支持二进制翻译的系统,按照翻译界面来划分,大体可以分为两种系统。下面对这两种系统分别进行介绍。
第一种系统(下称系统一)通常将待翻译的主程序以及该主程序所有的依赖库均加载至内存中,然后对待翻译程序及其依赖库均进行二进制翻译。仍以上文提到的gedit程序为例,gedit程序的依赖库包括libgedit.so和libc.so,则系统一会将客户机的gedit、libgedit.so以及libc.so均加载至内存,然后对客户机的gedit、libgedit.so以及libc.so均进行二进制翻译。系统一的优点是兼容性很好。但是,系统一存在的问题是所有程序代码及其依赖库均要完全被翻译,翻译开销大,导致程序的运行性能较差。
第二种系统(下称系统二)会将待翻译的主程序和/或该待翻译程序的部分依赖库加载至内存中。此外,系统二还会将主程序的部分依赖库相关的本地原生库加载至内存,然后调用该本地原生库中的等价函数。仍以上文提到的gedit程序为例,gedit程序的依赖库包括libgedit.so和libc.so,则系统二会可以将客户机的gedit和libgedit.so加载至内存,然后对客户机的gedit和libgedit.so进行二进制翻译。此外,系统二会将gedit程序的另一个依赖库对应的主机的libc.so(该libc.so为主机的本地原生库)加载至内存,调用主机libc.so中的等价函数代替依赖库中被调用的函数,从而无需对这部分代码进行翻译。系统二的优点是翻译时的开销小,因此能够提高目标程序的运行性能。
TLS数据的加载和访问
TLS是一种变量的存储方法。TLS存储的变量(或称TLS数据)在该TLS对应的线程内是全局可访问的,但是TLS存储的变量不能被其他线程访问。因此,TLS能够保持变量的线程独立性。在某个变量前定义关键字_thread,即可保证线程访问该变量时,是在访问自己的线程数据,而非其他线程的数据。_thread可以理解为pthread_getspecific/pthread_setspecific的替代品。为了实现TLS,通常需要内核、动态加载器、线程库,以及编译器等多方的支持。
TLS数据一般存储在TLS块(即用于存储TLS数据的一个内存块)中。一般而言,可执行文件和库文件都可能有相应的TLS块。TLS块可以包括动态TLS块和静态TLS块。静态TLS块指的是不需要通过运行,静态时即可获知的TLS块。通常来说,如果一个程序的依赖库不是通过dlopen打开到内存,而是直接通过动态加载器加载程序的时候被加载至内存,则该依赖库的TLS块即为静态TLS块。动态TLS块的访问在二进制翻译中可以直接进行映射,因此后文中提到的TLS块均为静态TLS块。
在运行主程序之前,主机会按照一定的TLS内存布局将主程序及其依赖库的TLS数据加载至内存中。当需要访问TLS数据的时候,编译器会生成读取线程指针(thread point,TP)的代码,并且通过对TP的地址进行偏移,从而访问TLS数据。线程指针的地址一般存储在线程寄存器中。例如,在ARM指令集架构下,线程指针的地址存储在线程寄存器fs中。在不同指令集架构中,一般可以通过读取线程寄存器对TP进行访问。例如,在X86指令集架构下,可以通过访问fs:0的方式访问TP;又如,在ARM指令集架构(Aarch64)下,可以通过访问mrsx0,TPidr_el0的方式访问TP。
TLS内存布局一般分为两种:一种是TLS_TCB_AT_TP,另一种是TLS_DTV_AT_TP。TLS_TCB_AT_TP指的是线程控制块(thread control block,TCB,一般用于维护一些线程控制的相关信息)在TP后的TLS内存布局。图2为TLS_TCB_AT_TP的一个示例。参见图2,在一块连续的内存空间200内,存储了线程结构体(struct pthread)以及一个或多个TLS块(静态TLS块)。在TLS_TCB_AT_TP中,TP指向TLS块和线程结构体中间的位置。TP的左侧为地址连续的多个TLS块(图2是以3个TLS块为例进行说明的,实际上可以包括更多或更少的TLS块),TP右侧为线程结构体。该线程结构体包含TCB,TP向右偏移即可访问该TCB。为了便于描述,下文将TLS_TCB_AT_TP对应的内存布局称为type1 TLS内存布局,并将type1类型的TLS内存布局TP称为type1 TP。
TLS_DTV_AT_TP指的是动态线程向量(dynamic thread vector,DTV)在TP后的TLS内存布局。图3为TLS_DTV_AT_TP的一个示例。参见图3,在一块连续的内存空间300内,存储了线程结构体(struct pthread)以及一个或多个TLS块(静态TLS块)。在TLS_DTV_AT_TP中,TP指向线程结构体和DTV中间的位置。TP的左侧为线程结构体。TP的右侧为依次为DTV以及地址连续的多个TLS块(图3是以3个TLS块为例进行说明的,实际上可以包括更多或更少的TLS块)。为了便于描述,下文将TLS_DTV_AT_TP对应的内存布局称为type2 TLS内存布局,并将type2类型的TLS内存布局TP称为type2 TP。
不同指令集架构通常对应不同类型的TLS内存布局。例如,X86指令集架构(如X86_64)对应的TLS内存布局为上文提到的type1 TLS内存布局。又如,ARM指令集架构(如Aarch64)对应的TLS内存布局为上文提到的type2 TLS内存布局。
一般而言,针对任何一种TLS内存布局,可能会需要通过TP访问一侧的线程结构体,也会需要通过TP访问另一侧的TLS块中的TLS数据。参见图2和图3,TLS块1中包含的是主程序的TLS数据。也就是说,主程序的TLS数据通常被设置在贴近TP的位置。这样一来,通过对TP的地址进行固定偏移即可访问主程序的TLS数据,因为TLS块1的位置在编译时是可知的。
参见图2,对于type1 TLS内存布局而言,编译器为了优化代码,往往会通过type1TP-offset(offset>0)访问TLS块1中的TLS数据。同时,考虑到安全问题,还可能会通过type1 TP+offset访问线程结构体(如TCB)中一些的数据,从而进行线程栈的检查。
同理,参见图3,对于type2 TLS内存布局而言,编译器为了优化代码,往往会通过type2 TP+offset(offset>0)访问TLS块1中的TLS数据。同时,考虑到安全问题,还可能会通过type2 TP-offset访问线程结构体中一些的数据,从而进行线程栈的检查。
前文描述了主程序的TLS数据以及线程结构体的访问方式。除了主程序的TLS数据之外,主程序的依赖库的TLS数据(如前文中的TLS块2和/或TLS块3中的TLS数据)与TP之间的位置关系往往是不能静态获知的,因此不能按照对TP进行固定偏移的方式实现。主程序的依赖库的TLS数据的访问方式通常是基于TP和全局偏移表(global offset table,GOT)实现的。下面对GOT表以及基于GOT表的TLS数据访问方式进行详细地举例说明。
GOT表是计算机程序(可执行文件和库文件)的一部分,用于使编译为ELF文件编译的计算机程序代码正确运行。加载器加载程序的时候,将一些运行时才知道的地址写入可执行程序被映射到内存的GOT表。这样程序可以通过访问GOT表访问主程序依赖库的变量或者TLS偏移,或者其他库的函数。
根据RELA项可以填充GOT表中对应的表项。RELA是程序中的一个特定的段,描述了需要重定位的信息。例如,一个库知道自己有TLS数据,知道自己的TLS块的偏移是多少。但是,当程序代码没有被加载的时候,并不能获知TLS数据相对于TP的偏移。在这个时候,编译器往往先生成TP+GOT[idx]这样的代码,并且在RELA section中生成一个RELA项。当加载器加载程序代码时,会根据RELA项,去填充库文件的TLS数据对应的GOT表项。加载完成后,GOT表项里的值,即为库文件的TLS数据距离TP的值。
综上可知,表1示出的是不同类型的TLS内存布局下,线程结构体以及不同类型的TLS块的主要访问方式。
表1 线程结构体以及不同类型的TLS块的主要访问方式
Figure DEST_PATH_IMAGE002
前文详细介绍了二进制翻译以及TLS内存布局。在采用系统二进行二进制翻译时,主程序以及主程序的部分依赖库的代码为不同指令集架构下的代码。面对不同指令集架构下的代码,应当如何进行TLS数据的加载是首先需要考虑的问题。
相关技术中大多采用修改加载器和修正翻译指令结合的方法解决这一问题。但是,如果对系统加载器进行修改,可能不利于系统的稳定性。本申请实施例提出在二进制翻译的过程中对主机的加载器不进行修改,也就是说,将目标程序相关的TLS数据按照主机指令集架构(即第二指令集架构)下的默认方法进行加载。
将不同指令集架构下的代码加载到一块连续的内存空间之后,不同指令集架构的代码都想要按自己的TLS内存布局的约定来访问线程指针左右两边的线程结构体以及TLS数据。
仍以gedit程序为例,gedit和libgedit.so的代码均为待翻译的X86代码,gedit调用的libc.so为ARM平台的本地原生库,因此,libc.so的代码为ARM代码。但是,根据上面的表1可知,X86和ARM下对主程序的TLS数据的访问方式并不相同。例如,在X86下的访问指令为mov%fs:0xfffffffffffffffc,%eax。这条指令的意思是取线程寄存器fs中的TP值,并且在该TP值的基础上+-4(即向左偏移4个地址),并将该地址中的内容写入eax寄存器。在X86架构下,这条汇编指令为TLS块1(即主程序的TLS块)的访问指令。从图3可以看出,ARM指令集架构对应的TP的左边并不是TLS块1,而是ARM指令集架构相关的线程结构体。如果将X86架构下的TP直接翻译为ARM指令集架构下的TP,则可能无法访问到这条指令对应的TLS数据。
针对上述问题,本申请实施例提出一种二进制翻译方法。下面结合图4,对本申请实施例提供的二进制翻译方法进行详细介绍。应理解,图4的方法可用于对基于第一指令集架构的目标程序进行二进制翻译,以在基于第二指令集架构的主机上运行该目标程序。目标程序可以包括主程序以及主程序的一个或多个依赖库,主机可以包括一个或多个依赖库中的至少部分依赖库对应的本地原生库,且在主机运行目标程序的过程中,主程序调用本地原生库,以实现至少部分依赖库的功能。
参见图4,方法400包括步骤S410以及步骤S420。以上各个步骤均可以由主机执行。例如,步骤S410可以由主机的动态加载器执行。步骤S420可以由主机的翻译引擎执行。
在步骤S410中,加载目标程序对应的线程数据,线程数据的TLS内存布局符合第二指令集架构对应的TLS内存布局。
如果在指令集架构为ARM的主机上对基于X86指令集架构的代码进行二进制翻译,将目标程序对应的线程数据可以按照ARM指令集架构的TLS布局方式(即前文提到的type2TLS内存布局)进行加载。如果在指令集架构为X86的主机上对基于ARM指令集架构的代码进行二进制翻译,将目标程序对应的线程数据可以按照X86指令集架构的TLS布局方式(即前文提到的type1 TLS内存布局)进行加载。
仍以gedit为例,如果希望在基于ARM指令集架构的主机上运行基于X86指令集架构的gedit程序,则图5示出了主程序gedit及其依赖库的TLS数据在type2方式布局下的示意图。从图中可以看出,X86的gedit和libgedit.so和ARM平台的本地原生libc.so均按照ARM指令集架构下的TLS数据布局方式被加载至一块连续的内存空间。
在步骤S420,对线程数据的访问指令进行二进制翻译,使得翻译后的访问指令与第二指令集架构对应的TLS内存布局相匹配。
在将线程数据按照第二指令集架构的TLS布局进行加载之后,对线程数据的访问指令进行翻译。在翻译过程中可以对上述指令做一定的修正,使得翻译后的访问指令与第二指令集架构对应的TLS内存布局相匹配,也就是说,翻译后的访问指令可以在第二指令集架构对应的TLS内存布局下访问到正确的数据。
本申请实施例以主机的TLS内存布局方式加载目标程序对应的线程数据,通过在翻译侧进行处理以正确访问该线程数据,有助于实现跨指令集架构的TLS数据的加载和访问。
对线程数据的访问指令进行二进制翻译的方式包括多种。作为一种实现方式,针对不同类型的访问指令可以采用不同的翻译方式。其中,访问指令的类型可以包括后文中介绍的第一类型、第二类型以及第三类型中的一种或多种。下文对三种类型的访问指令及其翻译方式进行详细介绍。
针对基于线程指针和固定偏移的访问,固定偏移和0的一种关系在不同的TLS内存布局中表示不同类型的访问指令。例如,当固定偏移量大于0,在type1的TLS内存布局下,访问指令对应的数据为线程结构体中的数据,而在type2的TLS内存布局下,访问指令对应的数据为主程序的TLS数据。又如,当固定偏移量小于0,在type1的TLS内存布局下,访问指令对应的数据为主程序的TLS数据,而在type2的TLS内存布局下,访问指令对应的数据为线程结构体中的数据。
因此,根据访问指令对应的数据类型可以将基于线程指针和固定偏移的访问指令分为第一类型和第二类型。其中,第一类型的访问指令为基于线程指针和固定偏移对线程结构体的访问指令,第二类型的访问指令为基于线程指针和固定偏移对所述主程序的TLS数据的访问指令。
第一类型的访问指令中的固定偏移量可以为一个常量,也可以为一个寄存器中的值,其中寄存器中的值为一个常量。例如,第一类型的访问指令可以包括%fs:const_offset指令,其中fs为线程寄存器,用于存储线程指针,而const_offset为固定偏移量,通常为一个常量。
根据固定偏移量的类型,可以进一步将第一类型的访问指令分为以下两种类型:固定偏移量大于0和固定偏移量小于0。例如,在X86架构下对ARM架构的程序进行翻译和运行时,对于基于线程指针和固定偏移量的访问指令,固定偏移量大于0的指令为第一类型的访问指令。又如,在ARM架构下对X86架构的程序进行翻译和运行时,对于基于线程指针和固定偏移量的访问指令,固定偏移量小于0的指令为第一类型的访问指令。
以在ARM架构下对X86架构的程序进行翻译和运行为例,重新参见图3。从图中可以看出,TLS空间300中并不包括目标程序的线程结构体。
因此,对第一次出现的第一类型的访问指令(即对线程结构体第一次访问的指令)进行翻译时,首先可以在内存中动态申请第一内存空间,用于模拟第一指令集架构相关的线程结构体。其中,第一内存空间的大小可以和第一指令集架构相关的线程结构体的大小相同。其次,可以将第一内存空间绑定至目标程序的线程。例如,可以通过pthread_key_create/pthread_setspecific指令把这块内存维护起来(也就是绑定至目标程序的线程),后续就可以通过pthread_getspecific来获取对第一内存空间的访问。在一种实现方式中,可以使用void*p指向第一内存空间,p可以理解为第一内存空间模拟指针。进一步地,可以通过返回p翻译第一类型的访问指令。作为一个示例,%fs:const_offset指令就可以翻译为p+const_offset。
第二类型的访问指令为基于线程指针和固定偏移对所述主程序的TLS数据的访问指令。该访问指令中的固定偏移量可以为一个常量,也可以为一个寄存器中的值,其中寄存器中的值为一个常量。例如,第二类型的访问指令可以包括%fs:const_offset指令。其中fs为线程寄存器,用于存储线程指针,而const_offset为一个常量。
根据固定偏移量的类型,可以进一步将第二类型的访问指令分为以下两种类型:固定偏移量大于0和固定偏移量小于0。例如,在X86架构下对ARM架构的程序进行翻译和运行时,对于基于线程指针和固定偏移量的访问指令,固定偏移量小于0的指令为第二类型的访问指令。又如,在ARM架构下对X86架构的程序进行翻译和运行时,对于基于线程指针和固定偏移量的访问指令,固定偏移量大于0的指令为第二类型的访问指令。
如果访问指令的类型为第二类型,则将访问指令所访问的地址翻译为目标地址,其中目标地址为主程序的TLS数据在内存中的地址。由于访问指令的地址是由线程指针加固定偏移量组成的,因此,在一些实施例中,目标地址可以由模拟tp加固定偏移量组成。其中,模拟tp指向第一指令架构集对应的TLS布局中指针的位置。根据第一指令集架构和第二指令集架构下指针位置的差异以及第一指令集架构下TLS数据的访问方式,可以获得模拟tp。
以在ARM架构下对X86架构的程序进行翻译为例,结合图6对目标地址的获取方式进行介绍。
重新参见图2,type1 TP为第一指令集架构下TLS布局方式(type1 TLS布局方式)对应的指针位置。在type1 TLS布局方式下,主程序的线程数据是从type1 TP的位置向左偏移进行访问的,因此,模拟tp的位置可以确定为图6中type1 TP的位置。从图6中可以看出,模拟tp的位置与第二指令集架构下的线程指针(type2 TP)的地址之间的差值为第一数值。也就是说,目标地址等于访问指令访问的原始地址与第一数值之和。其中,第一数值等于第二数值和第三数值之和,第二数值等于主程序的TLS数据所占用的内存空间的大小,第三数值等于第二指令集架构相关的动态线程向量所占用的内存空间的大小。例如,在对第二类型的访问指令进行翻译时,可以返回目标地址TP2+size of (tls block1)+size of (DTV)+const_offset。作为一个示例,TLS块1的大小为4,指令fs:-4用于访问TLS块1内的一个_thread int类型的变量。按照上述方法,可以将指令fs:-4翻译为TP2+4+sizeof(DTV)+(-4)。
同理,在X86架构下对ARM架构的程序进行翻译时,目标地址等于所述访问指令访问的原始地址与第一数值之差。作为一个示例,在对第二类型的访问指令进行翻译时,可以返回目标地址TP2-(size of (tls block1)+size of (DTV))+const_offset。
第三类型为基于线程指针和全局偏移表中的值对线程数据的访问指令。由于全局偏移表是按照第二指令集架构的线程指针进行填充的,因此,如果访问指令的类型为所述第三类型,则基于访问指令的字面语义翻译该访问指令。例如,TLS块2中的目标程序依赖库的TLS数据对应的GOT表项中的值,即为该库文件TLS数据距离当前TP的值。当前TP即为第二指令集架构对应的TP。翻译访问TLS块2中TLS数据时,直接返回当前TP加全局偏移量即可。
通过上述三种翻译方法,本申请实施例在不修改加载器的情况下,在翻译侧实现了针对线程数据的访问代码的二进制翻译,有助于降低二进制翻译对系统稳定性的影响。
访问线程数据的指令形式多种多样,准确确定访问指令的类型才能准确确定该访问指令对应的翻译方式。
有一些指令可以直观判断出访问类型,如前文所述的fs:+const_offset。还有一些指令无法直观的判断出访问类型,如基于第一寄存器和第二寄存器的访问指令,其中,第一寄存器中存储的地址为线程指针的地址。例如,第一寄存器可以为线程寄存器,也可以为除线程寄存器之外的其他寄存器。根据数值来源可以将第二寄存器分为两种:一种可以为第二寄存器中的数值来源于全局偏移表,另一种可以为第二寄存器中的数值的来源不是全局偏移表。
根据第二寄存器中数值的来源可以判断出访问指令的类型。如果第二寄存器中的数值来源于全局偏移表则确定所述访问指令的类型为所述第三类型;如果第二寄存器中的数值的来源不是全局偏移表,则确定访问指令的类型为第一类型或第二类型。对于第二寄存器中的数值的来源不是全局偏移表的访问指令,可以根据第一指令集架构和第二指令集架构的TLS内存布局方式和第二寄存器中的数值正负,判断访问指令的类型为第一类型还是第二类型。
在一些实施例中,因为某些原因,编译器使用mov eax,0x26; fs:eax指令代替fs:0x26指令,其中eax中的值不是来源于全局偏移表,而是一个常量。如果该条指令为ARM架构下待翻译的X86代码,则该条指令为第一类型的访问指令;如果该条指令为X86架构下待翻译的ARM代码,则该条指令为第二类型的访问指令。又如,使用Mv eax,-4; fs:eax指令代替fs:const_offset指令,如果该条指令为ARM架构下待翻译的X86代码,则该条指令为第二类型的访问指令;如果该条指令为X86架构下待翻译的ARM代码,则该条指令为第一类型的访问指令。
以在ARM架构下翻译X86代码为例,在对代码中的一个基本块进行翻译时,TLS数据的访问代码为mov eax,[addr];fs:eax。其中,addr为一个地址,指令mv eax,[addr]的含义是将addr地址的内容存入寄存器eax。由于一个程序的GOT表相对代码的位置,是静态可知的。因此根据addr和GOT表对应的地址范围可以判断出eax中的值是否来源于GOT表。如果addr在GOT表对应的地址范围内,则指令mov eax,[addr]可以称为访问GOT表的指令。当翻译到该类访问指令时,可以对指令进行跟踪标记。如果发现fs:eax指令中eax的值来源于got表,则可以判断该指令为第三类型的访问指令。
在另一些实施例中,第一寄存器为除线程寄存器之外的其他寄存器。例如,通过mov %fs:0,eax指令可以将线程寄存器中的线程指针保存在eax寄存器中,那么在后续的翻译中需要扫描当前基本块,跟踪所有涉及eax寄存器的算术操作,并根据算术操作的内容确定指令的访问类型。其中当前基本块可以为上述mov %fs:0,eax指令所在的基本块。如果算术操作为eax+const_offset或eax+ebx(ebx中值为一个常数),则根据前文所述的方法可以判断其属于第一类型或第二类型的访问指令。如果算术操作为eax+got[idx],则根据前文所述的方法可以判断其属于第三类型的访问指令。
需要说明的是,二进制翻译的正常运行的约束条件为:在一个基本块内能明确tls访问意图:通过fs:got[idx]等指令访问主程序依赖库的线程数据,通过fs:offset等指令访问主程序的线程数据,或通过fs:offset等指令访问线程结构体的数据。这一约束是合理的。因为TLS是为了提高生产效率提供的基础设施,绝大部分场景下,只能通过_thread由编译器来生成访问TLS的代码。极端情况下,老的编译器可能会生成mv eax,const_offset;fs:eax的访问代码,这种代码都会在一个基本块内。因此,上述确定访问指令类型的方法中,扫描跟踪的范围为基本块内。不过理论上极端情况下,如果通过%fs:0得到线程指针,并且跨越多个基本块进行使用,则程序不能被正常翻译执行,目前尚未见到这种情况。
图7给出了一种二进制翻译过程的示意图。在进行二进制翻译之前,首先需要确认待翻译的目标程序和主机的指令集架构。图7所示的方法700可以用于在X86架构下翻译基于ARM架构的目标程序,也可以用于在ARM架构下翻译基于X86架构的目标程序。
参见图7,二进制翻译过程中主要包括步骤S710至步骤S730。
在步骤S710,确定待翻译的目标程序。
在步骤S720,加载所述目标程序以及目标程序对应的线程数据(即TLS数据),按照主机的默认加载方式将TLS数据加载到统一的TLS空间。如果主机为X86指令集架构,则TLS的布局方式为type1 TLS内存布局方式;如果主机为ARM指令集架构,则TLS的布局方式为type2 TLS内存布局方式。
在步骤S730,修正指令数据,将访问指令翻译为与当前TLS内存布局相匹配的指令。
对于基于线程指针和固定偏移访问线程结构体的指令,可以将访问指令翻译成针对第一内存空间的访问执行,该第一内存空间用于模拟第一指令集架构相关的线程结构体。对于基于线程指针和固定偏移访问主程序TLS数据的指令,可以将访问指令所访问的地址翻译为目标地址。目标地址为所述主程序的TLS数据在所述内存中的地址。对于基于线程指针和全局偏移表中的值的访问指令,可以按照访问指令的字面语义进行翻译,即直接返回TP+偏移值。
上文结合图1至图7,详细描述了本申请的方法实施例,下面结合图8和图9,详细描述本申请的装置实施例。应理解,方法实施例的描述与装置实施例的描述相互对应,因此,未详细描述的部分可以参见前面方法实施例。
图8为本申请实施例提供的一种二进制翻译装置的结构示意图。二进制翻译装置800可以用于对基于第一指令集架构的目标程序进行二进制翻译,以在基于第二指令集架构的主机上运行所述目标程序,所述目标程序包括主程序以及所述主程序的一个或多个依赖库,所述主机包括所述一个或多个依赖库中的至少部分依赖库对应的本地原生库,且在所述主机运行所述目标程序的过程中,所述主程序调用所述本地原生库,以实现所述至少部分依赖库的功能。
参见图8,二进制翻译装置800包括加载模块810和第一翻译模块820。
加载模块810,用于加载所述目标程序对应的线程数据,所述线程数据的TLS内存布局符合所述第二指令集架构对应的TLS内存布局。
第一翻译模块820,用于对所述线程数据的访问指令进行二进制翻译,使得翻译后的访问指令与所述第二指令集架构对应的TLS内存布局相匹配。
可选地,所述第一翻译模块包括:确定模块,用于确定所述访问指令的类型;第二翻译模块,用于根据所述访问指令的类型对应的翻译方式,对所述访问指令进行翻译;其中,所述访问指令的类型包括以下中的一种或多种:第一类型:基于线程指针和固定偏移对线程结构体的访问指令;第二类型:基于线程指针和固定偏移对所述主程序的TLS数据的访问指令;以及第三类型:基于线程指针和全局偏移表中的值对所述线程数据的访问指令。
可选地,所述第二翻译模块具体用于:如果所述访问指令的类型为所述第一类型,则将所述访问指令翻译成针对第一内存空间的访问指令,其中,所述第一内存空间为动态申请的内存空间,且所述第一内存空间用于模拟所述第一指令集架构相关的线程结构体。
可选地,所述装置800还包括:预处理模块,用于在所述将所述访问指令翻译成针对第一内存空间的访问指令之前,基于所述第一指令集架构相关的线程结构体占用的内存大小,申请所述第一内存空间,并将所述第一内存空间绑定至所述目标程序的线程。
可选地,所述确定模块具体用于:在所述第一指令集架构为X86指令集架构,所述第二指令集架构为ARM指令集架构的情况下,如果所述访问指令为基于线程指针和固定偏移的访问指令,且所述固定偏移大于零,则所述访问指令为所述第一类型的访问指令;或者,在所述第一指令集架构为ARM指令集架构,所述第二指令集架构为X86指令集架构的情况下,如果所述访问指令为基于线程指针和固定偏移的访问指令,且所述固定偏移小于零,则所述访问指令为所述第一类型的访问指令。
可选地,所述第二翻译模块具体用于:如果所述访问指令的类型为所述第二类型,则将所述访问指令所访问的地址翻译为目标地址,其中所述目标地址为所述主程序的TLS数据在所述内存中的地址。
可选地,如果所述第一指令集架构为X86指令集架构,所述第二指令集架构为ARM指令集架构,则所述目标地址等于所述访问指令访问的原始地址与第一数值之和;或者,如果所述第一指令集架构为ARM指令集架构,所述第二指令集架构为X86指令集架构,则所述目标地址等于所述访问指令访问的原始地址与第一数值之差;其中,所述第一数值等于第二数值和第三数值之和,所述第二数值等于所述主程序的TLS数据所占用的内存空间的大小,所述第三数值等于所述第二指令集架构相关的动态线程向量所占用的内存空间的大小。
可选地,所述确定模块具体用于:在所述第一指令集架构为X86指令集架构,所述第二指令集架构为ARM指令集架构的情况下,如果所述访问指令为基于线程指针和固定偏移的访问指令,且所述固定偏移小于零,则所述访问指令为所述第二类型的访问指令;或者,在所述第一指令集架构为ARM指令集架构,所述第二指令集架构为X86指令集架构的情况下,如果所述访问指令为基于线程指针和固定偏移的访问指令,且所述固定偏移大于零,则所述访问指令为所述第二类型的访问指令。
可选地,所述第二翻译模块具体用于:如果所述访问指令的类型为所述第三类型,则基于所述访问指令的字面语义翻译所述访问指令。
可选地,所述确定模块具体用于:如果所述访问指令为基于第一寄存器和第二寄存器的访问指令,则确定所述第二寄存器中的数值的来源是否为全局偏移表;如果所述第二寄存器中的数值的来源为所述全局偏移表,则确定所述访问指令的类型为所述第三类型;如果所述第二寄存器中的数值的来源不是所述全局偏移表,则确定所述访问指令的类型为所述第一类型或所述第二类型;其中,所述第一寄存器中存储的地址为线程指针的地址。
图9为本申请另一实施例的计算设备的结构示意图。图9所示的计算设备900可以包括存储器910和处理器920。在一些实施例中,图9所示的计算设备900还可以包括输入/输出接口930以及收发机940。存储器910、处理器920、输入/输出接口930和收发机940通过内部连接通路相连,该存储器910用于存储指令,该处理器920用于执行该存储器910存储的指令,以执行前文任一实施例描述的二进制翻译方法。
应理解,在本申请实施例中,该处理器920可以采用通用的中央处理器(centralprocessing unit,CPU),微处理器,应用专用集成电路(application specificintegrated circuit,ASIC),或者一个或多个集成电路,用于执行相关程序,以实现本申请实施例所提供的技术方案。
还应理解,收发机940又称通信接口,使用例如但不限于收发器一类的收发装置,来实现计算设备900与其他设备或通信网络之间的通信。
该存储器910可以包括只读存储器和随机存取存储器,并向处理器920提供指令和数据。处理器920的一部分还可以包括非易失性随机存取存储器。例如,处理器920还可以存储设备类型的信息。
在实现过程中,上述方法的各步骤可以通过处理器920中的硬件的集成逻辑电路或者软件形式的指令完成。结合本申请实施例所公开的二进制翻译的方法可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器910,处理器920读取存储器910中的信息,结合其硬件完成上述方法的步骤。为避免重复,这里不再详细描述。
应理解,本申请实施例中,该处理器可以为中央处理单元(central processingunit,CPU),该处理器还可以是其他通用处理器、数字信号处理器(digital signalprocessor,DSP)、专用集成电路(application specific integrated circuit,ASIC)、现成可编程门阵列(field programmable gate array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
应理解,在本申请实施例中,“与A相应的B”表示B与A相关联,根据A可以确定B。但还应理解,根据A确定B并不意味着仅仅根据A确定B,还可以根据A和/或其它信息确定B。
应理解,本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
应理解,在本申请的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber Line,DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够读取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,数字通用光盘(digital video disc,DVD))或者半导体介质(例如,固态硬盘(solid state disk,SSD))等。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。

Claims (22)

1.一种二进制翻译方法,其特征在于,所述方法用于对基于第一指令集架构的目标程序进行二进制翻译,以在基于第二指令集架构的主机上运行所述目标程序,所述目标程序包括主程序以及所述主程序的一个或多个依赖库,所述主机包括所述一个或多个依赖库中的至少部分依赖库对应的本地原生库,且在所述主机运行所述目标程序的过程中,所述主程序调用所述本地原生库,以实现所述至少部分依赖库的功能,
所述方法包括:
加载所述目标程序对应的线程数据,所述线程数据的TLS内存布局符合所述第二指令集架构对应的TLS内存布局;
对所述线程数据的访问指令进行二进制翻译,使得翻译后的访问指令与所述第二指令集架构对应的TLS内存布局相匹配。
2.根据权利要求1所述的方法,其特征在于,所述对所述线程数据的访问指令进行二进制翻译,包括:
确定所述访问指令的类型;
根据所述访问指令的类型对应的翻译方式,对所述访问指令进行翻译;
其中,所述访问指令的类型包括以下中的一种或多种:
第一类型:基于线程指针和固定偏移对线程结构体的访问指令;
第二类型:基于线程指针和固定偏移对所述主程序的TLS数据的访问指令;以及
第三类型:基于线程指针和全局偏移表中的值对所述线程数据的访问指令。
3.根据权利要求2所述的方法,其特征在于,所述根据所述访问指令的类型对应的翻译方式,对所述访问指令进行翻译,包括:
如果所述访问指令的类型为所述第一类型,则将所述访问指令翻译成针对第一内存空间的访问指令,其中,所述第一内存空间为动态申请的内存空间,且所述第一内存空间用于模拟所述第一指令集架构相关的线程结构体。
4.根据权利要求3所述的方法,其特征在于,在所述将所述访问指令翻译成针对第一内存空间的访问指令之前,所述方法还包括:
基于所述第一指令集架构相关的线程结构体占用的内存大小,申请所述第一内存空间;
将所述第一内存空间绑定至所述目标程序的线程。
5.根据权利要求3所述的方法,其特征在于,所述确定所述访问指令的类型,包括:
在所述第一指令集架构为X86指令集架构,所述第二指令集架构为ARM指令集架构的情况下,如果所述访问指令为基于线程指针和固定偏移的访问指令,且所述固定偏移大于零,则所述访问指令为所述第一类型的访问指令;或者,
在所述第一指令集架构为ARM指令集架构,所述第二指令集架构为X86指令集架构的情况下,如果所述访问指令为基于线程指针和固定偏移的访问指令,且所述固定偏移小于零,则所述访问指令为所述第一类型的访问指令。
6.根据权利要求2所述的方法,其特征在于,所述根据所述访问指令的类型对应的翻译方式,对所述访问指令进行翻译,包括:
如果所述访问指令的类型为所述第二类型,则将所述访问指令所访问的地址翻译为目标地址,其中所述目标地址为所述主程序的TLS数据在所述内存中的地址。
7.根据权利要求6所述的方法,其特征在于:
如果所述第一指令集架构为X86指令集架构,所述第二指令集架构为ARM指令集架构,则所述目标地址等于所述访问指令访问的原始地址与第一数值之和;或者,
如果所述第一指令集架构为ARM指令集架构,所述第二指令集架构为X86指令集架构,则所述目标地址等于所述访问指令访问的原始地址与第一数值之差;
其中,所述第一数值等于第二数值和第三数值之和,所述第二数值等于所述主程序的TLS数据所占用的内存空间的大小,所述第三数值等于所述第二指令集架构相关的动态线程向量所占用的内存空间的大小。
8.根据权利要求6所述的方法,其特征在于,所述确定所述访问指令的类型,包括:
在所述第一指令集架构为X86指令集架构,所述第二指令集架构为ARM指令集架构的情况下,如果所述访问指令为基于线程指针和固定偏移的访问指令,且所述固定偏移小于零,则所述访问指令为所述第二类型的访问指令;或者,
在所述第一指令集架构为ARM指令集架构,所述第二指令集架构为X86指令集架构的情况下,如果所述访问指令为基于线程指针和固定偏移的访问指令,且所述固定偏移大于零,则所述访问指令为所述第二类型的访问指令。
9.根据权利要求2所述的方法,其特征在于,所述根据所述访问指令的类型对应的翻译方式,对所述访问指令进行翻译,包括:
如果所述访问指令的类型为所述第三类型,则基于所述访问指令的字面语义翻译所述访问指令。
10.根据权利要求2所述的方法,其特征在于,所述确定所述访问指令的类型,包括:
如果所述访问指令为基于第一寄存器和第二寄存器的访问指令,则确定所述第二寄存器中的数值的来源是否为全局偏移表;
如果所述第二寄存器中的数值的来源为所述全局偏移表,则确定所述访问指令的类型为所述第三类型;
如果所述第二寄存器中的数值的来源不是所述全局偏移表,则确定所述访问指令的类型为所述第一类型或所述第二类型;
其中,所述第一寄存器中存储的地址为线程指针的地址。
11.一种二进制翻译装置,其特征在于,所述装置用于对基于第一指令集架构的目标程序进行二进制翻译,以在基于第二指令集架构的主机上运行所述目标程序,所述目标程序包括主程序以及所述主程序的一个或多个依赖库,所述主机包括所述一个或多个依赖库中的至少部分依赖库对应的本地原生库,且在所述主机运行所述目标程序的过程中,所述主程序调用所述本地原生库,以实现所述至少部分依赖库的功能,
所述装置包括:
加载模块,用于加载所述目标程序对应的线程数据,所述线程数据的TLS内存布局符合所述第二指令集架构对应的TLS内存布局;
第一翻译模块,用于对所述线程数据的访问指令进行二进制翻译,使得翻译后的访问指令与所述第二指令集架构对应的TLS内存布局相匹配。
12.根据权利要求11所述的装置,其特征在于,所述第一翻译模块包括:
确定模块,用于确定所述访问指令的类型;
第二翻译模块,用于根据所述访问指令的类型对应的翻译方式,对所述访问指令进行翻译;
其中,所述访问指令的类型包括以下中的一种或多种:
第一类型:基于线程指针和固定偏移对线程结构体的访问指令;
第二类型:基于线程指针和固定偏移对所述主程序的TLS数据的访问指令;以及
第三类型:基于线程指针和全局偏移表中的值对所述线程数据的访问指令。
13.根据权利要求12所述的装置,其特征在于,所述第二翻译模块具体用于:
如果所述访问指令的类型为所述第一类型,则将所述访问指令翻译成针对第一内存空间的访问指令,其中,所述第一内存空间为动态申请的内存空间,且所述第一内存空间用于模拟所述第一指令集架构相关的线程结构体。
14.根据权利要求13所述的装置,其特征在于,所述装置还包括:
预处理模块,用于在所述将所述访问指令翻译成针对第一内存空间的访问指令之前,基于所述第一指令集架构相关的线程结构体占用的内存大小,申请所述第一内存空间,并将所述第一内存空间绑定至所述目标程序的线程。
15.根据权利要求13所述的装置,其特征在于,所述确定模块具体用于:
在所述第一指令集架构为X86指令集架构,所述第二指令集架构为ARM指令集架构的情况下,如果所述访问指令为基于线程指针和固定偏移的访问指令,且所述固定偏移大于零,则所述访问指令为所述第一类型的访问指令;或者,
在所述第一指令集架构为ARM指令集架构,所述第二指令集架构为X86指令集架构的情况下,如果所述访问指令为基于线程指针和固定偏移的访问指令,且所述固定偏移小于零,则所述访问指令为所述第一类型的访问指令。
16.根据权利要求12所述的装置,其特征在于,所述第二翻译模块具体用于:
如果所述访问指令的类型为所述第二类型,则将所述访问指令所访问的地址翻译为目标地址,其中所述目标地址为所述主程序的TLS数据在所述内存中的地址。
17.根据权利要求16所述的装置,其特征在于:
如果所述第一指令集架构为X86指令集架构,所述第二指令集架构为ARM指令集架构,则所述目标地址等于所述访问指令访问的原始地址与第一数值之和;或者,
如果所述第一指令集架构为ARM指令集架构,所述第二指令集架构为X86指令集架构,则所述目标地址等于所述访问指令访问的原始地址与第一数值之差;
其中,所述第一数值等于第二数值和第三数值之和,所述第二数值等于所述主程序的TLS数据所占用的内存空间的大小,所述第三数值等于所述第二指令集架构相关的动态线程向量所占用的内存空间的大小。
18.根据权利要求16所述的装置,其特征在于,所述确定模块具体用于:
在所述第一指令集架构为X86指令集架构,所述第二指令集架构为ARM指令集架构的情况下,如果所述访问指令为基于线程指针和固定偏移的访问指令,且所述固定偏移小于零,则所述访问指令为所述第二类型的访问指令;或者,
在所述第一指令集架构为ARM指令集架构,所述第二指令集架构为X86指令集架构的情况下,如果所述访问指令为基于线程指针和固定偏移的访问指令,且所述固定偏移大于零,则所述访问指令为所述第二类型的访问指令。
19.根据权利要求12所述的装置,其特征在于,所述第二翻译模块具体用于:
如果所述访问指令的类型为所述第三类型,则基于所述访问指令的字面语义翻译所述访问指令。
20.根据权利要求12所述的装置,其特征在于,所述确定模块具体用于:
如果所述访问指令为基于第一寄存器和第二寄存器的访问指令,则确定所述第二寄存器中的数值的来源是否为全局偏移表;
如果所述第二寄存器中的数值的来源为所述全局偏移表,则确定所述访问指令的类型为所述第三类型;
如果所述第二寄存器中的数值的来源不是所述全局偏移表,则确定所述访问指令的类型为所述第一类型或所述第二类型;
其中,所述第一寄存器中存储的地址为线程指针的地址。
21.一种计算设备,其特征在于,包括:
存储器,用于存储代码;
处理器,用于执行所述存储器中存储的代码,以执行如权利要求1-10中任一项所述的方法。
22.一种计算机可读存储介质,其特征在于,其上存储有用于执行如权利要求1-10中任一项所述的方法的代码。
CN202211326583.8A 2022-10-27 2022-10-27 二进制翻译方法及装置 Active CN115421875B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211326583.8A CN115421875B (zh) 2022-10-27 2022-10-27 二进制翻译方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211326583.8A CN115421875B (zh) 2022-10-27 2022-10-27 二进制翻译方法及装置

Publications (2)

Publication Number Publication Date
CN115421875A true CN115421875A (zh) 2022-12-02
CN115421875B CN115421875B (zh) 2023-01-03

Family

ID=84207529

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211326583.8A Active CN115421875B (zh) 2022-10-27 2022-10-27 二进制翻译方法及装置

Country Status (1)

Country Link
CN (1) CN115421875B (zh)

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6609248B1 (en) * 1999-06-30 2003-08-19 Microsoft Corporation Cross module representation of heterogeneous programs
CN102087609A (zh) * 2011-02-23 2011-06-08 中国人民解放军国防科学技术大学 多处理器平台下的动态二进制翻译方法
CN110321235A (zh) * 2019-07-08 2019-10-11 北京可信华泰信息技术有限公司 基于双体系架构的可信计算平台的系统交互方法和装置

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6609248B1 (en) * 1999-06-30 2003-08-19 Microsoft Corporation Cross module representation of heterogeneous programs
CN102087609A (zh) * 2011-02-23 2011-06-08 中国人民解放军国防科学技术大学 多处理器平台下的动态二进制翻译方法
CN110321235A (zh) * 2019-07-08 2019-10-11 北京可信华泰信息技术有限公司 基于双体系架构的可信计算平台的系统交互方法和装置

Also Published As

Publication number Publication date
CN115421875B (zh) 2023-01-03

Similar Documents

Publication Publication Date Title
CN107077337B (zh) 用于执行根据两个指令集架构编译的应用编码的系统和方法
US8799879B2 (en) Method and apparatus for protecting translated code in a virtual machine
US9063759B2 (en) Optimizing subroutine calls based on architecture level of called subroutine
US8428930B2 (en) Page mapped spatially aware emulation of a computer instruction set
US9158566B2 (en) Page mapped spatially aware emulation of computer instruction set
US10255088B2 (en) Modification of write-protected memory using code patching
US8447583B2 (en) Self initialized host cell spatially aware emulation of a computer instruction set
US8301434B2 (en) Host cell spatially aware emulation of a guest wild branch
US11650754B2 (en) Data accessing method, device, and storage medium
WO2019005228A1 (en) AUTOMATED ADAPTATION OF A SOURCE CODE IN ORDER TO INJECT FUNCTIONS BETWEEN VERSIONS OF A PLATFORM
US10592407B2 (en) Short pointer mode applications in long pointer mode environments
CN114327777A (zh) 确定全局页目录的方法、装置、电子设备及存储介质
CN112882694A (zh) 一种程序编译方法、装置、电子设备及可读存储介质
US20140282534A1 (en) Virtual environment having harvard architecture
US9015027B2 (en) Fast emulation of virtually addressed control flow
CN117573419B (zh) 一种页面异常处理方法及装置
EP2828747A1 (en) Hybrid emulation and kernel function processing systems and methods
CN117075960B (zh) 程序重构方法、应用跨平台迁移方法、装置与计算设备
CN115421875B (zh) 二进制翻译方法及装置
US11663012B1 (en) Systems and methods for detecting coroutines
CN115421876B (zh) 二进制翻译方法及装置
US12014198B2 (en) Running smaller memory-address width program code in a larger memory-address width address space
CN111949301B (zh) 应用程序热更新方法、装置和计算机可读存储介质
US20240004670A1 (en) Computer system executing multiple operating systems
CN114996176A (zh) 访存方法、计算设备以及存储介质

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
GR01 Patent grant
GR01 Patent grant