专利详情

标题一种自动并行化的低耦合动态二进制翻译工具及方法
[标]当前申请(专利权)人南开大学
申请日2024年6月26日
申请号CN202410836292.6
公开(公告)日2024年9月24日
公开(公告)号CN118689489A
授权日-
法律状态/事件公开
专利类型发明申请
发明人郑博月 | 张金 | 宫晓利
受理局中国
当前申请人(专利权)地址300071 天津市南开区卫津路94号 (天津,天津,南开区)
IPC分类号G06F8/52 | G06F8/41 | G06F40/30
国民经济行业分类号I6540 | I6531 | I6511 | I6513 | I6512 | I6519
代理机构北京慕达星云知识产权代理事务所(特殊普通合伙)
代理人万晶晶
被引用专利数量-
专利价值-

摘要

本发明公开了一种自动并行化的低耦合动态二进制翻译工具及方法,包括QEMU端、进程间通信管道、Instrew Server端和目标代码缓存;QEMU端用于加载原架构二进制文件并初始化,通过进程间通信管道发送维护的处理器状态和初始化请求,查找是否已经被翻译过,有则加载并执行,否则从目标代码缓存中寻找,有则加载并执行,否则发起翻译请求,翻译完成后从目标代码缓存中加载并执行;Instrew Server端用于初始化并建立寄存器映射关系,接收翻译请求根据代码地址加载对应代码片段,解码代码块翻译为中间语言并进行优化,生成目标二进制文件并存入目标代码缓存;本发明实现了自动并行优化代码的低耦合并降低执行开销。

