本文作者:kaifamei

一种面向RISC-V汇编指令级的关键路径自动检测方法

更新时间:2025-04-05 01:07:40 0条评论

一种面向RISC-V汇编指令级的关键路径自动检测方法

一种面向risc-v汇编指令级的关键路径自动检测方法
技术领域:
:1.本发明涉及汇编程序关键路径的自动检测和汇编程序测试
技术领域:
:,具体涉及大量测试集在汇编程序中所经过的关键分支路径问题,特别涉及一种面向risc-v汇编指令级的关键路径自动检测方法。
背景技术:
::2.在涉及汇编程序关键路径检测方法的技术,目前有基于辅助表的汇编程序控制流路径检测方法,此类方法是将由c语言编写的路径探针程序插入到待检测的汇编程序各分支里面,为了保证原寄存器的值不被路径探针调用的寄存器覆盖,需要将所有整数寄存器的值提前压栈,保存寄存器的现场,调用结束之后再将原寄存器的值取栈。待检测结束,通过查阅辅助表得到控制流路径的行号。3.该方法主要存在以下问题:4.(1)基于辅助表的汇编程序控制流路径检测方法由于需要将所有整数寄存器进行压栈和取栈,产生的访存时间减低了程序的性能,除此之外,辅助表的构造不具有通用性,每需要检测不同程序的控制流路径都要重新构建辅助表。5.(2)主流的路径控制流分析工具idapro和intelpin,代码体积庞大,实现复杂,产生的中间数据难以整理,并且不适用于risc-v汇编程序关键路径分析。6.(3)risc-v指令集架构相比于x86和arm的软件生态还不够成熟,将其他路径分析工具移植到risc-v架构具有一定的难度,且不易维护,亟需一些适用于risc-v指令集架构的关键路径自动检测方法分析出测试数据通过率最高的关键路径,以用于对risc-v汇编程序的优化等工作。技术实现要素:7.为了至少能够解决上述问题中的部分问题,本发明提供一种面向risc-v汇编指令级的关键路径自动检测方法。8.本发明提供的一种面向risc-v汇编指令级的关键路径自动检测方法,包括:9.步骤1:对待检测汇编程序中的所有分支进行编码;10.步骤2:遍历待检测汇编程序所涉及的所有浮点寄存器,从而判断待检测汇编程序中是否有至少两个全局无依赖的浮点寄存器,若是,则执行步骤3,若否,则执行步骤4;11.步骤3:基于两个全局无依赖的浮点寄存器和分支编码,设计全局无依赖式插桩探针;12.步骤4:调用非全局无依赖的其他浮点寄存器作为辅助寄存器,基于辅助寄存器和分支编码,设计辅助寄存器式插桩探针;13.步骤5:识别分支标识以定位到各个分支的首行位置,将全局无依赖式插桩探针和/或辅助寄存器式插桩探针自动插桩至各个分支的首行位置;14.步骤6:使用测试集对插桩后的待检测汇编程序进行测试,将测试集生成的编码结果输出到结果文件,对结果文件中相同的编码结果进行统计,对数量最多的编码结果进行解码以得到关键路径;所述测试集是指由若干个用于检测关键路径的测试样本组成的集合。15.进一步地,步骤1具体包括:16.按照分支顺序,分别对每个分支进行二进制编码、十进制编码和十六进制编码;其中,针对第i个分支,其二进制编码由首位为1末尾为i-1个0组成;其十进制编码即为二进制编码对应的十进制数,其十六进制编码即为二进制编码对应的十六进制数;i=1,2,3…,n。17.进一步地,步骤3具体包括:18.利用其中一个全局无依赖的浮点寄存器存储插桩探针所在分支的分支编码,利用另一个全局无依赖的浮点寄存器存储编码和;所述编码和是通过对测试样本经过的所有分支的编码进行累加运算后得到的。19.进一步地,步骤4具体包括:20.利用一个全局无依赖的浮点寄存器存储插桩探针所在分支的分支编码,利用辅助寄存器存储编码和;所述编码和是通过对测试样本经过的所有分支的进行累加运算后得到的;21.其中,针对任意一个探针,在调用辅助寄存器之前,先将辅助寄存器的原值进行压栈;然后再将编码和进行压栈;在完成调用之后,将辅助寄存器的原值从栈中取出。22.进一步地,步骤5中,识别分支标识具体包括:遍历risc-v汇编代码行的字符,若识别到的字符不是助记符,则认为该字符分支标识。23.进一步地,步骤6中,对数量最多的编码结果进行解码以得到关键路径具体包括:24.对数量最多的十六进制编码结果解码为二进制字符串,统计所述二进制字符串中“1”所在的顺序号i,所有顺序号i对应的分支所组成的路径即为关键路径。25.本发明的有益效果:26.1、根据risc-v汇编程序浮点寄存器的覆盖情况设计不同的插桩探针,在进行汇编程序关键路径检测时可以进行不同选择,并且插桩探针的设计简洁方便,可以最大程度的减少访存时间。27.2、采用自动检测的方式即可以检测出输入在risc-v汇编程序中所通过的关键路径,解决了人工对某个输入的逐行分析易出错的问题,一定程度上使相关工作更加准确高效,尤其对于含有大量分支跳转的复杂汇编程序,其效果更加显著。28.3、适用于新兴的risc-v指令集架构的汇编程序,对完善risc-v软件生态具有促进作用,此方法虽然只适用于risc-v指令集架构,但是基于该实现思想进行扩展可以适用于其他指令集架构的汇编程序。附图说明29.图1为本发明实施例提供的一种面向risc-v汇编指令级的关键路径自动检测方法的流程示意图之一;30.图2为本发明实施例提供的自动插桩的示意图;31.图3为本发明实施例提供的gdip的设计代码;32.图4为本发明实施例提供的arip的设计代码;33.图5为本发明实施例提供的关键路径的示意图。具体实施方式34.为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。35.实施例136.如图1所示,本发明实施例提供一种面向risc-v汇编指令级的关键路径自动检测方法,包括以下步骤:37.s101:对待检测汇编程序中的所有分支进行编码;38.s102:遍历待检测汇编程序所涉及的所有浮点寄存器,从而判断待检测汇编程序中是否有至少两个全局无依赖的浮点寄存器,若是,则执行步骤s103,若否,则执行步骤s104;39.s103:基于两个全局无依赖的浮点寄存器和分支编码,设计全局无依赖式插桩探针(globaldependency-freeinstrumentationprobe,gdip);40.s104:调用非全局无依赖的其他浮点寄存器作为辅助寄存器,基于辅助寄存器和分支编码,设计辅助寄存器式插桩探针(auxiliaryregisteredinstrumentationprobe,arip);41.s105:识别分支标识以定位到各个分支的首行位置,将全局无依赖式插桩探针和/或辅助寄存器式插桩探针自动插桩至各个分支的首行位置;42.具体地,遍历risc-v汇编代码行的字符,若识别到的字符不是助记符,则认为该字符分支标识;自动插桩流程图如图2所示。43.s106:使用测试集对插桩后的待检测汇编程序进行测试,将测试集生成的编码结果输出到结果文件,对结果文件中相同的编码结果进行统计,对数量最多的编码结果进行解码以得到关键路径;所述测试集是指由若干个用于检测关键路径的测试样本组成的集合。44.本发明实施例提供的面向risc-v汇编指令级的关键路径自动检测方法,根据待检测risc-v汇编程序浮点寄存器的覆盖情况设计不同的插桩探针,在进行汇编程序关键路径检测时可以进行不同选择,可以最大程度的减少访存时间;并且,本发明方法采用自动检测方式即可以检测出输入在risc-v汇编程序中所通过的关键路径,解决了人工对某个输入的逐行分析易出错的问题,一定程度上使相关工作更加准确高效,尤其对于含有大量分支跳转的复杂汇编程序,其效果更加显著;进一步地,本发明方法适用于新兴的risc-v指令集架构的汇编程序,对完善risc-v软件生态具有促进作用,并且基于本发明实现思想进行扩展可以适用于其他指令集架构的汇编程序。45.实施例246.在上述实施例1的基础上,本发明实施例中具体给出了一种对分支进行编码的实现方式,以及两种插桩探针的设计方式。47.(1)分支编码48.按照分支顺序,分别对每个分支进行二进制编码、十进制编码和十六进制编码;其中,针对第i个分支,其二进制编码由首位为1末尾为i-1个0组成;其十进制编码即为二进制编码对应的十进制数,其十六进制编码即为二进制编码对应的十六进制数;i=1,2,3…,n。其中,各个类型编码起到的作用不同,分支的十进制编码用于表示各分支的顺序,二进制编码是为了解码时只产生唯一结果,十六进制编码是为了方便后续加载进寄存器进而计算插桩探针的编码和以及最大程度的保证在risc-v浮点寄存器不溢出的情况下尽可能多的进行编码。49.本发明实施例中,采用构建分支编码表(branchingcodetable,bct)的形式来记录各分支编码,如表1所示。50.表1分支编码表[0051][0052]具体地,采用上述二进制编码方式的好处在于方便计算测试样本所经过所有分支的编码结果。这是因为,根据表1可以发现,在构造各分支二进制编码的时候是有规律的,比如第一个分支二进制编码为1,第二个分支二进制编码为10,第三个分支二进制编码为100,假设某一个测试样本通过的分支是第一个分支和第二个分支,那么得到的编码和为11(1+10),如果经过的是第一个分支和第三个分支,那么得到的编码和为101(1+100),在此可以发现规律,对于11和101,不难发现从右向左数“1”所在的顺序就是经过的分支,对于101,“1”在第1位和第3位,那么说明该测试集经过的是第1和第2分支。[0053]进一步地,设计十六进制编码的好处在于方便寄存器存储编码结果。这是因为,寄存器的存储是不分二进制和十进制的,如果某程序的分支数特别多的时候,那对应的二进制编码太长,此时寄存器是无法存储的,所以如表1所示将二进制编码转化为了十六进制编码,则此时的编码结果最终得到的是十六进制编码和。[0054](2)全局无依赖式插桩探针的设计方式[0055]具体地,全局无依赖式插桩探针的设计,需要满足在待检测的risc-v汇编程序中有至少两个浮点寄存器从未被使用(例如,以risc-v架构为例,假设risc-v架构中总共有32个寄存器,但是在待检测的risc-v汇编程序中使用了其中的30个,那么剩余两个就是全局无依赖寄存器),这是因为:以从未被使用的浮点寄存器设计插桩探针,不会影响待检测汇编程序的寄存器的依赖关系,进而才能保证测试样本在插桩前后所经过的路径相同。[0056]gdip的设计构思具体包括:利用其中一个全局无依赖的浮点寄存器存储插桩探针所在分支的分支编码,利用另一个全局无依赖的浮点寄存器存储编码和;所述编码和是通过对测试样本经过的所有分支的十六进制编码进行累加运算后得到的。[0057]gdip结构简单,不产生额外的访存时间,gdip核心代码,如图3所示,ft1和ft2寄存器为全局无依赖寄存器,其中第15行lis0,0x$,“$”字符代表表1中的十六进制编码,待检测汇编程序的分支数与gdip-n相对应,第4、9、15行整数寄存器的选择不能改变下文寄存器的依赖关系。[0058](3)辅助寄存器式插桩探针的设计方式[0059]当待检测risc-v汇编程序中从未被使用的浮点寄存器个数小于两个时,则需要选择辅助寄存器式插桩探针。此类型探针需要调用其他寄存器完成十六进制的加载和计算编码和,为保证调用的辅助寄存器的值不被修改,需要在调用之前将辅助寄存器的原值进行压栈,例如图4第10、11行,同样的将探针计算得到的编码和也进行压栈,例如图4第16行,待插桩探针完成对辅助寄存器调用之后,将辅助寄存器的原值从栈中取出,以恢复寄存器的依赖,例如图4第17、18行。当遇到下一个探针时,需要将上一个探针的值从栈中取出,例如图4第22行,在此基础上完成上述探针的同样功能,如图4所示。[0060](4)结果分析与解码(resultanalysisanddecoding,rad)[0061]结果分析与解码完成的功能是将关键路径里的插桩探针流得到的十六进制编码和解码为由0和1组成的二进制字符串,例如使用500,000个测试样本检测risc-v汇编程序的关键路径,假设关键路径为l,则测试样本经过l的数量是最多的,且l涉及的探针十六进制编码和是相同的,根据表1可知解码后的二进制字符串1的位置都是独立的,即为1的位置顺序就是通过的分支顺序。[0062]在上文的第(1)中提及了二进制编码和十六进制编码的好处;其中,在使用十六进制编码和时,对于十六进制编码和是无法直观的看出“1”所在的位置的,所以需要将十六进制编码和转化为二进制(解码),此时就会得到一串由“0”“1”组合的二进制字符串,比如100101000101000101,这么长的组合,为了避免出错的同时,提高检测效率,可以采用自动统计方式去统计1所在的位置(“1”所在字符串中的顺序就是经过的分支),本发明实施例中,给出了一种能够实现自动统计的代码1。[0063]结果分析与解码的核心实现如代码1所示。[0064][0065][0066]实施例3[0067]在上述各实施例的基础上,以risc-v的cotd函数的汇编程序作为待检测汇编程序,本发明实施例中,针对risc-v的cotd函数的汇编程序关键路径自动检测方法,包括以下步骤:[0068]s301:根据risc-v的cotd函数的汇编实现,对其汇编程序的所有分支进行编码;[0069]具体地,如表2所示,插桩前cotd函数的部分汇编代码如汇编代码段1所示。[0070]表2risc-vcotd函数的分支编码表[0071][0072]汇编代码段1:[0073][0074][0075]s302:检索cotd函数的汇编代码涉及的浮点寄存器是否包括了risc-v指令集架构设计的所有浮点寄存器;经初步检索,cotd函数有两个以上全局无依赖浮点寄存器,即有两个以上的浮点寄存器未被使用;因此选择全局无依赖式插桩探针,该类型插桩探针里的浮点寄存器即为全局无依赖寄存器。[0076]s303:识别分支标识以定位到各个分支的首行位置,将全局无依赖式插桩探针自动插桩至各个分支的首行位置;[0077]具体到cotd函数而言,读取cotd函数每行汇编程序第一个连续字符串,若识别到的字符串非risc-v指令集架构的汇编助记符,说明该字符串为分支名称,例如汇编代码段2中的“_rv_cotd:”和“.l3”等,即在此字符串下将gdip-1至gdip-n顺序插入到各分支的首行,插桩后程序如汇编代码段2所示。[0078]需要说明的是,若待检测汇编程序不满足有两个以上全局无依赖寄存器的条件,则应用辅助寄存器式插桩探针,插桩后程序如汇编代码段3所示。[0079]汇编代码段2:[0080][0081][0082]汇编代码段3:[0083][0084][0085][0086]s204:采用现有方法随机生成500000个符合浮点数均匀分布规律的测试样本,以这500000个测试样本对插桩后的cotd函数进行测试,测试样本通过某条路径的个数最多即为关键路径,依次为次要路径,以及其他路径。经测试cotd函数插桩探针的不同编码和、数量、占比等参数如表3所示,根据表1显示解码得到的二进制字符串内“1”所在的位置顺序,可知结果为100000100000000000001的数量占比最高,结合表2的分支编码表,可得关键路径,如图5所示。[0087]具体地,因为测试用的测试集数量是庞大且不一样的,不同的测试集所经过的分支有可能一样,有可能不一样,那么经过的插桩探针同样是一样或者不一样,这个不需要人工判断,只需要获取每一个测试样本经过的分支对应的插桩探针对应的编码和输出的文件,再对其解码判断即可。[0088]本实施例中,测试集经过程序的分支时,会对分支內的插桩探针对应的十六进制编码进行累加运算,最后在结束分支得到的编码和进而输出。500000个测试样本组成的测试集的编码结果即为500000个编码和;通过对这500000个编码和进行统计分析,结果如表3所示。[0089]表3risc-vcotd函数的结果参数[0090]插桩探针编码和数量占比解码后的结果“1”所在顺序0x413000410000000048051296.10%1000001000000000000011、7、210x4130001b00000000148062.96%1101100000000000000011、2、4、5、210x413000070000000021280.43%1110000000000000000011、2、3、21[0091]本发明支持自动检测某个输入在risc-v汇编程序里所经过的路径。risc-v是一种新兴的指令集架构,目前对于自动分析测试样本所经过的risc-v汇编路径方面亟需完善。如果利用手工逐行查看寄存器内容去判断某个输入所经过的路径,不仅繁琐而且易出错,当测试集数量庞大以及risc-v汇编程序的分支跳转复杂的时候手动分析每个测试样本所经过的路径更是难以完成。本发明利用自动插桩的方式判断庞大测试集里的测试样本所经过的路径,具有准确性和高效性,除此之外,该发明不仅可以得到关键路径,当对结果进行分析时,也可以得到次要路径以及其他路径。[0092]最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。当前第1页12当前第1页12


文章投稿或转载声明

本文链接:http://www.wtabcd.cn/zhuanli/patent-15-857-0.html

来源:专利查询检索下载-实用文体写作网版权所有,转载请保留出处。本站文章发布于 2022-11-27 21:14:41

发表评论

验证码:
用户名: 密码: 匿名发表
评论列表 (有 条评论
2人围观
参与讨论