一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种动静结合的二进制程序翻译方法与流程

2022-09-03 20:01:03 来源:中国专利 TAG:


1.本发明涉及二进制程序翻译技术领域,尤其涉及一种动静结合的二进制程序翻译方法。


背景技术:

2.二进制翻译器是将一种源平台(如x86)指令对应的二进制程序翻译成能够运行在另外一种目标平台(如arm)上的二进制程序的工具,即将一种指令系统对应的二进制程序(简称源二进制程序)翻译成另一种指令系统对应的二进制程序(简称目标二进制程序)。二进制翻译分为静态二进制翻译和动态二进制翻译两种翻译方法。举例来说,一个c语言在x86平台上编译的过程包括c语言-》ir-》x86二进制,要把x86二进制程序(源二进制程序)翻译成可以在arm上运行的程序(目标二进制程序),需要把x86二进制回退到ir(intermediate representation,ir,即中间表示,指编译器对于源程序进行扫描后生成的内部表示,代表源程序的语义和语法结构,编译器的各个阶段都在ir上进行分析或优化变换),再把ir转化为arm二进制程序。
3.静态二进制翻译是在二进制程序执行前进行翻译,将源平台的二进制程序(即源二进制程序)翻译成目标平台的二进制程序(即目标二进制程序),静态二进制翻译过程和程序的执行过程是两个相互独立的过程,因此静态二进制翻译可以采用多种优化手段(如进行控制流分析、数据流分析、公共子表达式删除、指令合并)等对二进制程序进行优化,减少二进制程序翻译导致的代码膨胀,提高程序在目标平台的执行性能。但是由于在实际执行前无法预知跳转分支,静态二进制翻译方法无法优化处理间接跳转指令。动态二进制翻译是采用一边翻译源二进制程序一边执行的策略,以一个基本块为单位进行翻译,翻译完源二进制程序的一个基本块后,动态二进制翻译器进入执行状态,因此动态翻译能解决间接跳转这样的静态翻译不能处理的指令。由于动态二进制翻译器采取一边翻译一边执行的策略,即翻译过程和执行过程处于同一进程,翻译的时间会影响程序在目标平台上的执行时间。并且翻译器内部难以采取过多的优化手段,这会导致目标二进制程序代码膨胀,并且翻译过程缺少有效的措施降低代码膨胀。这将导致源二进制程序在目标平台上的性能损失,最终导致动态二进制翻译效率低(假设二进制翻译是从x86到arm。在x86平台上运行时间是t1,静态翻译后在arm平台上运行时间是t2,在arm上动态翻译 运行的时间是t3。那么静态翻译的效率为t1/t2,动态翻译的效率是t2/t3)、用户体验差。
4.在现代处理器中,间接跳转是比较常见的一类指令,如pc端的x86处理器、嵌入式端的arm处理器等均会存在间接跳转。在间接跳转指令中,跳转目标(即跳转目标地址)存储在寄存器或者内存中。由于在二进制翻译时会引入代码膨胀,翻译得到的目标二进制程序代码的地址和原二进制程序的地址很难一一对应,因此间接跳转的地址在静态翻译时很难分析清楚,导致静态翻译无法处理间接跳转指令,即传统的静态翻译方法不适用于包含间接跳转指令的二进制程序翻译。而动态二进制翻译可以在动态执行时获得间接跳转在原二进制程序中的地址,实现间接跳转指令的翻译,但是若直接采用传统动态二进制翻译方法,
由于翻译过程缺少有效的措施降低代码膨胀,会导致翻译效率低、用户体验差等问题。
5.中国专利申请(公开号cn111625279a)公开了一种基于动态链接库的动静融合二进制翻译方法及系统,该方案以函数为单位划分程序,若函数为第三方库函数,则通过本地库替换方式执行;如果函数存在间接跳转分支指令,则将该函数置于动态翻译器部分翻译执行,若不存在间接跳转指令,则以基本块为单位静态翻译该函数,并记录函数翻译后的重定位信息,生成函数重定位信息表;在静态翻译过程中产生动态链接库,收集静态翻译后函数的重定位信息,指导动态翻译器的执行。但是上述方案仅适用于采用动态链接的二进制程序进行翻译,不适用于不带有动态链接的二进制程序翻译,适用范围受限,且是将存在间接跳转指令的函数置于动态翻译器进行动态翻译,静态翻译与动态翻译仍然是相互独立执行的,导致翻译效率仍然不高。
6.中国专利申请(公开号cn101452396a)公开了一种结合静态优化的动态二进制翻译方法,该方案通过在翻译后的二进制代码中插入探测指令并进行第一遍执行的方式收集丰富的剖分信息。在程序运行结束时将剖分信息和翻译后的目标代码保存到文件中,利用保存的剖分信息对翻译后的目标二进制代码在静态期间做各种优化,在此程序以后的运行中直接加载这些经过优化的目标代码。但是该方案需要在翻译后的二进制代码中插入探测指令,再进行一次执行以收集目标二进制代码运行时信息指导静态优化,不仅实现操作复杂,还会降低翻译效率、增加翻译实现开销。
7.中国专利申请(公开号cn1716202a)公开了一种动静结合二进制翻译中静态信息不完备的处理方法及装置,该方案通过从静态可翻译代码中选取一些特殊的基本块作为入口,由动态翻译执行器进行即时翻译,遇到静态翻译所留出的入口时,再重新转入静态翻译的代码,最终生成目标平台的二进制程序。但是该方案通过反复不断的静态翻译、动态交替执行来实现翻译,不断的交替翻译过程会大大降低翻译效率,且在交替翻译过程中必须依赖profile配置信息进行指导,大大增加翻译实现开销。
8.上述三种二进制程序翻译方法虽然都试图将静态翻译和动态翻译相结合,但要么适用范围受限、要么需要进行额外的执行过程、要么实现过程复杂且降低了翻译效率。如何提供一种动静结合二进制程序翻译方法,使得既能充分发挥静态翻译、动态翻译策略的优势,又能提高翻译效率、减少翻译开销仍然是本领域技术人员极为关注的技术问题。