1.一种自动并行化的低耦合动态二进制翻译工具,其特征在于,包括QEMU端、进程间通信管道、Instrew Server端和目标代码缓存;
QEMU端,用于加载原架构指令集下的二进制文件并进行程序运行环境的初始化,通过进程间通信管道发送QEMU维护的处理器状态和初始化请求至Instrew Server端,初始化完成后根据程序入口地址查找是否有已经被翻译过的代码,如果有,加载并执行;如果没有,从目标代码缓存中寻找对应代码片段,如果找到,则加载并执行;如果没有找到,则利用进程间通信管道向Instrew Server端发起翻译请求,还用于接收Instrew Server端翻译完成的消息,从目标代码缓存中加载ELF格式存储的代码片段,加载并执行;
Instrew Server端,用于接收QEMU维护的处理器状态和初始化请求,进行初始化并与QEMU端建立寄存器映射关系,在收到翻译请求后根据代码地址从QEMU端加载的二进制文件中加载对应代码片段,解码得到需要翻译的代码块,翻译为中间语言并进行优化,最终生成目标平台下ELF格式的二进制文件并存入目标代码缓存中,通过进程间通信管回复QEMU端翻译完成的消息。
2.根据权利要求1所述的一种自动并行化的低耦合动态二进制翻译工具,其特征在于,QEMU端包括QEMU后端、QEMU代理和QA API;
QEMU后端与QEMU代理通过QA API进行交互;
QEMU代理与Instrew Server端通过使用进程间通信管道进行通信。
3.根据权利要求2所述的一种自动并行化的低耦合动态二进制翻译工具,其特征在于:
QEMU后端,用于初始化程序环境后,使用内存中一段连续的区域存储翻译过的代码片段,在每次运行前查找区域中是否含有翻译过的代码片段,查找到则加载并执行,未找到则利用QA API交付QEMU代理进行处理,Instrew Server端翻译完成后从QEMU后端的缓存中加载并执行;
QEMU代理,用于启动Instrew Server端进程,在QEMU后端初始化完成后,利用管道向Instrew Server端发起初始化的请求,并将QEMU维护的处理器状态发送给Instrew Server端,接受Instrew Server端初始化完成的消息,未在QEMU后端的代码缓存和目标代码缓存中找到翻译过的代码片段时,发起翻译请求,接受翻译成功和翻译失败的消息,翻译成功时负责从目标代码缓存中加载代码片段并存储到QEMU后端的代码缓存中,发送执行结束的消息以及接受包含有Instrew Server端退出状态的消息。
4.根据权利要求1所述的一种自动并行化的低耦合动态二进制翻译工具,其特征在于,Instrew Server端包括解码模块、Rellume模块、自动并行优化模块和目标代码生成模块;
解码模块,用于在收到翻译请求后根据代码地址从QEMU端加载的二进制文件中加载对应代码片段,解码得到类Function粒度代码块;
Rellume模块,用于根据QEMU维护的处理器状态建立源架构寄存器和目标架构寄存器之间的映射,将类Function粒度代码块翻译为中间语言LLVM IR;
自动并行优化模块,用于使用通用的LLVM Pass以及自定义优化Pass,进行初步优化、代码重构及语义恢复,得到优化后的LLVM IR,并生成目标架构的可并行执行的多线程代码;
目标代码生成模块,用于将可并行执行的多线程代码打包成ELF二进制文件存入目标代码缓存中。
5.根据权利要求1所述的一种自动并行化的低耦合动态二进制翻译工具,其特征在于,自动并行优化模块包括已有LLVM Pass、IR重构Pass、GEP指令恢复Pass和已有Polly Pass;
已有LLVM Pass,用于对中间语言LLVM IR进行初步的优化;
IR重构Pass,用于结合翻译规则识别模拟堆栈操作中对临时变量的读写,而后对对应部分的代码进行改写,在保证正确性的前提下去除不必要的内存依赖关系;
GEP指令恢复Pass,用于对可并行优化的代码部分根据地址计算的相关指令得到数组维度及各维度大小,并将对数组元素的访问改写为GEP指令;
已有Polly Pass,用于对改写后代码进行处理,检测分析其中可并行优化的代码部分,以及基于改写后的GEP指令生成可并行执行的多线程代码。
6.根据权利要求3所述的一种自动并行化的低耦合动态二进制翻译工具,其特征在于,解码模块解码得到类Function粒度代码块的过程为:从未翻译过的地址开始将二进制文件中的机器码指令依次翻译成汇编代码,遇到非直接跳转或call指令,将所有已经翻译成汇编代码的代码块看作一个翻译单元即类Function粒度代码块。
7.一种自动并行化的低耦合动态二进制翻译方法,其特征在于,包括以下步骤:
S1.QEMU端加载原架构指令集下的二进制文件并进行程序运行环境的初始化,通过进程间通信管道发送QEMU维护的处理器状态和初始化请求至Instrew Server端;
S2.Instrew Server端接收QEMU维护的处理器状态和初始化请求,进行初始化并与QEMU端建立寄存器映射关系;
S3.初始化完成后QEMU端根据程序入口地址查找是否有已经被翻译过的代码,如果有,加载并执行;如果没有,从目标代码缓存中寻找对应代码片段,如果找到,则加载并执行;如果没有找到,则利用进程间通信管道向Instrew Server端发起翻译请求;
S4.Instrew Server端在收到翻译请求后根据代码地址从QEMU端加载的二进制文件中加载对应代码片段,解码得到需要翻译的代码块,翻译为中间语言并进行优化,最终生成目标平台下ELF格式的二进制文件并存入目标代码缓存中,通过进程间通信管回复QEMU端翻译完成的消息;
S5.QEMU端接收Instrew Server端翻译完成的消息,从目标代码缓存中加载ELF格式存储的代码片段,加载并执行。
8.根据权利要求7所述的一种自动并行化的低耦合动态二进制翻译方法,其特征在于,QEMU端包括QEMU后端、QEMU代理和QA API;QEMU后端与QEMU代理通过QA API进行交互;QEMU代理与Instrew Server端通过使用进程间通信管道进行通信;
QEMU后端加载原架构指令集下的二进制文件并进行程序运行环境的初始化;在QEMU后端初始化完成后,QEMU代理利用管道向Instrew Server端发起初始化的请求,并将QEMU维护的处理器状态发送给Instrew Server端进行初始化;QEMU代理接受Instrew Server端初始化完成的消息,QEMU后端使用内存中一段连续的区域存储翻译过的代码片段,在每次运行前查找区域中是否含有翻译过的代码片段,查找到则加载并执行,未找到则利用QA API交付QEMU代理发起翻译请求。
9.根据权利要求7所述的一种自动并行化的低耦合动态二进制翻译方法,其特征在于,步骤S4的具体内容为:
S41.在收到翻译请求后根据代码地址从QEMU端加载的二进制文件中加载对应代码片段,解码得到类Function粒度代码块;
S42.根据建立的源架构寄存器和目标架构寄存器之间的映射,将类Function粒度代码块翻译为中间语言LLVM IR;
S43.使用通用的LLVM Pass以及自定义优化Pass,进行初步优化、代码重构及语义恢复,得到优化后的LLVM IR,并生成目标架构的可并行执行的多线程代码;
S44.将可并行执行的多线程代码打包成ELF二进制文件存入目标代码缓存中。
10.根据权利要求9所述的一种自动并行化的低耦合动态二进制翻译方法,其特征在于,步骤S43的具体内容为:
S431.对中间语言LLVM IR进行初步的优化;
S432.结合翻译规则识别模拟堆栈操作中对临时变量的读写,而后对对应部分的代码进行改写,在保证正确性的前提下去除不必要的内存依赖关系;
S433.对可并行优化的代码部分根据地址计算的相关指令得到数组维度及各维度大小,并将对数组元素的访问改写为GEP指令;
S434.对改写后代码进行处理,检测分析其中可并行优化的代码部分,以及基于改写后的GEP指令生成可并行执行的多线程代码。

