一种动态二进制翻译指令集模拟器计时方法

xiaoxiao2020-7-22  16

一种动态二进制翻译指令集模拟器计时方法
【专利摘要】一种动态二进制翻译指令集模拟器计时方法,本方法通过有效划分基本块,使得基本块每次执行时所占用的指令周期数可以在动态翻译阶段确定,从而实现模拟器的精确计时;计时过程包括下列步骤:(1)以跳转指令、分支指令和内存访问指令作为基本块的划分依据;(2)在动态翻译过程中,计算被翻译指令的周期数及所在内存区域的内存延迟大小,从而在动态翻译阶段确定基本块每执行一次所占用的指令周期数;(3)模拟器在执行翻译代码时,并以基本块为单位判断实时事件的响应时机。本方法能够对实时事件及时响应,可以满足航天嵌入式软件的强实时性需求,同时由于不需要逐条指令判断实时事件的响应时机,计时开销较小。
【专利说明】一种动态二进制翻译指令集模拟器计时方法
【技术领域】
[0001]本发明涉及一种动态二进制翻译指令集模拟器计时方法,属于嵌入式软件领域。【背景技术】
[0002]指令集模拟器用于在软件层面对目标计算机的CPU指令集、中断控制器、外设等进行全系统模拟,从而使得软件能够在不做任何修改前提下运行于不同体系结构的计算机。
[0003]而对于运行航天嵌入式软件的指令集模拟器,由于软件对实时性有很高的要求,所以不仅要求模拟器能够正确模拟指令的执行结果,还要求能够提供指令计时功能,并且计时精度能够满足软件对实时性的要求。
[0004]指令集模拟器的这种计时功能是在模拟指令执行的过程中,通过统计模拟执行指令在物理计算机上执行时需要的时钟周期数来实现的。传统基于解释技术的指令集模拟器的计时方法是在解释执行一条指令后,再计算该指令需要耗费的时钟周期数及内存延迟周期数,然后累加起来计算出总的指令模拟执行时间。
[0005]由于解释型指令集模拟器的指令模拟效率很低,逐条指令计算时钟周期的方式在指令模拟的过程中开销占比较小,所以采用这种方法可以实现精确计时。但对于采用动态二进制翻译技术的指令集模拟器,由于动态翻译过程中以基本块为单位,直接将一种体系结构的指令动态翻译成另外一种体系结构的指令,如果仍采用这种指令计时方式,计时开销会显著增加,甚至会超过模拟指令功能所占用的开销,这将会严重降低动态翻译的效果,进而影响动态二进制翻译模拟器的性能。
[0006]针对这种以基本块为翻译单元的编译型模拟器,常用的计时方式有两种:一种是根据宿主计算机的运行时间来估算模拟执行的指令周期数,这种方式的优点是模拟执行过程中计时几乎不占开销,指令模拟效率非常的高,但由于估算的误差很大,所以对于实时性较强的嵌入式软件,这种方法难以适用。
[0007]另一种是以分支或跳转指令划分的基本块为单位统计模拟执行的指令总数,以此来估算模拟执行的指令周期数。虽然后一种方法相比前一种方法的计时精度有了很大提高,但这种基本块的划分方式没有考虑某些指令具有多个执行周期,以及不同架构的嵌入式处理器可能具有的不同内存延迟特性问题,例如:
[0008]当基本块中包含内存访问指令时,由于这些内存访问指令所访问的内存地址可能会发生变化,所以无法准确预测基本块每次执行时所耗费的指令周期数,如下面一段TSC695F 程序:
[0009]START:
[0010](I) setOxl, % g2
[0011](2)mov% g2, % g3
[0012](3)nop
[0013](4) ld[% gl], % fO[0014](5)set0xl2000000, % g2
[0015](6)st% g2, [% g2+% gl]
[0016](7)add% i6, % 14, % i6
[0017](8)sub% i6, 0x60, % i6
[0018](9) sub% i6, 0x60, % 06
[0019](10)jmp START
[0020](I I) nop
[0021](12)nop
[0022]按照传统的划分方法,语句⑴?(11)会被划分到一个基本块内(因为这里的call指令带一个延迟槽,所以第11条语句也被包括在内)。
[0023]根据TSC695F手册,这个基本块内IcUjmp指令周期为2,st指令周期为3,其他指令周期为1,假设这段代码所在内存区域延迟参数为2,ld和st指令所访问内存区域的读、写参数分别是X和Y,则这个基本块的指令周期数N及其执行一次需要的总指令周期数T为:
[0024]N= (1+1+1+2+1+3+1+1+1+2+1)+ (2*11)
[0025]T = N+X+Y
[0026]对于航天嵌入式实时性软件,由于运行过程中包含一些需要实时触发的事件,如运行至某时刻D,需要处理事件E。这就要求模拟器运行至一个基本块之前先进行判断,假设当前模拟器已经模拟运行的时间为S,则在执行基本块前,需要先判断(S+T)是否小于或等于D,只有条件满足时才能执行基本块的翻译代码,否则将造成事件E无法及时处理。
[0027]但由于这个基本块中包含了 Id和St指令,并且所访问的内存区域在运行时可能发生变化,所以T的值是一个未知数,这将造成模拟器难以在执行基本块翻译代码之前事先判断实时事件的响应时机。

