CN1755631A - 二进制翻译中的库函数调用处理方法 - Google Patents
二进制翻译中的库函数调用处理方法 Download PDFInfo
- Publication number
- CN1755631A CN1755631A CN 200410081020 CN200410081020A CN1755631A CN 1755631 A CN1755631 A CN 1755631A CN 200410081020 CN200410081020 CN 200410081020 CN 200410081020 A CN200410081020 A CN 200410081020A CN 1755631 A CN1755631 A CN 1755631A
- Authority
- CN
- China
- Prior art keywords
- target machine
- register
- library function
- storehouse
- agreement
- 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
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种二进制翻译中的库函数调用处理方法,包括在目标机中用内存模拟原系统的寄存器和堆栈;应用目标机本地的约定进行传参和返回值处理,依次对原系统二进制程序中的每个基本块进行处理。本发明通过用目标机本地的约定进行传参和返回值处理,而不是去模拟原机器的调用约定,省去了将参数压入模拟原系统的模拟堆栈或寄存器,然后又从堆栈或寄存器中取出放入到目标机传参寄存器或堆栈中过程中频繁对内存的操作,提高了程序执行的效率,进而提高了系统翻译效率,提高了系统性能。
Description
技术领域
本发明涉及计算机领域的二进制翻译方法,尤其涉及对X86处理器的浮点运算的处理方法。二进制翻译中的库函数调用处理方法。
背景技术
编译是计算机自身领域的关键技术,二进制翻译则是编译的一个重要研究方向。早在1987年HP公司就开发了第一个商用二进制翻译系统Bergh et al。接下来,许多公司和研究机构也相继展开了这方面的研究,其中最具有代表性的有HP、IBM、Digital、AT&T、APPLE、Transmeta、澳大利亚Queensland大学、奥地利维也纳技术大学等,目前,Intel设立在中国的软件中心也加入了这个行列。
二进制翻译目前正在成为解决软件移植问题的一个研究热点。众所周知,新开发的处理器如果其指令级体系结构(ISA)不向前兼容,则会失去现有软件的支持,影响其推广和应用。这就迫使设计者使用宝贵的芯片空间来兼容老处理器,这样既增加新处理器的复杂度和功耗,影响其主频的提高,又阻碍了处理器的发展。二进制翻译技术为新旧处理器架起了一座桥梁,将现有的软件移植到新开发处理器上执行,使得新处理器摆脱向前兼容的约束。
二进制翻译技术对促进国产处理器的发展也很有意义。近十多年来,中国的信息产业得以飞速发展,并正在逐步走向成熟。随着知识和经验的积累,业界精英们开始向计算机领域中最为核心的技术挑战。以“龙芯”、“星光”、“方舟”、“汉芯”、“神威”、“万通”、“北大众志”等为代表的国产通用或嵌入式微处理器不断涌现,打破了中国无“芯”的局面。但由于Intel在X86系列微处理器上各种专利的限制,使得国内的许多微处理器设计者不得不采用与X86系列微处理器不兼容的ISA。众所周知,X86系列机器作为当前的主流机型,已经拥有极其丰富的应用软件。ISA的不兼容导致国产微处理器的应用软件与X86微处理器相比显得有些匮乏,从某种程度上影响了其推广和应用的步伐。因此开展二进制翻译的研究,同样可以丰富国产处理器的应用软件,为这些民族产业扩大市场提供支持。
在实现以X86为原机器的二进制翻译的过程中,一个较为棘手的问题是处理X86程序对系统库函数的调用问题。如何处理库函数调用问题直接关系到二进制翻译系统的性能,当库函数调用处理得好,就能提高原二进制程序在目标机器上运行的速度,反之,则影响原二进制程序在目标机器上运行的速度。
MIPS/Linux系统的函数参数传递是采用堆栈和寄存器相结合的形式进行的。MIPS约定有三种参数传递方式:O32、N32和N64。目前对于32位MIPS多采用O32方式,我们只对O32方式进行分析。
MIPS提供了4个整型寄存器($4-$7)和4个浮点型寄存器($f12-$fl5)用于传递参数,每个寄存器为32位,这8个寄存器和堆栈结合起来进行参数传递。O32方式参数传递比较复杂,对浮点数和整型数据进行区别。其规则如下:
首先,按照参数所需空间的大小,Caller在堆栈中为其分配相应的空间。在分配时,如果参数所需总空间小于16个字节,则在堆栈中为参数分配16个字节。也就是说,无论参数需要空间多少,至少要在堆栈中为之分配16个字节。这16个字节分别与4个整型寄存器和4个浮点型寄存器相对应。MIPS约定,堆栈中的用于传参的前16个字节作为保留,它们实际上是通过寄存器进行传送的。
这16个字节的参数传送方式是这样的:首先Caller依次检查函数的每个参数,如果该参数是浮点型,则依次使用浮点型寄存器传送参数。如果遇到一个整型参数,则开始使用整型寄存器传送参数。并且一旦使用了整型寄存器,则不再使用浮点型寄存器传递参数。
另外,O32还规定,如果使用了浮点寄存器,则整型寄存器空出相应的位置。
O32对函数的返回值的规定也比较复杂,其返回值传递也是通过堆栈和返回值寄存器进行的。如果返回值是简单数据类型,通过返回值寄存器进行。如果返回值是一个结构类型,则根据具体情况进行。MIPS设置了两个寄存器用于结果返回,如果返回值是由两个域组成的结构,并且每个域可以用一个寄存器存储,则还是通过寄存器传输;若该结构超过返回寄存器的存储限制,则通过堆栈传送。
现有技术中,一般来讲,最为简单的实现方法就是在目标机上模拟X86的参数和返回值传递约定。具体就是在目标机上用内存模拟X86的堆栈,当遇到系统库函数调用时,目标机还是按照X86的约定将参数压入到模拟堆栈中,然后调用包装的系统库函数:从模拟堆栈中取出参数,按照目标机约定放入到相应的传参寄存器和堆栈中,然后调用目标机本地的系统库函数,最后按照目标机传返回值的约定取出返回值,按照X86的约定放入到相应模拟寄存器或内存中。
这种通过在目标机上模拟X86的参数和返回值传递约定的方法可以准确地处理X86程序对系统库函数调用的问题,但其最大的缺陷就是效率问题。由前边的实现方法可以看出,由于需要模拟X86的堆栈,在进行系统库函数调用时,需要将参数压入到模拟堆栈中,之后又要将参数取出放入到目标机的传参寄存器和堆栈中,影响程序的执行效率。
发明内容
本发明所要解决的技术问题是提供一种二进制翻译中的库函数调用处理方法,克服现有技术中库函数调用处理翻译执行效率低的缺陷,提高翻译执行效率,进而提高系统性能。
为了解决上述技术问题,本发明提供一种二进制翻译中的库函数调用处理方法,包括以下步骤:
a)在目标机中用内存模拟原系统的寄存器和堆栈;
b)应用目标机本地的约定进行传参和返回值处理,依次对原系统二进制程序中
的每个基本块进行处理。
在上述方案中,步骤b)中又包括以下步骤:
b1)判别调用CALL指令的目标是否为系统库函数?如果是,执行下一步,如果否,执行步骤b7);
b2)根据系统库函数的行参个数和大小说明,在本基本块内往前寻找压参数的指令;
b3)判断查找是否成功?如果是,执行下一步,如果否,执行步骤b7);
b4)把在本基本块内找到的那些压参数的push指令,翻译后对应的本地码全部删除,并形成如下本地代码:将这些参数按照目标机传参约定放入到相应的寄存器和堆栈中;
b5)调用本地系统库函数;
b6)按照目标机传返回值约定取出返回值,然后按照原系统约定放入到目标机模拟原系统的模拟寄存器或内存中;
b7)按照一般处理方法模拟原系统传参和返回值约定的方法进行处理。
在上述方案中,原系统为应用级的二进制翻译系统。
在上述方案中,原系统为X86(Intel 32位体系结构的系统)/Linux系统和MIPS/Linux系统。
在上述方案中,步骤b4)中,原系统模拟寄存器ESP是原系统模拟寄存器ESP与所有参数总大小之差。
由上可知,本发明通过用目标机本地的约定进行传参和返回值处理,而不是去模拟原机器的调用约定,省去了将参数压入模拟原系统的模拟堆栈,然后又从堆栈中取出放入到目标机传参寄存器或堆栈中过程中频繁对内存的操作,提高了程序执行的效率,进而提高了系统翻译效率,提高了系统性能。
附图说明
图1是现有技术中目标机中用内存模拟X86的寄存器和堆栈;
图2是本发明中库函数调用的处理方法流程图。
具体实施方式
总体上,本发明建立在如下两个基本地原则上:一是尽可能地识别和提升原系统二进制程序的系统库函数调用;二是尽可能地避免在处理库函数调用时模拟原系统的堆栈,而是用目标机本地函数调用约定来处理库函数调用,从而以达到提高程序执行效率的目的。
下文将结合附图详细描述本发明。
二进制翻译中的库函数调用处理方法包括以下步骤:
步骤10,在目标机中用内存模拟原系统的寄存器和堆栈。以X86系统(Intel 32位体系结构的系统)为例,如图1所示,EAX,ECX,。。。,EDI是X86系统的8个通用寄存器。
步骤20,应用目标机本地的约定进行传参和返回值处理,依次对原系统二进制程序中的每个基本块进行处理。
在步骤20中,包括以下步骤,如图2所示:
步骤200,判别调用CALL指令的目标是否为系统库函数,如果是,执行下一步,如果否,执行步骤260;
步骤210,根据系统库函数的行参个数和大小说明,在本基本块内往前寻找压参数的指令(push指令)。
步骤220,判断查找是否成功,如果是,执行下一步,如果否,执行步骤260;
步骤230,把在本基本块内找到的那些压参数的指令(push指令),翻译后对应的本地码全部删除,并形成如下本地代码:将这些参数按照目标机传参约定放入到相应的寄存器和堆栈中。
在步骤230中,原系统模拟寄存器ESP=原系统模拟寄存器ESP-所有参数总大小,在X86系统中,X86模拟寄存器ESP=X86模拟寄存器ESP-所有参数总大小。
步骤240,调用本地系统库函数。
步骤250,按照目标机传返回值约定取出返回值,然后按照原系统约定放入到目标机模拟原系统的模拟寄存器或内存中。
步骤260,按照一般处理方法模拟原系统传参和返回值约定的方法进行处理。
以某个X86基本块为例:
push $10
push 8048032
call printf
用大部分二进制翻译系统采用的一般处理方法模拟原机器传参和返回值约定的方法处理后翻译的代码为(共14条指令):
addiu t2,t2,-4 ;push $10
li at,10
sw at,0(t2)
addiu t2,t2,-4 ;push 8048032
lui t1,0x804
ori t1,t1,0x8032
lw at,0(t1)
sw at,0(t2)
lw at,0(t2) ;下面4条指令是从模拟栈中取出参数放入MIPS
move a0,at ;相应传参寄存器中
lw at,4(t2)
move a1,at
li t9,printf ;调用目标机器本地的库函数printf
jal t9
采用本发明方法处理后翻译的代码为(共7条指令):
li a0,10
lui t1,0x804
ori t1,t1,0x8032
lw a1,0(t1)
addiu t2,t2,-8
ll t9,printf ;调用目标机器本地的库函数printf
jal t9
说明:1. MIPS通用寄存器t2模拟X86系统的ESP。
2. at,t1,t9都是MIPS的通用寄存器,在本发明中用于临时寄存器。
3. a0,a1,a2,a3是MIPS的传参寄存器。
本发明适用于所有应用级的二进制翻译系统(不跨操作系统),包括X86(Intel32位体系结构的系统)/Linux系统和MIPS/Linux系统。
本发明所提供的二进制翻译中的库函数调用处理方法具有如下特点:对原系统(如X86)二进制程序中的系统库函数调用进行识别和提升,用目标机本地的约定进行传参和返回值处理,而不是去模拟原机器的调用约定,这样能省去将参数压入模拟原系统(如X86)模拟堆栈,然后又从堆栈中取出放入到目标机传参寄存器或堆栈中过程中频繁对内存的操作,提高了程序执行的效率。
最后应说明的是:以上实施例仅用以说明而非限制本发明的技术方案,尽管参照上述实施例对本发明进行了详细说明,本领域的普通技术人员应当理解:依然可以对本发明进行修改或者等同替换,而不脱离本发明的精神和范围的任何修改或局部替换,其均应涵盖在本发明的权利要求范围当中。
Claims (4)
1、一种二进制翻译中的库函数调用处理方法,包括以下步骤:
a)在目标机中用内存模拟原系统的寄存器和堆栈;
b)应用目标机本地的约定进行传参和返回值处理,依次对原系统二进制程序中的每个基本块进行处理。
2、如权利要求1所述的一种二进制翻译中的库函数调用处理方法,其特征在于,步骤b)中又包括以下步骤:
b1)判别调用CALL指令的目标是否为系统库函数?如果是,执行下一步,如果否,执行步骤b7);
b2)根据系统库函数的行参个数和大小说明,在本基本块内往前寻找压参数的指令;
b3)判断查找是否成功?如果是,执行下一步,如果否,执行步骤b7);
b4)把在本基本块内找到的那些压参数的push指令,翻译后对应的本地码全部删除,并形成如下本地代码:将这些参数按照目标机传参约定放入到相应的寄存器和堆栈中;
b5)调用本地系统库函数;
b6)按照目标机传返回值约定取出返回值,然后按照原系统约定放入到目标机模拟原系统的模拟寄存器或内存中;
b7)按照一般处理方法模拟原系统传参和返回值约定的方法进行处理。
3、如权利要求1所述的一种二进制翻译中的库函数调用处理方法,其特征在于,原系统为应用级的二进制翻译系统。
4、如权利要求1所述的一种二进制翻译中的库函数调用处理方法,其特征在于,对源二进制程序中的系统库函数调用进行识别和提升,用目标机本地的约定进行传参和返回值处理。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2004100810202A CN100359471C (zh) | 2004-09-30 | 2004-09-30 | 二进制翻译中的库函数调用处理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2004100810202A CN100359471C (zh) | 2004-09-30 | 2004-09-30 | 二进制翻译中的库函数调用处理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1755631A true CN1755631A (zh) | 2006-04-05 |
CN100359471C CN100359471C (zh) | 2008-01-02 |
Family
ID=36688897
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2004100810202A Active CN100359471C (zh) | 2004-09-30 | 2004-09-30 | 二进制翻译中的库函数调用处理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN100359471C (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101488096B (zh) * | 2009-02-19 | 2011-03-30 | 上海交通大学 | 利用出入边关系的剖分信息构建超级块的方法 |
CN101546271B (zh) * | 2009-04-30 | 2012-01-04 | 上海交通大学 | 动态二进制翻译系统中超级块的寄存器分配方法 |
CN102364442A (zh) * | 2011-06-24 | 2012-02-29 | 浙大网新科技股份有限公司 | 将Wine从x86移植到ARM平台的方法 |
CN103186414A (zh) * | 2011-12-27 | 2013-07-03 | 联想(北京)有限公司 | 一种程序执行方法、程序管理器和虚拟机 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5313614A (en) * | 1988-12-06 | 1994-05-17 | At&T Bell Laboratories | Method and apparatus for direct conversion of programs in object code form between different hardware architecture computer systems |
US5414848A (en) * | 1993-04-01 | 1995-05-09 | Intel Corporation | Method and apparatus for sharing a common routine stored in a single virtual machine with other virtual machines operating in a preemptive muli-tasking computer system |
DE59804749D1 (de) * | 1997-12-17 | 2002-08-14 | Fujitsu Siemens Computers Gmbh | Verfahren zum umsetzen eines systemaufrufs |
US6748587B1 (en) * | 1998-01-02 | 2004-06-08 | Hewlett-Packard Development Company, L.P. | Programmatic access to the widest mode floating-point arithmetic supported by a processor |
US6075942A (en) * | 1998-05-04 | 2000-06-13 | Sun Microsystems, Inc. | Encoding machine-specific optimization in generic byte code by using local variables as pseudo-registers |
-
2004
- 2004-09-30 CN CNB2004100810202A patent/CN100359471C/zh active Active
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101488096B (zh) * | 2009-02-19 | 2011-03-30 | 上海交通大学 | 利用出入边关系的剖分信息构建超级块的方法 |
CN101546271B (zh) * | 2009-04-30 | 2012-01-04 | 上海交通大学 | 动态二进制翻译系统中超级块的寄存器分配方法 |
CN102364442A (zh) * | 2011-06-24 | 2012-02-29 | 浙大网新科技股份有限公司 | 将Wine从x86移植到ARM平台的方法 |
CN103186414A (zh) * | 2011-12-27 | 2013-07-03 | 联想(北京)有限公司 | 一种程序执行方法、程序管理器和虚拟机 |
Also Published As
Publication number | Publication date |
---|---|
CN100359471C (zh) | 2008-01-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1308826C (zh) | 用于smt处理器上的cpi调度的系统和方法 | |
CN1277183C (zh) | 用以防止微处理器管线中的停滞的装置及方法 | |
CN101299192B (zh) | 一种非对齐访存的处理方法 | |
CN1238500A (zh) | 用于进行静态初始化的方法和系统 | |
CN1402843A (zh) | 在一个周期内处理乘累加运算 | |
CN104040491A (zh) | 微处理器加速的代码优化器 | |
CN1494677A (zh) | 数字信号处理装置 | |
US20130054546A1 (en) | Hardware-based array compression | |
CN1892602A (zh) | 一种二进制翻译中库函数调用的处理方法 | |
CN1716189A (zh) | 设计用户可定制的处理器的方法以及装置 | |
CN1153131C (zh) | 用于在多个指令的执行期间由微处理机自动插入所需数量的空操作指令的方法 | |
CN1142485C (zh) | 流水线控制相关延迟消除方法 | |
CN1450450A (zh) | 采用双指令集的32位嵌入式微处理器 | |
CN1347525A (zh) | 虚拟机指令的优化字节码解释器 | |
CN1853164A (zh) | 用于开发dsp编译器构件块的组合方法 | |
CN1320450C (zh) | 提供可变宽度的至少六路加法指令的方法及相应装置 | |
CN1975693A (zh) | 具有自驱动功能的指令仿真解析系统及其实现方法 | |
CN1650266A (zh) | 支持单线程应用程序的时分多路复用推理性多线程 | |
CN1264087C (zh) | 寄存器再命名方法 | |
CN1755631A (zh) | 二进制翻译中的库函数调用处理方法 | |
CN1690951A (zh) | 优化的处理器和指令对准 | |
CN100346314C (zh) | 保存代码重新排序中的精确异常的方法和设备 | |
CN101075219A (zh) | 一种中断处理方法及系统 | |
CN100551066C (zh) | 编码器及自适应算术编码的实现方法及装置 | |
CN100345117C (zh) | 二进制翻译中对x86中浮点运算的处理方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |