一种程序异常向量空间优化系统、方法、设备及介质与流程

文档序号:33544096发布日期:2023-03-22 09:38阅读:34来源:国知局
一种程序异常向量空间优化系统、方法、设备及介质与流程

1.本发明属于计算机领域,具体涉及一种程序异常向量空间优化系统、系统、设备及介质。


背景技术:

2.程序在编译和运行过程中会有两种地址:一种叫链接地址,即程序在编译之后链接时的地址,该地址一般与镜像文件中存放的地址是一一对应的;另一种叫运行地址,也就是程序运行过程中的地址。大部分时间这二者的地址是一致的,但这就会导致一个问题:程序镜像文件为了保证链接地址和运行地址一一匹配,会在空洞的地方做填0处理,这就会使得镜像文件增大。有时候为了减少程序镜像文件的大小,达到加速加载程序的目的,会使用紧缩技术,如在链接文件中加入at(嵌入式领域中的绝对位置变量标识,可以设置目标变量在c程序中的内存地址,使用形式为“变量名__at__”)关键字,这样就表明程序实际运行的地址是at关键字的参数,而镜像文件中则将代码与数据顺序排列,程序运行过程中再将二进制代码或数据搬移到运行地址,此时链接地址与运行地址不一致,虽然减少了程序加载时间,却增加了程序运行时间。因此程序的加载时间与运行时间似乎是一对矛盾体,加载时间减少,就伴随着运行时间增加;而运行时间减少,又出现了加载时间增加的情况。
3.因此,亟需一种有效的方案来解决上述问题。


技术实现要素:

4.为解决上述问题,本发明提出一种程序异常向量空间优化系统,包括代码分析模块、空洞空间分配模块、代码修改模块,其中:所述代码分析模块配置用于分析程序编译后的输出文件以确定程序所对应的异常向量空间中的空洞空间以及程序编译后的目标变量;所述空洞空间分配模块配置用于通过预定算法生成将目标变量分配到所述异常向量空间中的空洞空间的分配策略,并将所述分配策略发送到代码修改模块;所述代码修改模块配置用于基于所述分配策略对程序的源代码中的目标变量进行修改以生成目标代码文件。
5.在本发明的一些实施方式中,代码分析模块包括:第一文本查找模块,所述第一文本查找模块配置用于根据程序的编译方式在程序编译后的输出文件中确定输出文件中异常向量空间对应的描述部分以及目标变量。
6.在本发明的一些实施方式中,代码分析模块还包括:冗余代码分析模块,所述冗余代码分析模块配置用于基于预设的异常向量空间模板确定所述描述部分中存在的冗余数据。
7.在本发明的一些实施方式中,代码分析模块还包括:空洞空间确认模块,所述空洞空间确认模块配置用于对所述第一文本查找模块确定的描述部分和/或所述冗余代码分析模块确定的描述部分的冗余数据进行分析,并确定
所述描述部分所对应的异常向量空间中可用的空洞空间。
8.在本发明的一些实施方式中,代码分析模块还包括:排序模块,所述排序模块配置用于基于目标变量的数据大小对目标变量进行排序。
9.在本发明的一些实施方式中,空洞空间分配模块包括:分配策略模块,所述分配策略模块配置用于通过多种分配算法生成将所述目标变量分配到所述异常向量空间中空洞空间的分配策略。
10.在本发明的一些实施方式中,空洞空间分配模块还包括:空洞空间管理模块,所述空洞空间管理模块配置用于保存所述分配策略模块对应的分配算法产生的分配策略,并在下一个分配算法运行时恢复空洞空间的初始状态给下一个分配算法用于分配运算。
11.在本发明的一些实施方式中,空洞空间分配模块还包括:最优解输出模块,所述最优解输出模块配置用于从所述空洞空间管理模块获取多种分配算法生成的分配策略,并基于多种分配算法生成的分配策略,按照预定方式确定分配策略的最优解。
12.在本发明的一些实施方式中,代码修改模块包括:第二文本查找模块,所述第二文本查找模块配置用于根据所述分配策略在程序的源代码中找出与分配策略相关的变量的位置。
13.在本发明的一些实施方式中,代码修改模块还包括:异常向量修改模块,所述异常向量修改模块配置用于将代码分析模块对所述程序分析出的异常向量空间中的冗余数据在程序源代码中对应的代码删除。
14.在本发明的一些实施方式中,代码修改模块还包括:数据区变量修改模块,所述数据区变量修改模块配置用于根据分配策略将目标变量在程序源代码中的变量替换成对应的指针,并将所述指针指向所述分配策略中所分配的异常向量空间中对应的地址。
15.在本发明的一些实施方式中,数据区变量修改模块还配置用于:根据所述分配策略将目标变量在程序源代码中的对应的变量通过汇编代码的标签的方式将所述目标变量在程序源代码中对应的变量放入代表异常向量空间的标签中。
16.在本发明的一些实施方式中,代码修改模块还包括:中间结果更新模块,所述中间结果更新模块配置用于保存数据区变量修改模块和异常向量修改模块对所述程序源代码的修改。
17.在本发明的一些实施方式中,系统还包括:异常向量模板模块,所述异常向量模板模块配置用向所述代码分析模块根据程序所述的硬件架构提供对应的异常向量空间模板。
18.在本发明的一些实施方式中,系统还包括:合入模块,所述合入模块配置用于根据用户的操作将目标代码文件中用户允许的内容合并到所述程序的源代码中。
19.在本发明的一些实施方式中,合入模块还配置用于:判断所述目标代码文件是否全部合入到所述程序的源代码中,响应于所述目标代
码文件并未全部合并到所述程序的源代码中,将合并的所述程序的源代码文件按照预定方式重新编译,并将编译后的输出文件发送到所述代码分析模块。
20.在本发明的一些实施方式中,合入模块还配置用于:响应于所述目标代码文件全部合并到所述程序的源代码中,将所述合并后的程序的源代码编译成可执行文件。
21.本发明的另一方面提出一种程序异常向量空间优化方法,包括:分析程序编译后的输出文件以确定程序所对应的异常向量空间中的空洞空间以及程序编译后的目标变量;通过预定算法生成将目标变量分配到所述异常向量空间中的空洞空间的分配策略;基于所述分配策略对程序的源代码中的目标变量进行修改以生成目标代码文件。
22.本发明的又一方面还提出一种计算机设备,包括:至少一个处理器;以及存储器,所述存储器存储有可在所述处理器上运行的计算机指令,所述指令由所述处理器执行时实现上述实施方式中任意一项所述方法的步骤。
23.本发明的再一方面还提出一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述实施方式中任意一项所述方法的步骤。
24.通过本发明提出的一种程序异常向量空间优化方法,利用异常向量空间存储程序数据,以此缩减程序镜像文件的大小,可以有效的减少程序镜像文件占用的存储空间,随着程序镜像文件的减小,程序加载时间也将缩短;同时本发明又避免了类似在链接脚本中使用at关键字技术造成链接地址与运行地址不一致的问题。
附图说明
25.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
26.图1为本发明实施例提供的一种程序异常向量空间优化系统的结构示意图;图2为本发明实施例提供的一种程序异常向量空间优化方法的流程示意图;图3为本发明实施例提供的一种计算机设备的结构示意图;图4为本发明实施例提供的一种计算机可读存储介质的结构示意图;图5为本发明实施例提供的代码分析模块的结构示意图;图6为本发明实施例提供的空洞空间分配模块的结构示意图;图7为本发明实施例提供的代码修改模块的结构示意图;图8为本发明实施例提供程序异常向量空间优化系统的结构示意图;图9为本发明实施例提供的基于armv8架构的异常向量空间对应的异常处理在异常向量空间的数据分布示意图。
具体实施方式
27.为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明实施例进一步详细说明。
28.需要说明的是,本发明实施例中所有使用“第一”和“第二”的表述均是为了区分两个相同名称非相同的实体或者非相同的参量,可见“第一”“第二”仅为了表述的方便,不应理解为对本发明实施例的限定,后续实施例对此不再一一说明。
29.本发明旨在解决传统的程序编译方式下,程序运行过程中出现异常时异常处理程序在处理异常过程中存在的设备存储空间的浪费的问题,尤其是在一些末端的iot设备,如果手环等穿戴设备、家庭电气等联网设备上,由于这些设备本身的设计上考虑业务和成本因素一般选择低功耗,性能较低的芯片平台作为硬件基础,进而导致这些设备自身的运算速度与存储空间容量有限。但在应用上又希望在这些平台上实现快速启动或快速响应的技术效果。因此如何解决在低配置上实现快速启动与响应成为一个亟待解决的问题。
30.为解决上述问题,如图1所示,本发明提出一种程序异常向量空间优化系统,包括代码分析模块1、空洞空间分配模块2、代码修改模块3,其中:所述代码分析模块1配置用于分析程序编译后的输出文件以确定程序所对应的异常向量空间中的空洞空间以及程序编译后的目标变量2;所述空洞空间分配模块2配置用于通过预定算法生成将目标变量分配到所述异常向量空间中的空洞空间的分配策略,并将所述分配策略发送到代码修改模块3;所述代码修改模块3配置用于基于所述分配策略对程序的源代码中的目标变量进行修改以生成目标代码文件。
31.在本发明的实施例中,一般程序镜像文件分为代码段和数据段;数据段又分为全0数据段和非零数据段;其中代码段的优化极为复杂,不在本专利考虑范围内;全0数据段,也就是bss段,实际只存储了数据段的开始位置以及大小,因此也没有优化的空间;而非0数据段,也就是data段,常独立于代码存放,这种排布方式往往会造成数据段与代码段中间存在空洞,而为了保证链接地址与运行地址一致,在产生程序镜像文件时,编译器会在这些空洞空间中进行填0操作;另外由于一些代码段同样存在对齐的操作,同样会采样填0处理,这样就会增大程序镜像文件。考虑到程序镜像文件中存在一些段位置是固定的,利用率又不高,因此本发明就是将填0处理的空洞空间填充成更有意义的数据,不仅可以减少程序镜像的加载时间,也可以减少程序的运行时间。这其中最具代表性的段就是异常向量空间所在的数据段。异常向量空间是指程序异常时执行异常处理时的数据空间。如图9所示,图9示出的是以armv8处理器的异常向量空间分布对应的数据空间分布。例如,图中0x080~0x180这128字节所代表的空间就是在current el withsp0下执行irq/virq 的中断空间,通常情况下这128字节的数据空间主要存储异常处理操作的寄存器数据(具体内容因程序的逻辑不同而不同,或多或少),异常处理向量主要操作如下步骤:1)将必要的寄存器入栈,常被称为保存现场;2)跳转到异常处理流程;3)将保存在栈里的寄存器恢复出来,常被称为恢复现场;4)返回到异常之前执行。
32.因此向量空间中将会根据程序编译后二进制数据指令将上述过程中需要的数据
保存到0x080~0x180这128字节所代表的空间(假设该异常处理是irq中断)。但是实际上,程序在编译后并不能完全利用异常向量空间。因此编译器在编译时会将用不到的数据以填0的方式进行占位处理。
33.需要说明的时,程序的异常向量空间是在程序源代码编译成可执行程序后就已实现对异常的处理方式,也即程序编译后便实现了该程序的异常处理的方案,这是程序与硬件为维护程序的稳定运行而设计的机制,即便是用任意语言编写一个只打印出“hello world”的程序,在其编译之后便会有对该程序出现异常时的处理机制,并存在对应的异常向量空间。可能会因不同的硬件平台(处理器架构)同样的程序在编译后会有不同的异常向量空间。
34.因此,在对某个程序的异常向量空间进行优化时,先对程序进行编译,并获取编译后的输出文件,输出文件包括:符号表、反汇编文件、地址映射表文件、可执行程序文件。
35.代码分析模块1则分析输出文件并根据所采用的编译工具以硬件平台找出可执行程序中关于该程序对应的异常向量空间以及可存储到异常向量空间的目标变量。并根据异常向量空间所记录的内容确定异常向量空间中被编译器填0的部分,将被填0的部分当作空洞空间,同目标变量一起发送到空洞空间分配模块2。
36.进一步,空洞空间分配模块2则通过多种分配算法生成将目标变量添加到空洞空间的分配策略,并将分配策略发送给代码修改模块3。
37.代码修改模块3则根据分配策略对程序的源代码中与目标变量相对应的一些变量的作用域进行修改,以将这些变量添加到异常向量空间中。例如将这些变量在程序运行后的原本存储在内存中,将其改变到异常向量空间所对应的寄存器中。以此生成对该程序优化的目标代码并保存为目标代码文件。
38.在本发明的一些实施方式中,代码分析模块1包括:第一文本查找模块11,所述第一文本查找模块11配置用于根据程序的编译方式在程序编译后的输出文件中确定输出文件中异常向量空间对应的描述部分以及目标变量。
39.如图5所示,代码分析模块进一步包括第一文本查找模块11,第一文本查找模块主要对程序编译后的输出文件中的内容进行查找,且根据程序所采用的编译工具和硬件平台对编译输出文件中的内容进行解析,找到输出文件中对应于该程序异常处理的异常向量空间的描述部分。进一步基于描述部分确定该程序的异常向量空间,同时通过反汇编文件以及地址映射表文件获取该程序的所有变量信息,并确定对应的全局变量以及在程序运行中不会更改的变量,将其作为目标变量。
40.在本发明的一些实施方式中,代码分析模块1还包括:冗余代码分析模块12,所述冗余代码分析12模块配置用于基于预设的异常向量空间模板确定所述描述部分中存在的冗余数据。
41.在本实施例中,代码分析模块1还包括冗余代码分析模块12,冗余代码分析模块则基于确定异常向量空间,根据预先设定或选择的异常向量空间模板对该程序的异常向量空间进行对比,确定该异常向量空间相比于异常向量空间模块多余的数据,并将多余的异常向量空间的数据作为冗余数据。
42.具体地,如图9所示的异常向量空间参考表所示,以0x080对应的irq中断为例,假设异常向量空间模板中的内容只有跳转到异常处理流程的地址和返回到异常之前执行的
处理流程地址,且两个数据地址的大小分别为64位即8字节。而此时假设该程序的异常向量空间中,在0x080对应的128字节的空间中,除了跳转到异常处理流程的地址和返回到异常之前执行的处理流程地址还有其他数据,则这种情况下,其他数据与选择的向量空间模板来说是冗余数据,需要对其进行标记。
43.在本发明的一些实施方式中,代码分析模块1还包括:空洞空间确认模块13,所述空洞空间确认模块13配置用于对所述第一文本查找模块11确定的描述部分和/或所述冗余代码分析模块12确定的描述部分的冗余数据进行分析,并确定所述描述部分所对应的异常向量空间中可用的空洞空间。
44.在本实施例中,代码分析模块1还包括空洞空间确认模块13,空洞空间确认模块13则将描述部分所包含的异常向量空间中的填0部分和冗余数据进行分析,确定对应的数据地址范围并将对应的地址范围作为该程序异常向量空间可用的空洞空间。
45.在本发明的一些实施方式中,代码分析模块1还包括:排序模块14,所述排序模块14配置用于基于目标变量的数据大小对目标变量进行排序。
46.在本实施例中,代码分析模块1中的排序模块对目标变量根据变量的数据大小进行排序,并将排序后的目标变量发送到空洞空间分配模块。
47.在本发明的一些实施方式中,空洞空间分配模块2包括:分配策略模块21,所述分配策略模块21配置用于通过多种分配算法生成将所述目标变量分配到所述异常向量空间中空洞空间的分配策略。
48.在本实施例中,分配策略模块21根据代码分析模块发送的空洞空间以及目标变量通过动态规划、贪心算法、背包算法等算法将目标变量分配到空洞空间中,即根据目标变量的数据大小填入空洞空间。
49.在本发明的一些实施方式中,空洞空间分配模块2还包括:空洞空间管理模块22,所述空洞空间管理模块配置用于保存所述分配策略模块对应的分配算法产生的分配策略,并在下一个分配算法运行时恢复空洞空间的初始状态给下一个分配算法用于分配运算。
50.在本实施例中,空洞空间分配模块2中还设有空洞空间管理模块22,空洞空间管理模块22为分配策略模块21中的各个算法提供向量空间的初始化工作,并将每个算法给出的分配策略进行保存。
51.在本发明的一些实施方式中,空洞空间分配模块2还包括:最优解输出模块23,所述最优解输出模块23配置用于从所述空洞空间管理模块获取多种分配算法生成的分配策略,并基于多种分配算法生成的分配策略,按照预定方式确定分配策略的最优解。
52.在本实施例中,多个算法均给出分配策略之后,最优解输出模块23则从空洞空间管理模块22中获取各个分配算法给出的分配策略,以及剩余未分配的目标变量,根据剩余未分配的目标变量和已分配到异常向量空间的目标变量的数量以及分配到异常向量空间的目标变量的数据大小进行评估以得到最优解。例如,根据程序所运行的硬件平台的特点以及程序运行时的调度机制选择对应的评估倾向,例如,如果硬件平台的存储空间较小,数据访问频繁,将数据量较大的目标变量优先分配到分配策略,则此时在对各个算法的分配
进行评估时,以剩余的未分配的目标变量的数据大小为主要判断依据,哪一个算法的分配方案剩余的目标变量的数据大小越小,则为最优解。
53.在本发明的一些实施方式中,还根据目标变量在程序中的使用次数作为目标变量是否分配到异常向量空间的评估依据。如果目标变量在程序中被频繁的调用,则以未分配的目标变量的个数越小作为判断依据,哪一个算法的分配方案剩余的目标变量的个数越小则越好,认为是最优解。
54.在本发明的一些实施方式中,代码修改模块3包括:第二文本查找模块31,所述第二文本查找模块配置用于根据所述分配策略在程序的源代码中找出与分配策略相关的变量的位置。
55.在本实施例中,代码修改模块3中设有第二文本查找模块31,第二文本查找模块31则根据空洞空间分配模块2中给出的最优的分配方案,在程序的源代码中找到对应的分配到异常向量空间的目标变量在源代码中的位置。
56.在本发明的一些实施方式中,代码修改模块3还包括:异常向量修改模块32,所述异常向量修改模块32配置用于将代码分析模块1对所述程序分析出的异常向量空间中的冗余数据在程序源代码中对应的代码删除。
57.在本实施例中,异常向量修改模块32将最优的分配方案中由代码分析模块1给出的异常向量空间冗余数据在程序源代码中对应的代码清楚。
58.在本发明的一些实施方式中,代码修改模块3还包括:数据区变量修改模块33,所述数据区变量修改模块33配置用于根据分配策略将目标变量在程序源代码中的变量替换成对应的指针,并将所述指针指向所述分配策略中所分配的异常向量空间中对应的地址。
59.在本实施例中,数据区变量修改模33则根据第二文本查找模块31确定的目标变量在程序源代码中的位置,将对应位置上的变量通过指针的形式替代,并将指针指向分配策略中对应的异常向量空间的地址。以此实现在编译后将目标变量添加到异常向量空间的空洞空间中。
60.在本发明的一些实施方式中,数据区变量修改模块33还配置用于:根据所述分配策略将目标变量在程序源代码中的对应的变量通过汇编代码的标签的方式将所述目标变量在程序源代码中对应的变量放入代表异常向量空间的标签中。
61.在本实施例中,对程序源代码中对应的变量增加属性标签,并将属性标签添加到对应的异常向量空间中。例如通过c语言的“attribute((section(“section name”))”将对应的目标变量,添加到“section name”对应的连接文件中。
62.在本发明的一些实施方式中,代码修改模块3还包括:中间结果更新模块34,所述中间结果更新模块34配置用于保存数据区变量修改模块和异常向量修改模块对所述程序源代码的修改。
63.在本实施例中,代码修改模块3中还设有保存源代码修改结果的中间结果更新模块。
64.在本发明的一些实施例中,因为代码修改模块3修改后的目标代码是以分支的方式建立,在修改后需要合并到原来的分支,在合并时需要有用户确认是否同意修改。因此,需要将代码修改模块3每次的修改的目标代码文件作为中间结果进行保存。
65.在本发明的一些实施方式中,系统还包括:异常向量模板模块4,所述异常向量模板模块4配置用向所述代码分析模块根据程序所述的硬件架构提供对应的异常向量空间模板。
66.如图8所示,在本实施例中,异常向量模板模块记录最精简的各个架构下的异常向量空间,如最常见的arm架构、riscv架构及mips架构等,由代码修改模块调用。并为代码分析模块提供对应的异常向量空间模板。
67.在本发明的一些实施方式中,系统还包括:合入模块5,所述合入模块5配置用于根据用户的操作将目标代码文件中用户允许的内容合并到所述程序的源代码中。
68.如图8所示,如前所述,合入模块5用于将代码修改模块3修改后的目标代码提供给编程人员进行审核,由用户确认哪些修改可以合并到主分支中,哪些修改则不能合并到主分支中。
69.在本发明的一些实施方式中,合入模块5还配置用于:判断所述目标代码文件是否全部合入到所述程序的源代码中,响应于所述目标代码文件并未全部合并到所述程序的源代码中,将合并的所述程序的源代码文件按照预定方式重新编译,并将编译后的输出文件发送到所述代码分析模块1。
70.进一步,在本实施例中,合入模块5根据用户(编程人员)的确认后的合并方案,判断合并后的代码中修改后的目标代码是否被用户全部同意合并到主分支(中,如果没有被全部同意,则说明在异常向量空间中仍然会存在空洞空间。因此需要再经过一轮的分析、分配、修改。此时合入模块将用户确认的程序的源代码发送到编译模块6,并设定相应的参数输出多种类型的输出文件(反汇编文件、地址映射表文件等)。由代码分析模块1执行分析并开始下一轮优化。
71.在本发明的一些实施方式中,合入模块还配置用于:响应于所述目标代码文件全部合并到所述程序的源代码中,将所述合并后的程序的源代码编译成可执行文件。
72.在本实施例中,如果用同意将所有的目标代码文件合并到程序的源代码主分支中,或则是用户指出不进行下一轮优化,则合入模块将用户确认的源代码直接发送到编译模块6中编译出该程序的可执行文件。
73.实施例:本实施例以armv8架构的异常向量空间为例实施本发明所提出的程序异常向量空间优化系统。
74.armv8 cpu处于aarch64状态时,每种el都具有独立的16个entries,这16个entries分为四类异常,分别为:irq、fiq、serror、synchronous。而根据触发一种异常时是否会产生el级别的迁移和使用产生迁移时使用的是aarch64还是aarch32的指令集又具有四种不同的区域。不同于armv7中的每个异常的向量空间4字节,armv8中每个entry是0x80字节,可以放更多的代码在向量表里面。整个16个entries的分类和在向量表中的偏移关系如图9所示。
75.从图9中可以看到整个异常向量空间有0x800字节大小,也就是2048字节;这样的向量表在aarch64架构下有3个,因此总的异常向量空间共有6144字节,也就是6kb大小。
76.具体地,基于armv8cpu平台,本实施例实现的程序异常向量空间优化系统结构图如图8所示,包括代码分析模块1、空洞空间分配模块2以及代码修改模块3。
77.编译模块5:本模块的主要功能是根据硬件架构选择合适的工具链,调用编译工具链完成代码的编译工作,并产生后续模块所需的文件,如:符号表、反汇编文件、地址映射表等。
78.代码分析模块1:根据产生的可执行文件中及反汇编代码,分析异常向量空间是否有冗余代码。异常处理向量主要操作如下步骤:步骤一、将必要的寄存器入栈,常被称为保存现场;步骤二、跳转到异常处理流程;步骤三、将保存在栈里的寄存器恢复出来,常被称为恢复现场;步骤四、返回到异常之前执行。
79.在传统的实现方式上为了编写简单及安全性考虑,步骤一中会将所有的寄存器入栈,步骤三中又会将所有的寄存器出栈,这样不仅增加了异常处理向量的大小,同时也增加了运行时栈的空间,为了保存更多的寄存器又会消耗更多的cpu运行时间。另外分析linux内核中的异常处理向量表发现,如果异常处理向量大小不足0x80字节,不够的部分将使用nop指令填充。因此可以看到异常向量空间在实际的应用上有很多浪费。
80.因此,在本实施例中考虑到异常向量的处理流程实际并不需要特殊的参数传递,如中断处理流程:即在armv8架构中,cpu通过操作gic(generic interruptcontroller,通用中断控制器)获取中断号,找到对应的中断处理函数然后执行。所以在上述过程中步骤二从汇编跳转到c语言的过程中理论上只需要保存即将用到的寄存器即可;同样的对于异常,cpu也是通过读取异常寄存器来决定如何处理异常。
81.遵循上述原则,代码分析模块1就要对异常向量进行分析,尽可能减少异常处理向量中不必要的操作。分析完成后,将分析结果记录在中间过程文件中;同时还需要记录每条异常处理向量的实际大小。
82.除了上述两项主要工作内容,代码分析模块1还需要使用编译模块6产生的地址映射表文件分析存储在数据段中各个变量占用的空间,将这些信息排序后输出,供后续分配活动能够合理进行的。
83.因此总结起来,代码分析模块1的主要功能有如下三项:a)分析异常向量空间中各个异常向量是否有冗余代码,并找出其中真正进行异常处理的部分;b)根据a)完成之后的结果记录空洞空间原始信息;c)分析数据段各个变量占用空间;在本实施例中空洞空间分配模块2则根据代码分析模块1的产出,将数据区的内容根据预先设置的算法如动态规划或贪心算法分配至中断向量表空间,并记录该信息,用于更新代码分析模块的产出,也就是空洞空间管理模块输出的中间结果,完成后将输出本轮的最优解。完成后调用代码修改模块修改变量属性完成数据区变量分配到异常向量空间的工作。
84.但由于程序设计会有各种各样的需求,并且部分修改可能影响较大,因此有可能用户并不会将程序异常向量空间优化系统生成的目标代码文件合入到原有的代码中,即只
选择了部分目标代码合入到主分支中,这就需要在合入完成后再继续循环本过程,直到异常向量空间中多余的空间已完全被分配完为止,或者数据区存储的数据大于异常向量空间剩余空间为止。此时将产生一个最优解,同时将未分配到空洞空间的数据区的内容也记录下来,供后续合入模块使用。
85.在本实施例中,代码修改模块3首先根据代码分析模块1的产出,将异常向量空间中冗余代码删除,然后再根据预先设置在异常向量模板中的异常向量空间进行进一步分析,判断是否可以使用异常向量模板中的异常向量空间进行替换,并将模板中的处理函数修改为程序中实际调用的处理函数。
86.除此,代码修改模块3还需要根据空洞空间分配2模块的产出,修改数据区存放的变量对应代码的属性,完成真正将数据区的内容分配到异常向量空间的操作;也可以通过在汇编代码处添加标签,将对应变量的初值放入该标签随后的空间中,并将该标签设置为global类型,表明该标签是一个全局变量,这样就可以在c代码中使用该全局变量,这样也可以同样完成将数据区的变量分配至异常向量空间的操作。代码修改完成后再次调用编译模块进行编译,并启动后续流程。
87.在本实施例中,上述过程完成后,合入模块5将代码修改模块修改的内容呈现出来,并根据修改内容提示用户那些修改可能存在风险,最终由用户决定是否将修改合入代码主分支。合入完成再次运行本过程,查看结果。对于最终未能分配到异常向量空间的数据区的内容,由本模块给出提示,告知用户未能合入的原因,以及可行的建议。
88.在本实施例中,异常向量模板4记录最精简的各个架构下的异常向量空间,如最常见的arm架构、riscv架构及mips架构等,由代码修改模块调用。
89.通过本发明提出的一种程序异常向量空间优化方法,利用异常向量空间存储程序数据,以此缩减程序镜像文件的大小,可以有效的减少程序镜像文件占用的存储空间,随着程序镜像文件的减小,程序加载时间也将缩短;同时本发明又避免了类似在链接脚本中使用at关键字技术造成链接地址与运行地址不一致的问题。
90.如图2所示,本发明的另一方面提出一种程序异常向量空间优化方法,包括:步骤s1、分析程序编译后的输出文件以确定程序所对应的异常向量空间中的空洞空间以及程序编译后的目标变量;步骤s2、通过预定算法生成将目标变量分配到所述异常向量空间中的空洞空间的分配策略;步骤s3、基于所述分配策略对程序的源代码中的目标变量进行修改以生成目标代码文件。
91.如图3所示,本发明的又一方面还提出一种计算机设备,包括:至少一个处理器21;以及存储器22,所述存储器22存储有可在所述处理器21上运行的计算机指令23,所述指令23由所述处理器21执行时实现上述实施方式中任意一项所述方法的步骤。
92.如图4所示,本发明的再一方面还提出一种计算机可读存储介质401,所述计算机可读存储介质401存储有计算机程序402,所述计算机程序402被处理器执行时实现上述实施方式中任意一项所述方法的步骤。
93.以上是本发明公开的示例性实施例,但是应当注意,在不背离权利要求限定的本
发明实施例公开的范围的前提下,可以进行多种改变和修改。根据这里描述的公开实施例的方法权利要求的功能、步骤和/或动作不需以任何特定顺序执行。此外,尽管本发明实施例公开的元素可以以个体形式描述或要求,但除非明确限制为单数,也可以理解为多个。
94.应当理解的是,在本文中使用的,除非上下文清楚地支持例外情况,单数形式“一个”旨在也包括复数形式。还应当理解的是,在本文中使用的“和/或”是指包括一个或者一个以上相关联地列出的项目的任意和所有可能组合。
95.上述本发明实施例公开实施例序号仅仅为了描述,不代表实施例的优劣。
96.本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
97.所属领域的普通技术人员应当理解:以上任何实施例的讨论仅为示例性的,并非旨在暗示本发明实施例公开的范围(包括权利要求)被限于这些例子;在本发明实施例的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,并存在如上所述的本发明实施例的不同方面的许多其它变化,为了简明它们没有在细节中提供。因此,凡在本发明实施例的精神和原则之内,所做的任何省略、修改、等同替换、改进等,均应包含在本发明实施例的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1