一种基于list文件任务最大堆栈深度的检测方法

文档序号:6526730阅读:297来源:国知局
一种基于list文件任务最大堆栈深度的检测方法
【专利摘要】一种基于list文件任务最大堆栈深度的检测方法,首先分析list文件,提取出各函数分配堆栈的大小,生成任务入口函数及中断入口函数的最终函数调用关系树,其次根据各函数分配堆栈的大小及任务入口函数及中断入口函数的最终函数调用关系树,采用递归的方法检测出各任务的最大堆栈深度。本发明能够准确给出任务的最大堆栈深度,解决了动态分析方法往往检测不到最大堆栈深度的问题。
【专利说明】一种基于I ist文件任务最大堆栈深度的检测方法
【技术领域】
[0001]本发明涉及一种基于list文件任务最大堆栈深度的检测方法,尤其涉及一种航天嵌入式软件的任务最大堆栈深度的检测方法,属于嵌入式软件可靠性验证【技术领域】。
【背景技术】
[0002]嵌入式软件最大堆栈深度(worst-case-stack depth, WCSD)是指导硬件设计和软件开发的重要指标,然而它的测量却极其困难。当前人们通常使用动态方法或者静态方法来检测WCSD。动态方法是运行被测软件,测得的最大堆栈深度通常小于软件的实际最大堆栈深度。静态方法是通过分析程序代码或编译后的相关文件来计算WCSD。
[0003]如发表在《计算机工程与设计》2012年7月第7期上的“WCSD动态检测方法”和发表在《计算机工程与应用》第2012,48 (36)期上的“基于遗传算法的嵌入式软件WCSD检测方法”均属于动态检测方法。动态方法测得的最大堆栈深度通常小于软件的实际最大堆栈深度,软件依据该过程进行预设堆栈大小存在堆栈溢出的隐患。
[0004]如发表在《空间控制技术与应用》第36卷第2期上的“一种用于分析MCS51目标码堆栈深度的方法”是一种静态的分析方法。然而该方法仅适用MC51处理器,对spare处理器嵌入式软件并不适用。

【发明内容】

[0005]本发明解决的技术问题是:克服现有技术的不足,提供一种基于list文件任务最大堆栈深度的检测方法,解决了动态分析方法往往检测不到最大堆栈深度的问题,提出了一种通用的新的检测最大堆栈深度静态分析方法。
[0006]本发明包括如下技术方案:一种基于list文件任务最大堆栈深度的检测方法,步骤如下:
[0007]1)分析list文件,获得所有函数及函数使用堆栈的大小;
[0008]11)识别list文件中的代码段的范围;
[0009]12)在代码段的起始和结束范围内,提取list文件包含的所有函数,并记录每个函数的名称及地址;
[0010]13)在步骤12)提取的各函数包含的代码段范围内,查找改变寄存器窗口指令、弹出堆栈指令、预留堆栈指令;根据上述三个指令后的立即数,获得并记录各函数分配堆栈的大小;
[0011]2)找出步骤12)提取的各函数中所有的任务入口函数及中断入口函数;
[0012]3)创建任务入口函数的函数调用关系树;
[0013]31)以步骤2)提取出的每个任务入口函数作为该函数调用关系树的顶层节点,在该任务入口函数包含的代码段范围内,查找list文件中的函数调用指令、跳转指令以及陷阱指令,得到该任务入口函数的下层调用函数作为顶层节点的子节点,生成新的函数调用关系树;[0014]32)在新的函数调用关系树的最底层子节点的代码段范围内,查找list文件中的函数调用指令、跳转指令以及陷阱指令,得到新的函数调用关系树的最底层子节点的下层调用函数;
[0015]33)重复步骤32)直至当新的函数调用关系树的最底层子节点无函数调用指令、跳转指令以及陷阱指令,并建立任务入口函数的最终函数调用关系树;
[0016]4)创建中断入口函数的函数调用关系树;
[0017]41)以步骤12)提取出的每个中断入口函数作为该函数调用关系树的顶层节点,在该中断入口函数包含的代码段范围内,查找list文件中的函数调用指令、跳转指令以及陷阱指令,得到该中断入口函数的下层调用函数作为顶层节点的子节点,生成新的函数调用关系树;
[0018]42)在新的函数调用关系树的最底层子节点的代码段范围内,查找list文件中的函数调用指令、跳转指令以及陷阱指令,得到新的函数调用关系树的最底层子节点的下层调用函数;
[0019]43)重复步骤42)直至新的函数调用关系树的最底层子节点无函数调用指令、跳转指令以及陷阱指令,并建立中断入口函数的最终函数调用关系树;
[0020]5)根据步骤3)以及步骤4)获得的最终函数调用关系树,获得各任务的最大堆栈深度;
[0021]51)以任务入口函数为起点,以任务入口最终函数调用关系树为路径,采用递归的方式,获得各调用路径使用的堆栈大小;
[0022]52)以中断入口函数为起点,以中断入口最终函数调用关系树为路径,采用递归的方式,获得各调用路径使用的堆栈大小;
[0023]53 )将任务入口函数各路径使用的最大堆栈与中断入口函数各路径使用的最大堆栈相加,作为任务使用的最大堆栈。
[0024]本发明与现有技术相比的有益效果是:
[0025](1)本发明能够准确给出任务的最大堆栈深度,解决了动态分析方法往往检测不到最大堆栈深度的问题。
[0026](2)本方法缩短了软件开发周期,解决了最大堆栈深度依靠设计师经验及测试确定的问题,缩短了迭代开发过程。
[0027](3)提出了一种通用的新的检测最大堆栈深度静态分析方法,其他处理器仅需根据各自的汇编码进行适应性修改即可使用该方法。
【专利附图】