【发明内容】

[0028]本发明的技术解决问题是:克服现有技术的不足,针对航天嵌入式软件的强实时性需求,对采用以基本块为翻译单元的动态二进制翻译指令集模拟器,提供了一种动态二进制翻译指令集模拟器计时方法,要求在动态翻译过程中,考虑被翻译指令的多周期性及所在内存区域的内存延迟特性,以及内存访问时产生的时钟周期延迟情况,使得模拟器的计时功能可以满足航天嵌入式软件对实时性的要求;同时解决了动态翻译基本块时,每条指令模拟执行后均进行计时判断,严重影响动态翻译指令模拟效率的问题。
[0029]本发明的技术解决方案是:
[0030]一种动态二进制翻译指令集模拟器计时方法,包括步骤如下:
[0031](I)初始化用于记录模拟器模拟执行时间的时间量SimTim为O、定义用于表示基本块内所有指令的周期数总和的计数量X、定义实时事件发生时刻Counter,所述的Counter表示从当前时刻开始,执行Counter个时钟周期后,模拟器开始执行需要处理的实时事件E ;
[0032](2)定义翻译代码缓存区TC以及定义缓存区LC,所述的缓存区LC用于保存最近访问内存区域的读写延迟参数,通过查询该缓存区可快速获得所访问内存区的读写延迟参数;
[0033](3)定义用来保存不同内存区域的指令延迟周期数的内存延迟量、并根据等待状态配置寄存器的值对内存延迟量进行设置;
[0034](4)设置模拟器PC寄存器的值为目标程序起始地址;
[0035](5)查询缓存区TC,判断模拟器PC寄存器所指地址的指令是否已被翻译,若被翻译则进入步骤(13),否则进入步骤(6);
[0036](6)动态翻译基本块,动态翻译基本块具体步骤如下:
[0037]a)记录当前时刻时间量SimTim的值S,并将计数量X设置为0,同时初始化指令翻译地址addr为PC寄存器的值;
[0038]b)根据当前指令翻译地址addr对基本块内的指令取指,同时查询缓存区LC获取读写延迟参数,并将该延迟参数的值累加到时间量SimTim中;
[0039]c)对取指指令进行动态翻译,并将该指令的周期数t累加到X中,即:X = X+t ;
[0040]d)判断当前取指指令是否为跳转或分支指令,若是则进入步骤e),若不是则判断当前指令是否为内存访问指令,若是内存访问指令则进入步骤e),若不是则将当前指令翻译地址addr更新为其后继地址并进入步骤a);
[0041]e)记录当前时刻时间量SimTim的值TS ; [0042]f)计算基本块每执行一次所占用的指令周期数NTC = (TS - S)+X,其中(TS - S)为基本块中指令取指需要的指令周期数;
[0043]g)将SimTim的值恢复为S ;
[0044]7)判断实时事件发生时刻Counter是否大于等于基本块指令周期NTC,若大于等于则进入步骤(9),否则进入步骤(8);
[0045]8)重新执行步骤(6),翻译一个指令周期数为Counter的基本块并进入步骤(9);
[0046]9)记录当前时刻时间量SimTim的值PS,执行基本块的动态翻译代码,执行后更新时间量 SimTim 的值为 SimTim = SimTim+NTC,同时更新 Counter = Counter -(SimTim-PS);
[0047]10)根据基本块的执行结果更新PC值;
[0048]11)判断Counter是否小于等于O或模拟器是否被停止运行,若是则退出基本块执行;否则,进入骤(5)。
[0049]本发明与现有技术相比的有益效果是:
[0050](I)本发明通过分析内存延迟和指令的多周期性,模拟器能够提供精确的指令模拟时间。
[0051](2)本发明在现有以分支、跳转指令划分基本块的基础上,增加以内存访问指令作为结束标记的划分原则,只允许内存访问指令出现在基本块的结尾,使得基本块每次执行所需要的时钟周期数可以在动态翻译阶段确定。
[0052](3)本发明建立缓存来存放不同内存区域的延迟参数,利用程序运行的局部性原理,可以在内存访问时快速获得该区域的内存延迟参数。
[0053](4)本发明以基本块为单位判断实时事件的响应时机,不需要逐条指令判断。
[0054](5)本发明能够对实时事件及时响应,可以满足航天嵌入式软件的强实时性需求。【专利附图】