技术实现要素:

9.本发明要解决的技术问题在于:针对现有动静结合二进制翻译方法存在的技术问题,提供一种实现方法简单、翻译效率高且开销小的动静结合二进制程序翻译方法,能够充分发挥静态翻译代码膨胀小、动态翻译能解决间接跳转这样的静态翻译不能处理的指令的优势,既减少翻译过程的开销,提高翻译效率,又提升翻译后二进制程序的性能。
10.为解决上述技术问题,本发明提出一种动静结合二进制程序翻译方法,采用以静态二进制翻译策略为主,将二进制程序中能够采用静态方法翻译的程序片段进行静态翻译和深度优化,并生成目标平台对应的二进制程序;对于静态翻译不能翻译的指令,在静态翻译后生成的目标平台对应的二进制程序中插入动态翻译函数,采用动态翻译函数对静态翻译不能翻译的指令进行动态翻译。通过这种静态翻译为主,动态翻译为辅的翻译策略,减少翻译过程带来的开销,有效提升二进制程序的性能。
11.本发明的技术方案为:
12.第一步,构建动静结合的二进制翻译系统,该系统由源程序解析模块、指令译码模块、irs(源平台相关的中间表示)优化模块、hir(high-levelir,高级中间表示,也属于源平台无关的中间表示)生成模块、irt(目标平台相关的中间表示)生成模块、irt优化模块、动态翻译函数插入模块、目标程序生成模块组成。源程序解析模块读取并识别用户输入的源平台二进制程序,得到代码段、数据段、符号表,构建地址映射表,并对数据段进行翻译得到翻译后的数据段,将符号表、代码段发送给指令译码模块,将地址映射表发送给irs优化模块,将符号表发送给irt优化模块和动态翻译函数插入模块,将翻译后的数据段发送给目标程序生成模块;指令译码模块对从源程序解析模块接收的代码段进行译码,生成源平台相关的中间表示(irs),将irs发送给irs优化模块;irs优化模块构建包含基本块列表的地址映射表和控制流图,将包含基本块列表的地址映射表、控制流图发送给irt优化模块,将包含基本块列表的地址映射表发送给目标程序生成模块,对从指令译码模块接收的irs进行优化,得到优化后的irs,将优化后的irs发送给hir生成模块;hir生成模块对从irs优化模块接收的优化后的irs进行转化,得到源平台无关的中间表示hir,将hir发送给irt生成模块;irt生成模块对从hir生成模块接收的hir进行分析转换,生成目标平台相关的中间表示(irt),将irt发送给irt优化模块;irt优化模块从irs优化模块接收包含基本块列表的地址映射表,从irt生成模块接收irt,对irt进行优化,得到优化后的irt,并将优化后的irt发送给动态翻译函数插入模块;动态翻译函数插入模块从源程序解析模块接收符号表,从irt优化模块接收优化后的irt,在符号表中插入跳转目标标签;分析优化后的irt,对优化后的irt进行标记并插入动态翻译函数,得到插入了动态翻译函数的优化后的irt,将插入了动态翻译函数的优化后的irt发送给目标程序生成模块,将插入了跳转目标标签的符号表发送给目标程序生成模块;目标程序生成模块从动态翻译函数插入模块接收插入了动态翻译函数的优化后的irt和地址映射表,生成最终的目标平台二进制程序和地址映射表。
13.第二步,源程序解析模块读取用户输入的源平台二进制程序,将源平台二进制程序识别成代码段、数据段、符号表,构建地址映射表,并在地址映射表添加函数地址和变量地址。方法是:
14.2.1源程序解析模块读取用户输入的源平台二进制程序,根据源平台二进制程序的格式,将源平台二进制程序识别成代码段(内容为指令)、数据段(内容为数据)、符号表(内容为函数名、变量名及它们在源平台二进制程序中的地址)。
15.2.2构建地址映射表,地址映射表用于存储函数及变量在源平台二进制程序中对应的地址信息,方法是:将符号表中的函数名、变量名及它们在源平台二进制程序中的地址添加到地址映射表。地址映射表由m n个表项组成,m为源平台二进制程序中函数的个数,n为源平台二进制程序中变量的个数,每个表项包含2个域,分别为函数名和函数起始地址(函数在源平台二进制程序中的起始地址),或变量名和变量地址(变量在源平台二进制程序中的地址)。
16.2.3根据源平台和目标平台大小端有无差异对源平台二进制程序的数据段进行翻译,得到翻译后的数据段,方法是:若源平台和目标平台大小端模式无差异,则将整个数据段完整拷贝出来,作为最终目标二进制程序的数据段;若源平台和目标平台大小端模式相反,则将数据段进行大端小端的转换,在不改变数据段原有属性(指数据占据的字节个数和
数据的实际值)的情况下,交换数据高位低位的顺序,将数据段调整成适合目标平台的数据组织方式。数据的组织方式包括大端模式和小端模式,大端模式指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,地址由小向大增加,数据从高位往低位放;小端模式与大端模式相反。大端小端的转换,就是按照大小端的定义,交换数据高位低位的顺序。
17.2.4将符号表、代码段发送给指令译码模块,将翻译后的数据段发送给目标程序生成模块;将地址映射表发送给irs优化模块,将符号表发送给irt优化模块和动态翻译函数插入模块。
18.第三步,指令译码模块从源程序解析模块接收符号表、代码段,将代码段翻译成源平台相关的中间表示irs,将irs发送给irs优化模块,方法是:
19.3.1令变量m=1;
20.3.2从符号表中获取第m个函数的起始地址,遍历第m个函数的每条指令,对每条指令进行译码,将指令转换成源平台相关的中间表示形式(即将源平台二进制代码还原成irs,是编码的逆过程)。这个过程中,代码段中每条源指令对应一条或者多条irs:若指令是运算指令(如普通加减乘除、移位),则一条指令对应一条irs;若指令是特殊指令(如比较指令),该类指令的执行会引起标志位(如反映运算结果的运算结果标志位,如进位标志cf、奇偶标志pf、辅助进位标志af、符号标志sf、溢出标志of、零标志zf;控制cpu操作的状态控制标志位,如追踪标志tf、中断允许标志if、方向标志df等)的变化,则一条指令对应多条irs;若指令的执行依赖标志位(如跳转指令),则一条指令对应多条irs。
21.3.3令m=m 1,若m≤m,转3.2;若m》m,将翻译得到的源平台相关的中间表示即irs发送给irs优化模块,转第四步。
22.第四步,irs优化模块从指令译码模块接收irs,从源程序解析模块接收地址映射表,对irs进行优化,得到优化后的irs,同时修改地址映射表,得到包含基本块列表的地址映射表;构建控制流图;将优化后的irs发送给hir生成模块,将包含基本块列表的地址映射表、控制流图发送给irt优化模块,将包含基本块列表的地址映射表发送给动态翻译函数插入模块。方法是:
23.4.1对irs进行基本块分割,并修改地址映射表,方法是:将irs中函数入口指令、跳转指令跳转目标地址处的第一条指令、跳转指令和函数调用指令的下一条指令作为基本块的入口;将跳转指令、函数调用指令、程序返回指令作为基本块的出口。同时,将基本块第一条指令在源平台二进制程序中的地址添加到地址映射表中,令基本块有q个,则在地址映射表中添加q个基本块表项(这q个基本块表项称为基本块列表),每个基本块表项包括基本块序号和基本块地址两个域;
24.4.2遍历4.1得到的地址映射表中基本块列表,给基本块列表中的每个基本块找到该基本块对应的父节点和子节点,即每个基本块的前驱和后继。将同一个函数中的所有基本块按前驱和后继的关系构成一个控制流图;m个函数共有m个控制流图。将m个控制流图发送给irt优化模块。
25.4.3对m个控制流图分别进行数据流分析,包括活跃变量分析、到达定值分析,构建引用-定值链(简称ud链,是一个列表,对于变量的每一次引用,到达该引用的所有定值都在ud链中)和定值-引用链(简称du链,是个集合,对于每个定义,它能到达的所有引用的集
合),计算每个基本块寄存器的活跃信息(即变量的活跃信息。对于变量x和程序点p,如果在流图中沿着从p开始的某条路径会引用变量x在p点的值,则称变量x在点p是活跃的,否则称变量x在点p不活跃),活跃信息包括与标志位相关的数据流信息。
26.4.4根据数据流分析的结果中与标志位相关的数据流信息,在irs中删除没有被使用的对标志位赋值的指令,得到优化后的irs。这有利于减少翻译过程中产生的代码膨胀,从而提升翻译后程序的执行性能;
27.4.5将优化后的irs发送给hir生成模块,将包含基本块列表的地址映射表、控制流图发送给irt优化模块,将包含基本块列表的地址映射表发送给动态翻译函数插入模块。
28.第五步,hir生成模块从irs优化模块接收优化后的irs,将优化后的irs转换成源平台无关的中间表示(hir),将hir发送给irt生成模块。方法是:
29.5.1将优化后的irs中所有和源平台相关的物理寄存器(即源平台指令集体系结构中所有可用的硬件寄存器)信息转换到全局内存空间,使得每一个源平台的物理寄存器对应一个独立的全局内存存储位置,记录每个物理寄存器在源平台中的属性(属性指物理寄存器的用途,包括:用来作为栈指针、用来存储函数调用返回地址、用来传递参数),将每个物理寄存器在源平台中的属性添加到初步优化后的irs中,得到源平台无关的中间表示即hir。
30.5.2将hir发送给irt生成模块,令hir中共有q个物理寄存器,q为正整数。
31.第六步,irt生成模块从hir生成模块接收hir,将hir转换成目标平台相关的中间表示即irt,将irt发送给irt优化模块,方法是:
32.6.1将源平台的部分寄存器(即能映射到目标平台的寄存器)映射到目标平台的寄存器,方法是:
33.6.1.1令变量q=1;
34.6.1.2读取hir中的第q个物理寄存器在源平台中的属性,对比目标平台寄存器的使用规则以及寄存器信息,将源平台的第q个物理寄存器映射到目标平台的寄存器,方法是:若在目标平台中找到同样功能和用法的寄存器,则用同样功能和用法的寄存器替换源平台二进制程序中的第q个物理寄存器,转6.1.3;若在目标平台中没有找到同样功能和用法的寄存器,则直接转6.1.3;
35.6.1.3令q=q 1,若q≤q,转6.1.2;若q》q,说明对q个物理寄存器的映射已完成,得到目标平台无关的中间表示,令目标平台无关的中间表示中共有p条目标平台无关的中间表示,p为正整数,转6.2。
36.6.2将目标平台无关的中间表示映射成目标平台相关的中间表示irt。方法是:
37.6.2.1令变量p=1;
38.6.2.2将第p条目标平台无关的中间表示作为当前中间表示操作。
39.6.2.3判定当前中间表示操作是否是目标平台直接支持的目标平台无关的操作。若是,则当前中间表示操作不需要进行变化,直接作为目标平台相关的中间表示,转6.2.5;否则,转6.2.4;
40.6.2.4判定当前中间表示操作是否是能够用目标平台指令通过组合实现的目标平台无关的操作。若是,将能够用目标平台指令通过组合实现的目标平台无关的操作转化为目标平台对应的指令组合,得到目标平台相关的中间表示irt,转6.2.6;否则,转6.2.5;
41.6.2.5在此时的目标平台相关的中间表示中插入函数调用指令,采用调用目标平台中与当前中间表示操作功能相同的库函数的形式实现当前中间表示操作的功能,转6.2.6。
42.6.2.6令p=p 1,若p≤p,转6.2.2;若p》p,说明已完成目标平台无关的中间表示到目标平台相关的中间表示的转换,将目标平台相关的中间表示irt发送给irt优化模块,转第七步。
43.第七步,irt优化模块从irs优化模块接收包含基本块列表的地址映射表、控制流图,从irt生成模块接收irt,从源程序解析模块接收符号表,对irt进行优化,得到优化后的irt,方法是:
44.7.1根据从irs优化模块接收的控制流图,对从irt生成模块接收的irt进行到达定值分析、活跃变量分析,使用分析结果构建du链和ud链;
45.7.2根据到达定值分析、活跃变量分析结果,对irt进行优化。方法是:
46.7.2.1遍历irt中的指令序列,将对常量的计算进行常量折叠,减少计算的指令数;
47.7.2.2遍历irt中的指令序列,针对寄存器拷贝指令中的目的寄存器,进行寄存器拷贝传播优化,减少寄存器搬移操作;
48.7.2.3遍历irt中的函数调用指令,读取符号表信息,识别调用的函数是否为库函数,如果为库函数,则将对源平台库函数的调用转换成对目标平台库函数的调用,同时将源平台的参数传递规则与到目标平台的参数传递规则进行转换对应,转7.2.4;如果不是库函数,直接转7.2.4;
49.7.2.4遍历irt中的指令序列,用目标平台更高效的指令(即比源平台指令字节少、执行速度更快、流水线吞吐率更高等,例如,arm平台的若干条连续的指令所实现的操作,x86平台一条指令就可以实现,本领域认为x86平台上该对等指令更高效)替代irt中的相对应的指令;
50.7.2.5对irt中的临时变量进行寄存器分配,识别循环区域,对循环区域中的临时变量优先进行寄存器分配,减少循环中寄存器的溢出,减少对内存的访问次数,提高循环的执行效率;
51.经过上述5种优化操作后,得到优化后的目标平台相关的中间表示,即优化后的irt。
52.7.3将优化后的irt发送给动态翻译函数插入模块。
53.第八步,动态翻译函数插入模块从源程序解析模块接收符号表,从irt优化模块接收优化后的irt,在符号表中插入跳转目标标签;分析优化后的irt,对优化后的irt进行标记并插入动态翻译函数,得到插入了动态翻译函数的优化后的irt,将插入了动态翻译函数的优化后的irt发送给目标程序生成模块,将插入了跳转目标标签的符号表发送给目标程序生成模块,方法是:
54.8.1动态翻译函数插入模块从源程序解析模块接收符号表,从irt优化模块接收优化后的irt,对优化后的irt中的间接跳转指令进行翻译,方法是:遍历优化后的irt中的间接跳转指令,对于能够静态推断出跳转目标的跳转指令,将跳转目标的标签(即label)插入符号表,将该间接跳转指令修改为直接跳转指令;对于不能静态推断出跳转目标的跳转指令,在优化后的irt中进行标记。这样处理后,得到了标记后的优化后的irt。将跳转目标的
label插入符号表的方法是:令能够静态推断出跳转目标的跳转指令有s条,则在符号表中添加s个跳转目标表项,每个表项包含跳转目标序号和跳转目标的label两个域。
55.8.2动态翻译函数插入模块为动态翻译函数构建一个栈,并且把动态翻译函数需要的参数压到栈中,保存动静切换现场。动态翻译函数需要4个参数,分别为源二进制程序文件名,原跳转的目标地址,地址映射表以及源平台所有寄存器状态。
56.8.3在标记后的优化后的irt中插入动态翻译函数;本发明的实质是将二进制程序中能够采用静态方法翻译的程序片段进行静态翻译和优化,生成目标平台对应的二进制程序;对于静态翻译不能翻译的指令,在静态翻译后生成的目标平台对应的二进制程序中插入动态翻译函数,采用动态翻译函数对静态翻译不能翻译的指令进行动态翻译,irt中插入动态翻译函数后,只要遇到静态翻译不能翻译的指令,动态翻译函数就开始翻译,实现动态翻译和静态翻译的有效结合。插入的动态翻译函数的执行流程为:
57.8.3.1对静态翻译的现场进行保存,保存目标平台的所有寄存器,然后构建调用堆栈。将源二进制程序文件的路径、地址映射表的路径、原跳转地址作为参数,压入到调用堆栈中,同时把源平台所有寄存器的状态按照一定顺序保存在调用堆栈中。
58.8.3.2动态翻译函数从调用堆栈中读取源平台所有寄存器的状态,映射到动态翻译函数的内存空间,实现源平台寄存器状态的切换。
59.8.3.3将动态翻译函数翻译完间接跳转指令之后返回的目标地址存储在返回值寄存器中(如x86的eax),并将源平台的所有寄存器状态压入到调用堆栈中。
60.8.3.4执行流切换到静态翻译代码空间,静态代码从调用堆栈读取源平台所有寄存器的状态,并将这些寄存器的状态存储到静态翻译代码空间的相应位置,完成动静翻译过程源平台数据交互,然后恢复现场,恢复8.3.1调用堆栈中保存的目标平台的寄存器。现场恢复完成后,跳转到静态代码的相应位置,重新开始执行静态代码。
61.8.4将插入了动态翻译函数的优化后的irt发和插入了跳转目标的标签的符号表发送给目标程序生成模块。
62.第九步,目标程序生成模块根据插入了动态翻译函数的优化后的irt生成目标平台对应的二进制程序以及地址映射表;
63.9.1目标程序生成模块从动态翻译函数插入模块接收插入了动态翻译函数的优化后的irt和插入了跳转目标标签的符号表,从irs优化模块接收包含基本块列表的地址映射表,从源程序解析模块接收的翻译后的数据段。
64.9.2遍历插入了动态翻译函数的优化后的irt,将每条中间表示转换成目标平台对应指令的二进制表示(这些二进制表示构成目标二进制程序),同时在转换过程中累计生成的指令段的大小;对需要访问数据段的指令,在插入了跳转目标标签的符号表中插入重定位项(当编译器遇到对最终位置未知的符号的引用时,会为最终位置未知的符号生成一个重定位项,用于指示链接器在链接生成可执行文件时如何修改这个引用),得到重定位表,并将目标二进制程序中的函数以及基本块的起始地址更新到包含基本块列表的地址映射表中;
65.9.3目标程序生成模块将从源程序解析模块接收的翻译后的数据段按照首地址对齐的原则,输出到目标二进制程序的相应位置,比较生成后数据段在目标二进制程序中的起始地址和在源平台二进制程序中起始地址的差异,计算数据段偏移,
66.9.4根据步骤9.3计算的数据段偏移和步骤9.2生成的重定位表,对二进制指令中的数据段偏移进行地址调整,更新插入了跳转目标标签的符号表中的相应值。得到目标平台二进制程序以及地址映射表。
67.与现有技术相比,采用本发明可以达到以下技术效果:
68.1、本发明通过动静结合的二进制程序翻译方式,采用静态翻译方法为主的方式,将源平台二进制程序翻译成目标平台相关的中间表示,对于静态翻译方法不能翻译的目标指令,在优化后的目标平台相关的中间表示中插入动态翻译函数,通过这种方式切换成采用动态翻译方法对目标指令进行翻译。基于静态与动态融合的二进制程序翻译,不仅能够减少翻译开销,提高翻译效率,还能够提升翻译后目标平台二进制程序性能。
69.2、本发明对于静态翻译不能翻译的指令,通过插入动态翻译函数的同时传递所需参数的方式实现动态翻译,将动态翻译过程集成在翻译后生成的目标平台二进制程序中,动态翻译过程直接从源二进制程序中取指与执行,无需复杂的迭代流程,执行一次静态翻译就可以完成二进制程序的翻译,能够大大提高翻译执行的效率。
70.3、本发明通过采用静态翻译方法将源平台二进制程序转换成中间表示,在生成irs、hir、irt时采用了多种静态优化策略,不仅可以进一步提高翻译效率、降低翻译开销,还可以进一步提高翻译后二进制程序在目标平台上的性能。
附图说明
71.图1是本发明第一步构建的动静结合二进制翻译系统的逻辑结构图;
72.图2是本发明动静结合二进制翻译系统的总体流程图。
具体实施方式
73.下面结合附图对本发明技术方案进行详细说明。
74.如图2所示,本发明包括以下步骤:
75.第一步,构建动静结合的二进制翻译系统,该系统如图1所示,由源程序解析模块、指令译码模块、irs优化模块、hir生成模块、irt生成模块、irt优化模块、动态翻译函数插入模块、目标程序生成模块组成。源程序解析模块读取并识别用户输入的源平台二进制程序,得到代码段、数据段、符号表,构建地址映射表,并对数据段进行翻译得到翻译后的数据段,将符号表、代码段发送给指令译码模块,将地址映射表发送给irs优化模块,将符号表发送给irt优化模块和动态翻译函数插入模块,将翻译后的数据段发送给目标程序生成模块;指令译码模块对从源程序解析模块接收的代码段进行译码,生成源平台相关的中间表示irs,将irs发送给irs优化模块;irs优化模块构建包含基本块列表的地址映射表和控制流图,将包含基本块列表的地址映射表、控制流图发送给irt优化模块,将包含基本块列表的地址映射表发送给目标程序生成模块,对从指令译码模块接收的irs进行优化,得到优化后的irs,将优化后的irs发送给hir生成模块;hir生成模块对从irs优化模块接收的优化后的irs进行转化,得到源平台无关的中间表示hir,将hir发送给irt生成模块;irt生成模块对从hir生成模块接收的hir进行分析转换,生成目标平台相关的中间表示irt,将irt发送给irt优化模块;irt优化模块从irs优化模块接收包含基本块列表的地址映射表,从irt生成模块接收irt,对irt进行优化,得到优化后的irt,并将优化后的irt发送给动态翻译函数插入模
块;动态翻译函数插入模块从源程序解析模块接收符号表,从irt优化模块接收优化后的irt,在符号表中插入跳转目标标签;分析优化后的irt,对优化后的irt进行标记并插入动态翻译函数,得到插入了动态翻译函数的优化后的irt,将插入了动态翻译函数的优化后的irt发送给目标程序生成模块,将插入了跳转目标标签的符号表发送给目标程序生成模块;目标程序生成模块从动态翻译函数插入模块接收插入了动态翻译函数的优化后的irt和地址映射表,生成最终的目标平台二进制程序和地址映射表。
76.第二步,源程序解析模块读取用户输入的源平台二进制程序,将源平台二进制程序识别成代码段、数据段、符号表,构建地址映射表,并在地址映射表添加函数地址和变量地址。方法是:
77.2.1源程序解析模块读取用户输入的源平台二进制程序,根据源平台二进制程序的格式,将源平台二进制程序识别成代码段、数据段、符号表。
78.2.2构建地址映射表,地址映射表用于存储函数及变量在源平台二进制程序中对应的地址信息,方法是:将符号表中的函数名、变量名及它们在源平台二进制程序中的地址添加到地址映射表。地址映射表由m n个表项组成,m为源平台二进制程序中函数的个数,n为源平台二进制程序中变量的个数,每个表项包含2个域,分别为函数名和函数起始地址(函数在源平台二进制程序中的起始地址),或变量名和变量地址(变量在源平台二进制程序中的地址)。
79.2.3根据源平台和目标平台大小端有无差异对源平台二进制程序的数据段进行翻译,得到翻译后的数据段,方法是:若源平台和目标平台大小端模式无差异,则将整个数据段完整拷贝出来,作为最终目标二进制程序的数据段;若源平台和目标平台大小端模式相反,则将数据段进行大端小端的转换,在不改变数据段原有属性(指数据占据的字节个数和数据的实际值)的情况下,交换数据高位低位的顺序,将数据段调整成适合目标平台的数据组织方式。
80.2.4将符号表、代码段发送给指令译码模块,将翻译后的数据段发送给目标程序生成模块;将地址映射表发送给irs优化模块,将符号表发送给irt优化模块和动态翻译函数插入模块。
81.第三步,指令译码模块从源程序解析模块接收符号表、代码段,将代码段翻译成源平台相关的中间表示irs,将irs发送给irs优化模块,方法是:
82.3.1令变量m=1;
83.3.2从符号表中获取第m个函数的起始地址,遍历第m个函数的每条指令,对每条指令进行译码,将指令转换成源平台相关的中间表示形式。这个过程中,代码段中每条源指令对应一条或者多条ir:若指令是运算指令(如普通加减乘除、移位),则一条指令对应一条ir;若指令是特殊指令(如比较指令),该类指令的执行会引起标志位(如反映运算结果的运算结果标志位,如进位标志cf、奇偶标志pf、辅助进位标志af、符号标志sf、溢出标志of、零标志zf;控制cpu操作的状态控制标志位,如追踪标志tf、中断允许标志if、方向标志df等)的变化,则一条指令对应多条ir;若指令的执行依赖标志位(如跳转指令),则一条指令对应多条ir。
84.3.3令m=m 1,若m≤m,转3.2;若m》m,将翻译得到的源平台相关的中间表示即irs发送给irs优化模块,转第四步。
85.第四步,irs优化模块从指令译码模块接收irs,从源程序解析模块接收地址映射表,对irs进行优化,得到优化后的irs,同时修改地址映射表,得到包含基本块列表的地址映射表;构建控制流图;将优化后的irs发送给hir生成模块,将包含基本块列表的地址映射表、控制流图发送给irt优化模块,将包含基本块列表的地址映射表发送给动态翻译函数插入模块。方法是:
86.4.1对irs进行基本块分割,并修改地址映射表,方法是:将irs中函数入口指令、跳转指令跳转目标地址处的第一条指令、跳转指令和函数调用指令的下一条指令作为基本块的入口;将跳转指令、函数调用指令、程序返回指令作为基本块的出口。同时,将基本块第一条指令在源平台二进制程序中的地址添加到地址映射表中,令基本块有q个,则在地址映射表中添加q个基本块表项(这q个基本块表项称为基本块列表),每个基本块表项包括基本块序号和基本块地址两个域;
87.4.2遍历4.1得到的地址映射表中基本块列表,给基本块列表中的每个基本块找到该基本块对应的父节点和子节点,即每个基本块的前驱和后继。将同一个函数中的所有基本块按前驱和后继的关系构成一个控制流图;m个函数共有m个控制流图。将m个控制流图发送给irt优化模块。
88.4.3对m个控制流图分别进行数据流分析,包括活跃变量分析、到达定值分析,构建引用-定值链(简称ud链)和定值-引用链(简称du链),计算每个基本块寄存器的活跃信息,活跃信息包括与标志位相关的数据流信息。
89.4.4根据数据流分析的结果中与标志位相关的数据流信息,在irs中删除没有被使用的对标志位赋值的指令,得到优化后的irs。这有利于减少翻译过程中产生的代码膨胀,从而提升翻译后程序的执行性能;
90.4.5将优化后的irs发送给hir生成模块,将包含基本块列表的地址映射表、控制流图发送给irt优化模块,将包含基本块列表的地址映射表发送给动态翻译函数插入模块。
91.第五步,hir生成模块从irs优化模块接收优化后的irs,将优化后的irs转换成源平台无关的中间表示(hir),将hir发送给irt生成模块。方法是:
92.5.1将优化后的irs中所有和源平台相关的物理寄存器(即源平台指令集体系结构中所有可用的硬件寄存器)信息转换到全局内存空间,使得每一个源平台的物理寄存器对应一个独立的全局内存存储位置,记录每个物理寄存器在源平台中的属性(属性指物理寄存器的用途,包括:用来作为栈指针、用来存储函数调用返回地址、用来传递参数),将每个物理寄存器在源平台中的属性添加到初步优化后的irs中,得到源平台无关的中间表示即hir。
93.5.2将hir发送给irt生成模块,令hir中共有q个物理寄存器,q为正整数。
94.第六步,irt生成模块从hir生成模块接收hir,将hir转换成目标平台相关的中间表示即irt,将irt发送给irt优化模块,方法是:
95.6.1将源平台的部分寄存器(即能映射到目标平台的寄存器)映射到目标平台的寄存器,方法是:
96.6.1.1令变量q=1;
97.6.1.2读取hir中的第q个物理寄存器在源平台中的属性,对比目标平台寄存器的使用规则以及寄存器信息,将源平台的第q个物理寄存器映射到目标平台的寄存器,方法
是:若在目标平台中找到同样功能和用法的寄存器,则用同样功能和用法的寄存器替换源平台二进制程序中的第q个物理寄存器,转6.1.3;若在目标平台中没有找到同样功能和用法的寄存器,则直接转6.1.3;
98.6.1.3令q=q 1,若q≤q,转6.1.2;若q》q,说明对q个物理寄存器的映射已完成,得到目标平台无关的中间表示,令目标平台无关的中间表示中共有p条目标平台无关的中间表示,p为正整数,转6.2。
99.6.2将目标平台无关的中间表示映射成目标平台相关的中间表示irt。方法是:
100.6.2.1令变量p=1;
101.6.2.2将第p条目标平台无关的中间表示作为当前中间表示操作。
102.6.2.3判定当前中间表示操作是否是目标平台直接支持的目标平台无关的操作。若是,则当前中间表示操作不需要进行变化,直接作为目标平台相关的中间表示,转6.2.5;否则,转6.2.4;
103.6.2.4判定当前中间表示操作是否是能够用目标平台指令通过组合实现的目标平台无关的操作。若是,将能够用目标平台指令通过组合实现的目标平台无关的操作转化为目标平台对应的指令组合,得到目标平台相关的中间表示irt,转6.2.6;否则,转6.2.5;
104.6.2.5在此时的目标平台相关的中间表示中插入函数调用指令,采用调用目标平台中与当前中间表示操作功能相同的库函数的形式实现当前中间表示操作的功能,转6.2.6。
105.6.2.6令p=p 1,若p≤p,转6.2.2;若p》p,说明已完成目标平台无关的中间表示到目标平台相关的中间表示的转换,将目标平台相关的中间表示irt发送给irt优化模块,转第七步。
106.第七步,irt优化模块从irs优化模块接收包含基本块列表的地址映射表、控制流图,从irt生成模块接收irt,从源程序解析模块接收符号表,对irt进行优化,得到优化后的irt,方法是:
107.7.1根据从irs优化模块接收的控制流图,对从irt生成模块接收的irt进行到达定值分析、活跃变量分析,使用分析结果构建du链和ud链;
108.7.2根据到达定值分析、活跃变量分析结果,对irt进行优化。方法是:
109.7.2.1遍历irt中的指令序列,将对常量的计算进行常量折叠,减少计算的指令数;
110.7.2.2遍历irt中的指令序列,针对寄存器拷贝指令中的目的寄存器,进行寄存器拷贝传播优化,减少寄存器搬移操作;
111.7.2.3遍历irt中的函数调用指令,读取符号表信息,识别调用的函数是否为库函数,如果为库函数,则将对源平台库函数的调用转换成对目标平台库函数的调用,同时将源平台的参数传递规则与到目标平台的参数传递规则进行转换对应,转7.2.4;如果不是库函数,直接转7.2.4;
112.7.2.4遍历irt中的指令序列,用目标平台更高效的指令(即比源平台指令字节少、执行速度更快、流水线吞吐率更高等,例如,arm平台的若干条连续的指令所实现的操作,x86平台一条指令就可以实现,本领域认为x86平台上该对等指令更高效)替代irt中的相对应的指令;
113.7.2.5对irt中的临时变量进行寄存器分配,识别循环区域,对循环区域中的临时
变量优先进行寄存器分配,减少循环中寄存器的溢出,减少对内存的访问次数,提高循环的执行效率;
114.经过上述5种优化操作后,得到优化后的目标平台相关的中间表示,即优化后的irt。
115.7.3将优化后的irt发送给动态翻译函数插入模块。
116.第八步,动态翻译函数插入模块从源程序解析模块接收符号表,从irt优化模块接收优化后的irt,在符号表中插入跳转目标标签;分析优化后的irt,对优化后的irt进行标记并插入动态翻译函数,得到插入了动态翻译函数的优化后的irt,将插入了动态翻译函数的优化后的irt发送给目标程序生成模块,将插入了跳转目标标签的符号表发送给目标程序生成模块,方法是:
117.8.1动态翻译函数插入模块从源程序解析模块接收符号表,从irt优化模块接收优化后的irt,对优化后的irt中的间接跳转指令进行翻译,方法是:遍历优化后的irt中的间接跳转指令,对于能够静态推断出跳转目标的跳转指令,将跳转目标的标签(即label)插入符号表,将该间接跳转指令修改为直接跳转指令;对于不能静态推断出跳转目标的跳转指令,在优化后的irt中进行标记。这样处理后,得到了标记后的优化后的irt。将跳转目标的label插入符号表的方法是:令能够静态推断出跳转目标的跳转指令有s条,则在符号表中添加s个跳转目标表项,每个表项包含跳转目标序号和跳转目标的label两个域。
118.8.2动态翻译函数插入模块为动态翻译函数构建一个栈,并且把动态翻译函数需要的参数压到栈中,保存动静切换现场。动态翻译函数需要4个参数,分别为源二进制程序文件名,原跳转的目标地址,地址映射表以及源平台所有寄存器状态。
119.8.3在标记后的优化后的irt中插入动态翻译函数;本发明的实质是将二进制程序中能够采用静态方法翻译的程序片段进行静态翻译和优化,生成目标平台对应的二进制程序;对于静态翻译不能翻译的指令,在静态翻译后生成的目标平台对应的二进制程序中插入动态翻译函数,采用动态翻译函数对静态翻译不能翻译的指令进行动态翻译,irt中插入动态翻译函数后,只要遇到静态翻译不能翻译的指令,动态翻译函数就开始翻译,实现动态翻译和静态翻译的有效结合。插入的动态翻译函数的执行流程为:
120.8.3.1对静态翻译的现场进行保存,保存目标平台的所有寄存器,然后构建调用堆栈。将源二进制程序文件的路径、地址映射表的路径、原跳转地址作为参数,压入到调用堆栈中,同时把源平台所有寄存器的状态按照一定顺序保存在调用堆栈中。
121.8.3.2动态翻译函数从调用堆栈中读取源平台所有寄存器的状态,映射到动态翻译函数的内存空间,实现源平台寄存器状态的切换。
122.8.3.3将动态翻译函数翻译完间接跳转指令之后返回的目标地址存储在返回值寄存器中(如x86的eax),并将源平台的所有寄存器状态压入到调用堆栈中。
123.8.3.4执行流切换到静态翻译代码空间,静态代码从调用堆栈读取源平台所有寄存器的状态,并将这些寄存器的状态存储到静态翻译代码空间的相应位置,完成动静翻译过程源平台数据交互,然后恢复现场,恢复8.3.1调用堆栈中保存的目标平台的寄存器。现场恢复完成后,跳转到静态代码的相应位置,重新开始执行静态代码。
124.8.4将插入了动态翻译函数的优化后的irt发和插入了跳转目标的标签的符号表发送给目标程序生成模块。
125.第九步,目标程序生成模块根据插入了动态翻译函数的优化后的irt生成目标平台对应的二进制程序以及地址映射表;
126.9.1目标程序生成模块从动态翻译函数插入模块接收插入了动态翻译函数的优化后的irt和插入了跳转目标标签的符号表,从irs优化模块接收包含基本块列表的地址映射表,从源程序解析模块接收的翻译后的数据段。
127.9.2遍历插入了动态翻译函数的优化后的irt,将每条中间表示转换成目标平台对应指令的二进制表示(这些二进制表示构成目标二进制程序),同时在转换过程中累计生成的指令段的大小;对需要访问数据段的指令,在插入了跳转目标标签的符号表中插入重定位项(当编译器遇到对最终位置未知的符号的引用时,会为最终位置未知的符号生成一个重定位项,用于指示链接器在链接生成可执行文件时如何修改这个引用),得到重定位表,并将目标二进制程序中的函数以及基本块的起始地址更新到包含基本块列表的地址映射表中;
128.9.3目标程序生成模块将从源程序解析模块接收的翻译后的数据段按照首地址对齐的原则,输出到目标二进制程序的相应位置,比较生成后数据段在目标二进制程序中的起始地址和在源平台二进制程序中起始地址的差异,计算数据段偏移,
129.9.4根据步骤9.3计算的数据段偏移和步骤9.2生成的重定位表,对二进制指令中的数据段偏移进行地址调整,更新插入了跳转目标标签的符号表中的相应值。得到目标平台二进制程序以及地址映射表。
130.为了验证本发明的效果,在x86平台上构建了本发明的一个实施例,即构建了一个arm平台到x86平台的动静结合的二进制翻译系统(以下简称为测试实施例),然后对该实施例的二进制翻译效果进行测试。测试实施例的输入(源二进制程序)为arm平台上的安卓apk应用程序,采用本发明第一步构建的二进制翻译系统进行翻译后输出x86平台的二进制程序和地址映射表(测试实施例的输出)。具体过程包括:首先对该arm程序应用静态翻译与优化过程,将不能静态翻译的部分插入动态翻译函数,得到中间文件;然后再加载并运行该中间文件,对静态翻译后的部分直接运行,对插入动态翻译函数的部分边动态翻译边运行。
131.测试方法是将安卓apk应用程序运行在arm硬件平台上(处理器单核心规格为armv82.2ghz),测试并记录该安卓apk应用程序各功能的周转时间。然后在x86硬件平台(处理器单核心规格为2.2ghz)运行测试实施例翻译并执行同一安卓apk应用程序,测试并记录该安卓apk应用程序各功能的周转时间。结果表明,频率相同的x86硬件平台上采用本发明翻译并运行安卓apk时,相对于arm硬件平台上原生运行该安卓apk,可获得约为80%的执行性能。对于二进制翻译技术领域来说,80%属于很优异的效果。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献