【附图说明】
[0028]图1是本发明方法检测流程。
【具体实施方式】
[0029]1.分析list文件,获得所有函数及函数使用堆栈的大小;
[0030]1.1.识别list文件中的代码段的范围;针对list文件的特点,识别出1 ist文件中的代码段的范围。识别text段的起始“Disassembly of section, text: ”。识别代码段的结束“Disassembly of section, data:,,;[0031]1.2.在代码段的起始和结束范围内,提取list文件包含的所有函数,并记录每个函数的名称及地址;list文件中函数的特征为“〈函数名 >:”,匹配到该类型的字符串作为函数的起始位置,以函数返回指令(ret、restore、retl)为函数的结束位置,并记录函数名称及地址。
[0032]1.3.在步骤1.2提取的各函数包含的代码段范围内,查找改变寄存器窗口指令、弹出堆栈指令、预留堆栈指令(〃save%sp, 〃、〃add%sp, 〃、〃sub%sp, 〃);根据上述三个指令后的立即数,得出并记录各函数分配堆栈的大小;以上各步骤特征字符串均可依据不同类型的处理器,通过配置文件更改。
[0033]2.找出步骤1.2提取的所有任务入口函数及中断入口函数;该步骤找出的任务入口函数及中断入口函数作为下一步分析函数调用关系树的第一层节点;
[0034]3.分析任务入口函数的函数调用关系树;
[0035]3.1.以步骤2提取出的每个任务入口函数作为该函数调用关系树的顶层节点,在该任务入口函数包含的代码段范围内,查找list文件中的函数调用指令、跳转指令以及陷阱指令,得到该任务入口函数的下层调用函数作为顶层节点的子节点;
[0036]3.2.在当前函数调用关系树的最底层子节点的代码段范围内,查找list文件中的函数调用指令、跳转指令以及陷阱指令,得到当前函数调用关系树的最底层子节点的下层调用函数;
[0037]3.3.重复步骤3.2直至当前函数调用关系树的最底层子节点无函数调用指令、跳转指令以及陷阱指令,并建立任务入口函数的最终函数调用关系树;
[0038]4.分析中断入口函数的函数调用关系树;
[0039]4.1.以步骤1.2提取出的每个中断入口函数作为该函数调用关系树的顶层节点,在该中断入口函数包含的代码段范围内,查找list文件中的函数调用指令、跳转指令以及陷阱指令,得到该中断入口函数的下层调用函数作为顶层节点的子节点;
[0040]4.2.在当前函数调用关系树的最底层子节点的代码段范围内,查找list文件中的函数调用指令、跳转指令以及陷阱指令,得到当前函数调用关系树的最底层子节点的下层调用函数;
[0041]4.3.重复步骤4.2直至当前函数调用关系树的最底层子节点无函数调用指令、跳转指令以及陷阱指令,并建立中断入口函数的最终函数调用关系树;
[0042]5.根据步骤3以及步骤4获得的最终函数调用关系树,获得各任务的最大堆栈深度;
[0043]5.1.以任务入口函数为起点,以任务入口最终函数调用关系树为路径,采用递归的方式,获得各调用路径使用的堆栈大小;
[0044]5.2.以中断入口函数为起点,以中断入口最终函数调用关系树为路径,采用递归的方式,获得各调用路径使用的堆栈大小;
[0045]5.3.将任务入口函数各路径使用的最大堆栈与中断入口函数各路径使用的最大堆栈相加,作为任务使用的最大堆栈。
[0046]该方法已在嫦娥三号及其他多个型号的任务设计及验证中得到了应用,确保合理预分配了任务堆栈深度,提高了软件可靠性。
[0047]说明书中未作详细描述的内容属本领域技术人员的公知技术。
【权利要求】
1.一种基于list文件任务最大堆栈深度的检测方法,其特征在于步骤如下:1)分析list文件,获得所有函数及函数使用堆栈的大小;11)识别list文件中的代码段的范围;12)在代码段的起始和结束范围内,提取list文件包含的所有函数,并记录每个函数的名称及地址;13)在步骤12)提取的各函数包含的代码段范围内,查找改变寄存器窗口指令、弹出堆栈指令、预留堆栈指令;根据上述三个指令后的立即数,获得并记录各函数分配堆栈的大小;2)找出步骤12)提取的各函数中所有的任务入口函数及中断入口函数;3)创建任务入口函数的函数调用关系树;31)以步骤2)提取出的每个任务入口函数作为该函数调用关系树的顶层节点,在该任务入口函数包含的代码段范围内,查找list文件中的函数调用指令、跳转指令以及陷阱指令,得到该任务入口函数的下层调用函数作为顶层节点的子节点,生成新的函数调用关系树;32)在新的函数调用关系树的最底层子节点的代码段范围内,查找list文件中的函数调用指令、跳转指令以及陷阱指令,得到新的函数调用关系树的最底层子节点的下层调用函数;33)重复步骤32)直至当新的函数调用关系树的最底层子节点无函数调用指令、跳转指令以及陷阱指令,并建立任务入口函数的最终函数调用关系树;4)创建中断入口函数的函数调用关系树;41)以步骤12)提取出的每个中断入口函数作为该函数调用关系树的顶层节点,在该中断入口函数包含的代码段范围内,查找list文件中的函数调用指令、跳转指令以及陷阱指令,得到该中断入口函数的下层调用函数作为顶层节点的子节点,生成新的函数调用关系树;42)在新的函数调用关系树的最底层子节点的代码段范围内,查找list文件中的函数调用指令、跳转指令以及陷阱指令,得到新的函数调用关系树的最底层子节点的下层调用函数;43)重复步骤42)直至新的函数调用关系树的最底层子节点无函数调用指令、跳转指令以及陷阱指令,并建立中断入口函数的最终函数调用关系树;5)根据步骤3)以及步骤4)获得的最终函数调用关系树,获得各任务的最大堆栈深度;51)以任务入口函数为起点,以任务入口最终函数调用关系树为路径,采用递归的方式,获得各调用路径使用的堆栈大小;52)以中断入口函数为起点,以中断入口最终函数调用关系树为路径,采用递归的方式,获得各调用路径使用的堆栈大小;53)将任务入口函数各路径使用的最大堆栈与中断入口函数各路径使用的最大堆栈相力口,作为任务使用的最大堆栈。
【文档编号】G06F11/36GK103678137SQ201310746685
【公开日】2014年3月26日 申请日期:2013年12月30日 优先权日:2013年12月30日
【发明者】万丽景, 杨孟飞, 党纪红, 董晓刚, 关小川, 陈尧, 綦艳霞, 顾斌, 王政 申请人:北京控制工程研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1