【附图说明】
[0055]图1是本发明中指令集模拟器执行过程中的计时过程流程图。
[0056]图2是本发明中在动态翻译基本块时计算基本块指令执行周期的流程图。
【具体实施方式】
[0057]下面结合附图对本发明的【具体实施方式】进行进一步的详细描述。
[0058]如图1、2所示,本发明一种动态二进制翻译指令集模拟器计时方法,包括步骤如下:
[0059](I)初始化用于记录模拟器模拟执行时间的时间量SimTim为O、定义用于表示基本块内所有指令的周期数总和的计数量X、定义实时事件发生时刻Counter,所述的Counter表示从当前时刻开始,执行Counter个时钟周期后,模拟器开始执行需要处理的实时事件E,Counter的初始值根据具体应用环境进行设置,它的值还可能在模拟器运行过程中发生变化;
[0060](2)定义翻译代码缓存区TC以及定义缓存区LC,所述的缓存区LC用于保存最近访问内存区域的读写延 迟参数,通过查询该缓存区可快速获得所访问内存区的读写延迟参数;
[0061](3)定义用来保存不同内存区域的指令延迟周期数的内存延迟量、并根据等待状态配置寄存器的值对内存延迟量进行设置;
[0062](4)设置模拟器PC寄存器的值为目标程序起始地址;
[0063](5)查询缓存区TC,判断模拟器PC寄存器所指地址的指令是否已被翻译,若被翻译则进入步骤(13),否则进入步骤(6);
[0064](6)动态翻译基本块,动态翻译基本块具体步骤如下:
[0065]a)记录当前时刻时间量SimTim的值S,并将计数量X设置为0,同时初始化指令翻译地址addr为PC寄存器的值;
[0066]b)根据当前指令翻译地址addr对基本块内的指令取指,同时查询缓存区LC获取读写延迟参数,并将该延迟参数的值累加到时间量SimTim中;
[0067]c)对取指指令进行动态翻译,并将该指令的周期数t累加到X中,即:X = X+t ;
[0068]d)判断当前取指指令是否为跳转或分支指令,若是则进入步骤e),若不是则判断当前指令是否为内存访问指令,若是内存访问指令则进入步骤e),若不是则将当前指令翻译地址addr更新为其后继地址并进入步骤a);
[0069]e)记录当前时刻时间量SimTim的值TS ;
[0070]f)计算基本块每执行一次所占用的指令周期数NTC = (TS - S)+X,其中(TS - S)为基本块中指令取指需要的指令周期数;
[0071]g)将SimTim的值恢复为S ;
[0072]7)判断实时事件发生时刻Counter是否大于等于基本块指令周期NTC,若大于等于则进入步骤(9),否则进入步骤(8);
[0073]8)重新执行步骤(6),翻译一个指令周期数为Counter的基本块并进入步骤(9);
[0074]9)记录当前时刻时间量SimTim的值PS,执行基本块的动态翻译代码,执行后更新时间量 SimTim 的值为 SimTim = SimTim+NTC,同时更新 Counter = Counter -(SimTim-PS);
[0075]10)根据基本块的执行结果更新PC值;
[0076]11)判断Counter是否小于等于O或模拟器是否被停止运行,若是则退出基本块执行;否则,进入骤(5)。
[0077]下面以一个具体实施例进一步说明本发明的工作原理和工作过程:
[0078]本发明提供了一种动态二进制翻译指令集模拟器计时方法,这里结合上文给出的那段代码,假设它们位于程序的起始位置,内存地址为0x02000000,对于PROM为40bit的TSC695F处理器,下面给出指令集模拟器计时功能的实施步骤:
[0079]根据处理器芯片手册,在TSC695F 中,LDSB, LDSBA, LDSH、LDSHA, LDUB, LDUBA,LDUH、LDUHA, LD、LDA、LDF、LDFSR、LDC、LDCSR、JMPL, RETT 指令周期为 2,LDD、LDDA, LDDF,LDDC, STB、STBA、STH、STHA, ST、STA, STF, STFSR、STC、STCSR 指令周期为 3,STD、STDA、STDF,STDFQ、STDC、STDCQ、LDSTUB、LDSTUBA、SWAP、SWAPA、Ticc 指令周期为 4,其他指令周期为 I。下面是图2中所描述基本块翻译过程针对这段代码的实施步骤:
[0080]1、定义翻译代码缓存区TC,定义缓存区LC,根据TSC695F的等待状态寄存器(WSCNFR)定义内存延迟全局变量 ws_io3rw、ws_io2rw> ws_iolrw> ws_io0rw> ws_exrw_r>ws_exrw_w、ws_prw、ws_prr、ws_raw和ws_rar,分别对应WSCNFR中的各个内存区域,其中ws_exrw_r和ws_exrw_w表示交换内存区域的读写延迟:
[0081]
【权利要求】
1.一种动态二进制翻译指令集模拟器计时方法,其特征在于步骤如下: (1)初始化用于记录模拟器模拟执行时间的时间量SimTim为O、定义用于表示基本块内所有指令的周期数总和的计数量X、定义实时事件发生时刻Counter,所述的Counter表示从当前时刻开始, 执行Counter个时钟周期后,模拟器开始执行需要处理的实时事件E ; (2)定义翻译代码缓存区TC以及定义缓存区LC,所述的缓存区LC用于保存最近访问内存区域的读写延迟参数,通过查询该缓存区可快速获得所访问内存区的读写延迟参数; (3)定义用来保存不同内存区域的指令延迟周期数的内存延迟量、并根据等待状态配置寄存器的值对内存延迟量进行设置; (4)设置模拟器PC寄存器的值为目标程序起始地址; (5)查询缓存区TC,判断模拟器PC寄存器所指地址的指令是否已被翻译,若被翻译则进入步骤(13),否则进入步骤(6); (6)动态翻译基本块,动态翻译基本块具体步骤如下: a)记录当前时刻时间量SimTim的值S,并将计数量X设置为0,同时初始化指令翻译地址addr为PC寄存器的值; b)根据当前指令翻译地址addr对基本块内的指令取指,同时查询缓存区LC获取读写延迟参数,并将该延迟参数的值累加到时间量SimTim中; c)对取指指令进行动态翻译,并将该指令的周期数t累加到X中,即:X= X+t ; d)判断当前取指指令是否为跳转或分支指令,若是则进入步骤e),若不是则判断当前指令是否为内存访问指令,若是内存访问指令则进入步骤e),若不是则将当前指令翻译地址addr更新为其后继地址并进入步骤a); e)记录当前时刻时间量SimTim的值TS; f)计算基本块每执行一次所占用的指令周期数NTC= (TS - S)+X,其中(TS - S)为基本块中指令取指需要的指令周期数; g)将SimTim的值恢复为S; 7)判断实时事件发生时刻Counter是否大于等于基本块指令周期NTC,若大于等于则进入步骤(9),否则进入步骤(8); 8)重新执行步骤(6),翻译一个指令周期数为Counter的基本块并进入步骤(9); 9)记录当前时刻时间量SimTim的值PS,执行基本块的动态翻译代码,执行后更新时间量 SimTim 的值为 SimTim = SimTim+NTC,同时更新 Counter = Counter - (SimTim-PS); 10)根据基本块的执行结果更新PC值; 11)判断Counter是否小于等于O或模拟器是否被停止运行,若是则退出基本块执行;否则,进入骤(5)。
【文档编号】G06F9/40GK103955357SQ201410178279
【公开日】2014年7月30日 申请日期:2014年4月29日 优先权日:2014年4月29日
【发明者】郭向英, 张西超, 赵雷, 陈睿 申请人:北京控制工程研究所

最新回复(0)