技术领域
[0001]本发明涉及计算机技术领域,更具体的说是涉及一种自动并行化的低耦合动态二进制翻译工具及方法。
背景技术
[0002]二进制翻译技术是指对二进制文件进行跨架构的指令翻译,可将某一架构下的二进制文件经过解码、中间语言表示及优化、目标平台机器码生成等步骤生成指定架构下的二进制文件,从而实现在缺少源程序的情况下模拟原程序功能、逆向分析等目的。
[0003]目前,静态二进制技术SBT可在离线状态下进行,但SBT往往存在代码发现、识别自修改代码问题,需要用户干涉翻译进程或者结合接下来讲到的动态二进制翻译技术来进行解决;动态二进制翻译技术DBT可以很好地解决上述讲到的静态二进制翻译技术中遇到的问题。
[0004]但是,现有的动态二进制翻译技术存在以下缺点:
[0005]高耦合:现有的动态二进制翻译工具往往具有较高的耦合度,前端解码、中端优化、后端执行三个部分往往集成在一起,导致进行开发改进时往往牵一发而动全身,给开发维护带来了一定难度:当出现新的体系架构或者新的需求时,需要在整体从头至尾对DBT工具进行相应的修改,时间和人力耗费较大;
[0006]执行开销:动态二进制翻译技术主要分为翻译和执行过程,动态二进制翻译的运行时,由于需要边翻译边执行,以及需要在翻译过程中对代码进行优化,翻译和优化时间都会计入运行时开销内,所以,动态二进制翻译过程中的翻译和优化过程应当尽量简化,减少时间消耗,于是许多研究关注于翻译和优化过程的优化,尽量使这两个过程更为简单和快速,然而调研发现,具有并行特点的程序中,执行开销实际上占了很大一部分。
[0007]因此,如何实现自动并行优化代码的低耦合,以及降低执行开销,是本领域技术人员亟需解决的问题。
发明内容
[0008]有鉴于此,本发明提供了一种自动并行化的低耦合动态二进制翻译工具及方法以解决背景技术中提到的部分技术问题。
[0009]为了实现上述目的,本发明采用如下技术方案:
[0010]一种自动并行化的低耦合动态二进制翻译工具,包括QEMU端、进程间通信管道、Instrew Server端和目标代码缓存;
[0011]QEMU端,用于加载原架构指令集下的二进制文件并进行程序运行环境的初始化,通过进程间通信管道发送QEMU维护的处理器状态和初始化请求至Instrew Server端,初始化完成后根据程序入口地址查找是否有已经被翻译过的代码,如果有,加载并执行;如果没有,从目标代码缓存中寻找对应代码片段,如果找到,则加载并执行;如果没有找到,则利用进程间通信管道向Instrew Server端发起翻译请求,还用于接收Instrew Server端翻译完成的消息,从目标代码缓存中加载ELF格式存储的代码片段,加载并执行;
[0012]Instrew Server端,用于接收QEMU维护的处理器状态和初始化请求,进行初始化并与QEMU端建立寄存器映射关系,在收到翻译请求后根据代码地址从QEMU端加载的二进制文件中加载对应代码片段,解码得到需要翻译的代码块,翻译为中间语言并进行优化,最终生成目标平台下ELF格式的二进制文件并存入目标代码缓存中,通过进程间通信管回复QEMU端翻译完成的消息。
[0013]优选的,QEMU端包括QEMU后端、QEMU代理和QA API;
[0014]QEMU后端与QEMU代理通过QA API进行交互;
[0015]QEMU代理与Instrew Server端通过使用进程间通信管道进行通信。
[0016]优选的,QEMU后端,用于初始化程序环境后,使用内存中一段连续的区域存储翻译过的代码片段,在每次运行前查找区域中是否含有翻译过的代码片段,查找到则加载并执行,未找到则利用QA API交付QEMU代理进行处理,Instrew Server端翻译完成后从QEMU后端的缓存中加载并执行;
[0017]QEMU代理,用于启动Instrew Server端进程,在QEMU后端初始化完成后,利用管道向Instrew Server端发起初始化的请求,并将QEMU维护的处理器状态发送给InstrewServer端,接受Instrew Server端初始化完成的消息,未在QEMU后端的代码缓存和目标代码缓存中找到翻译过的代码片段时,发起翻译请求,接受翻译成功和翻译失败的消息,翻译成功时负责从目标代码缓存中加载代码片段并存储到QEMU后端的代码缓存中,发送执行结束的消息以及接受包含有Instrew Server端退出状态的消息。
[0018]优选的,Instrew Server端包括解码模块、Rellume模块、自动并行优化模块和目标代码生成模块;
[0019]解码模块,用于在收到翻译请求后根据代码地址从QEMU端加载的二进制文件中加载对应代码片段,解码得到类Function粒度代码块;
[0020]Rellume模块,用于根据QEMU维护的处理器状态建立源架构寄存器和目标架构寄存器之间的映射,将类Function粒度代码块翻译为中间语言LLVM IR;
[0021]自动并行优化模块,用于使用通用的LLVM Pass以及自定义优化Pass,进行初步优化、代码重构及语义恢复,得到优化后的LLVM IR,并生成目标架构的可并行执行的多线程代码;
[0022]目标代码生成模块,用于将可并行执行的多线程代码打包成ELF二进制文件存入目标代码缓存中。
[0023]优选的,自动并行优化模块包括已有LLVM Pass、IR重构Pass、GEP指令恢复Pass和已有Polly Pass;
[0024]已有LLVM Pass,用于对中间语言LLVM IR进行初步的优化;
[0025]IR重构Pass,用于结合翻译规则识别模拟堆栈操作中对临时变量的读写,而后对对应部分的代码进行改写,在保证正确性的前提下去除不必要的内存依赖关系;
[0026]GEP指令恢复Pass,用于对可并行优化的代码部分根据地址计算的相关指令得到数组维度及各维度大小,并将对数组元素的访问改写为GEP指令;
[0027]已有Polly Pass,用于对改写后代码进行处理,检测分析其中可并行优化的代码部分,以及基于改写后的GEP指令生成可并行执行的多线程代码。
[0028]优选的,解码模块解码得到类Function粒度代码块的过程为:从未翻译过的地址开始将二进制文件中的机器码指令依次翻译成汇编代码,遇到非直接跳转或call指令,将所有已经翻译成汇编代码的代码块看作一个翻译单元即类Function粒度代码块。
[0029]一种自动并行化的低耦合动态二进制翻译方法,包括以下步骤:
[0030]S1.QEMU端加载原架构指令集下的二进制文件并进行程序运行环境的初始化,通过进程间通信管道发送QEMU维护的处理器状态和初始化请求至Instrew Server端;
[0031]S2.Instrew Server端接收QEMU维护的处理器状态和初始化请求,进行初始化并与QEMU端建立寄存器映射关系;
[0032]S3.初始化完成后QEMU端根据程序入口地址查找是否有已经被翻译过的代码,如果有,加载并执行;如果没有,从目标代码缓存中寻找对应代码片段,如果找到,则加载并执行;如果没有找到,则利用进程间通信管道向Instrew Server端发起翻译请求;
[0033]S4.Instrew Server端在收到翻译请求后根据代码地址从QEMU端加载的二进制文件中加载对应代码片段,解码得到需要翻译的代码块,翻译为中间语言并进行优化,最终生成目标平台下ELF格式的二进制文件并存入目标代码缓存中,通过进程间通信管回复QEMU端翻译完成的消息;
[0034]S5.QEMU端接收Instrew Server端翻译完成的消息,从目标代码缓存中加载ELF格式存储的代码片段,加载并执行。
[0035]优选的,QEMU端包括QEMU后端、QEMU代理和QA API;QEMU后端与QEMU代理通过QAAPI进行交互;QEMU代理与Instrew Server端通过使用进程间通信管道进行通信;
[0036]QEMU后端加载原架构指令集下的二进制文件并进行程序运行环境的初始化;在QEMU后端初始化完成后,QEMU代理利用管道向Instrew Server端发起初始化的请求,并将QEMU维护的处理器状态发送给Instrew Server端进行初始化;QEMU代理接受InstrewServer端初始化完成的消息,QEMU后端使用内存中一段连续的区域存储翻译过的代码片段,在每次运行前查找区域中是否含有翻译过的代码片段,查找到则加载并执行,未找到则利用QA API交付QEMU代理发起翻译请求。
[0037]优选的,步骤S4的具体内容为:
[0038]S41.在收到翻译请求后根据代码地址从QEMU端加载的二进制文件中加载对应代码片段,解码得到类Function粒度代码块;
[0039]S42.根据建立的源架构寄存器和目标架构寄存器之间的映射,将类Function粒度代码块翻译为中间语言LLVM IR;
[0040]S43.使用通用的LLVM Pass以及自定义优化Pass,进行初步优化、代码重构及语义恢复,得到优化后的LLVM IR,并生成目标架构的可并行执行的多线程代码;
[0041]S44.将可并行执行的多线程代码打包成ELF二进制文件存入目标代码缓存中。
[0042]优选的,步骤S43的具体内容为:
[0043]S431.对中间语言LLVM IR进行初步的优化;
[0044]S432.结合翻译规则识别模拟堆栈操作中对临时变量的读写,而后对对应部分的代码进行改写,在保证正确性的前提下去除不必要的内存依赖关系;
[0045]S433.对可并行优化的代码部分根据地址计算的相关指令得到数组维度及各维度大小,并将对数组元素的访问改写为GEP指令;
[0046]S434.对改写后代码进行处理,检测分析其中可并行优化的代码部分,以及基于改写后的GEP指令生成可并行执行的多线程代码。
[0047]经由上述的技术方案可知,与现有技术相比,本发明公开提供了一种自动并行化的低耦合动态二进制翻译工具及方法,选用LLVM IR作为中间语言,结合Instrew工具和QEMU分别担任二进制文件的翻译优化工作和翻译后代码的执行工作,这种低耦合的模式使得研究人员能够灵活应用优化方法,而不用过多考虑给DBT其他部分带来的影响;
[0048]使用Instrew直接将机器码提升为LLVM IR,减少了将机器码首先提升为TCG IR再提升为LLVM IR而产生的额外开销;
[0049]使用Instrew,使得优化能够在类Function粒度上进行优化,类Function粒度的翻译单元中能够更多地包含结构及语义信息,从而能够更加有利于后期代码及结构语义的恢复;
[0050]通过使用已有的LLVM Pass及自定义实现的Pass来重构代码并恢复语义信息,从而结合Polly工具实现串行代码的自动并行化,充分利用多核平台可并行执行提高程序性能的特点,大大缩短程序的执行时间。
附图说明
[0051]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
[0052]图1为本发明提供的一种自动并行化的低耦合动态二进制翻译工具的框架示意图;
[0053]图2为本发明提供的寄存器映射情况示意图。
具体实施方式
[0054]下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0055]本发明实施例公开了一种自动并行化的低耦合动态二进制翻译工具,如图1,包括QEMU端、进程间通信管道、Instrew Server端和目标代码缓存;
[0056]QEMU端,用于加载原架构指令集下的二进制文件并进行程序运行环境的初始化,通过进程间通信管道发送QEMU维护的处理器状态和初始化请求至Instrew Server端,初始化完成后根据程序入口地址查找是否有已经被翻译过的代码,如果有,加载并执行;如果没有,从目标代码缓存中寻找对应代码片段,如果找到,则加载并执行;如果没有找到,则利用进程间通信管道向Instrew Server端发起翻译请求,还用于接收Instrew Server端翻译完成的消息,从目标代码缓存中加载ELF格式存储的代码片段,加载并执行;
[0057]Instrew Server端,用于接收QEMU维护的处理器状态和初始化请求,进行初始化并与QEMU端建立寄存器映射关系,在收到翻译请求后根据代码地址从QEMU端加载的二进制文件中加载对应代码片段,解码得到需要翻译的代码块,翻译为中间语言并进行优化,最终生成目标平台下ELF格式的二进制文件并存入目标代码缓存中,通过进程间通信管回复QEMU端翻译完成的消息。
[0058]为了进一步实施上述技术方案,QEMU端包括QEMU后端、QEMU代理和QA API;
[0059]QEMU后端与QEMU代理通过QA API进行交互;
[0060]QEMU代理与Instrew Server端通过使用进程间通信管道进行通信。
[0061]在本实施例中,Instrew Server端和QEMU Agent的通信依靠两个管道(进程间通信管道)来实现,管道传输的消息类型有:带有代码地址的翻译请求、翻译完成信号、翻译失败信号、初始化信号、未翻译的代码块等,QEMU后端承担了Instrew的Client端的角色,通过QEMU Agent使用管道与Server端进行通信。
[0062]为了进一步实施上述技术方案,QEMU后端,实现主要依靠QEMU的用户模式,QEMU在初始化完环境后,会循环调用执行代码的函数(cpu-exec),该函数参数即为QEMU后端维护的处理器状态CPUState,模拟了源平台的运行环境和寄存器;用于初始化程序环境后,使用内存中一段连续的区域存储翻译过的代码片段,在每次运行前查找区域中是否含有翻译过的代码片段,查找到则加载并执行,未找到则利用QA API交付QEMU代理进行处理,InstrewServer端翻译完成后从QEMU后端的缓存中加载并执行;
[0063]QEMU代理,用于启动Instrew Server端进程,在QEMU后端初始化完成后,利用管道向Instrew Server端发起初始化的请求,并将QEMU维护的处理器状态发送给InstrewServer端,接受Instrew Server端初始化完成的消息,未在QEMU后端的代码缓存和目标代码缓存中找到翻译过的代码片段时,发起翻译请求,接受翻译成功和翻译失败的消息,翻译成功时负责从目标代码缓存中加载代码片段并存储到QEMU后端的代码缓存中,发送执行结束的消息以及接受包含有Instrew Server端退出状态的消息。
[0064]在本实施例中,动态二进制翻译工具的共同特点是维护一个目标平台的处理器及运行环境(堆栈)状态,并及时根据代码运行结果对其进行更新,然而Instrew和QEMU维护的处理器状态存在差异,需要实现特定的映射来作为两者之间的桥梁,QEMU Agent会在QEMU后端初始化完成后,利用管道向Instrew Server发起初始化的请求,并将QEMU维护的处理器状态发送给Instrew Server端,使其能够根据该信息建立QEMU后端和Instrew所管理寄存器之间的映射;例如,QEMU后端维护的处理器结构体存储顺序是eax、ecx,InstrewServer端翻译时使用到的结构体存储顺序为ecx、eax,那么,该映射可以在翻译过程中将对结构体中第一个变量位置的读写,映射到对第二个变量的读写上去,使得Instrew Server翻译过的代码可在QEMU后端正确运行。
[0065]为了进一步实施上述技术方案,Instrew Server端包括解码模块、Rellume模块、自动并行优化模块和目标代码生成模块;
[0066]解码模块,用于在收到翻译请求后根据代码地址从QEMU端加载的二进制文件中加载对应代码片段,解码得到类Function粒度代码块;
[0067]Rellume模块,用于根据QEMU维护的处理器状态建立源架构寄存器和目标架构寄存器之间的映射,将类Function粒度代码块翻译为中间语言LLVM IR;
[0068]自动并行优化模块,用于使用通用的LLVM Pass以及自定义优化Pass,进行初步优化、代码重构及语义恢复,得到优化后的LLVM IR,并生成目标架构的可并行执行的多线程代码;
[0069]目标代码生成模块,用于将可并行执行的多线程代码打包成ELF二进制文件存入目标代码缓存中。
[0070]为了进一步实施上述技术方案,自动并行优化模块包括已有LLVM Pass、IR重构Pass、GEP指令恢复Pass和已有Polly Pass;
[0071]已有LLVM Pass,用于对中间语言LLVM IR进行初步的优化;
[0072]IR重构Pass,用于结合翻译规则识别模拟堆栈操作中对临时变量的读写,而后对对应部分的代码进行改写,在保证正确性的前提下去除不必要的内存依赖关系;
[0073]例如,X86-64作为目标架构时,LLVM可提供HHVM调用约定。这一调用约定实际设计目的是为HipHop虚拟机制定调用方案,该虚拟机用作PHP和Hack,HHVM调用约定可传递15个参数,返回14个值,x86架构中的16个通用寄存器只有r12、rsp两个寄存器是由被调用者保存的,Instrew应用了这一调用约定来加快重写过程,在切换函数执行时,在目标平台提供的寄存器中保存12个通用寄存器的值,在访问相关值时,通过规定好的寄存器映射找到存储有所需值的寄存器,从而将对内存的访问转化为了对寄存器的访问,大大减少了访存开销,除此之外,还传递了CPU结构指针作为参数,并额外返回下一条指令的地址;另有一个寄存器保留,减少寄存器压力,寄存器映射情况如图2所示。
[0074]GEP指令恢复Pass,用于对可并行优化的代码部分根据地址计算的相关指令得到数组维度及各维度大小,并将对数组元素的访问改写为GEP指令;
[0075]已有Polly Pass,用于对改写后代码进行处理,检测分析其中可并行优化的代码部分,以及基于改写后的GEP指令生成可并行执行的多线程代码。
[0076]例如:将x86的二进制文件运行在arm架构下,Instrew Server端在拿到未翻译过的地址后,从这个地址开始,将二进制文件中的机器码一个一个指令地翻译成汇编代码,直到遇到ret指令(或者其他非直接跳转指令)后,会将所有已经翻译成汇编代码的代码块看作一个翻译单元;之后,Instrew Server端利用子模块rellume,将这个翻译单元提升(lift)成为LLVM IR,在LLVM IR的基础上,应用一系列的Pass来对它进行优化,这些Pass就包括了自动并行优化的部分(识别临时变量,临时变量回复、GEP指令恢复等等),所有Pass运行完后,就可以得到优化后的LLVM IR,之后基于这份LLVM IR代码块生成arm架构的机器码,并打包成ELF二进制文件放到代码缓存中,并告知QEMU代理翻译完成的消息。
[0077]为了进一步实施上述技术方案,解码模块解码得到类Function粒度代码块的过程为:从未翻译过的地址开始将二进制文件中的机器码指令依次翻译成汇编代码,遇到非直接跳转或call指令,将所有已经翻译成汇编代码的代码块看作一个翻译单元即类Function粒度代码块。
[0078]一种自动并行化的低耦合动态二进制翻译方法,包括以下步骤:
[0079]S1.QEMU端加载原架构指令集下的二进制文件并进行程序运行环境的初始化,通过进程间通信管道发送QEMU维护的处理器状态和初始化请求至Instrew Server端;
[0080]S2.Instrew Server端接收QEMU维护的处理器状态和初始化请求,进行初始化并与QEMU端建立寄存器映射关系;
[0081]S3.初始化完成后QEMU端根据程序入口地址查找是否有已经被翻译过的代码,如果有,加载并执行;如果没有,从目标代码缓存中寻找对应代码片段,如果找到,则加载并执行;如果没有找到,则利用进程间通信管道向Instrew Server端发起翻译请求;
[0082]S4.Instrew Server端在收到翻译请求后根据代码地址从QEMU端加载的二进制文件中加载对应代码片段,解码得到需要翻译的代码块,翻译为中间语言并进行优化,最终生成目标平台下ELF格式的二进制文件并存入目标代码缓存中,通过进程间通信管回复QEMU端翻译完成的消息;
[0083]S5.QEMU端接收Instrew Server端翻译完成的消息,从目标代码缓存中加载ELF格式存储的代码片段,加载并执行。
[0084]为了进一步实施上述技术方案,QEMU端包括QEMU后端、QEMU代理和QA API;QEMU后端与QEMU代理通过QA API进行交互;QEMU代理与Instrew Server端通过使用进程间通信管道进行通信;
[0085]QEMU后端加载原架构指令集下的二进制文件并进行程序运行环境的初始化;在QEMU后端初始化完成后,QEMU代理利用管道向Instrew Server端发起初始化的请求,并将QEMU维护的处理器状态发送给Instrew Server端进行初始化;QEMU代理接受InstrewServer端初始化完成的消息,QEMU后端使用内存中一段连续的区域存储翻译过的代码片段,在每次运行前查找区域中是否含有翻译过的代码片段,查找到则加载并执行,未找到则利用QA API交付QEMU代理发起翻译请求。
[0086]为了进一步实施上述技术方案,步骤S4的具体内容为:
[0087]S41.在收到翻译请求后根据代码地址从QEMU端加载的二进制文件中加载对应代码片段,解码得到类Function粒度代码块;
[0088]S42.根据建立的源架构寄存器和目标架构寄存器之间的映射,将类Function粒度代码块翻译为中间语言LLVM IR;
[0089]S43.使用通用的LLVM Pass以及自定义优化Pass,进行初步优化、代码重构及语义恢复,得到优化后的LLVM IR,并生成目标架构的可并行执行的多线程代码;
[0090]S44.将可并行执行的多线程代码打包成ELF二进制文件存入目标代码缓存中。
[0091]为了进一步实施上述技术方案,步骤S43的具体内容为:
[0092]S431.对中间语言LLVM IR进行初步的优化;
[0093]S432.结合翻译规则识别模拟堆栈操作中对临时变量的读写,而后对对应部分的代码进行改写,在保证正确性的前提下去除不必要的内存依赖关系;
[0094]S433.对可并行优化的代码部分根据地址计算的相关指令得到数组维度及各维度大小,并将对数组元素的访问改写为GEP指令;
[0095]S434.对改写后代码进行处理,检测分析其中可并行优化的代码部分,以及基于改写后的GEP指令生成可并行执行的多线程代码。
[0096]本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
[0097]对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。