一种sparc平台任务栈溢出检测算法

文档序号:6538495阅读:370来源:国知局
一种sparc平台任务栈溢出检测算法
【专利摘要】本发明公开了一种SPARC平台任务栈溢出检测算法,其特征在于:所述检测算法针对每个任务维护一个单独的变量current_stack_max,记录当前栈的最大使用量,初始值为0;任务栈在任务创建时初始化为0;任务栈的栈顶保留一个空函数栈帧大小的余量,栈使用超过该余量,即视为溢出。本发明算法准确、效率高,可以有效帮助应用开发人员合理分配任务栈大小,提高系统的可靠性及安全性。
【专利说明】—种SPARC平台任务栈溢出检测算法
【技术领域】
[0001]本发明属于嵌入式实时操作系统开发领域,具体地说,涉及一种SPARC平台任务栈溢出检测算法。
【背景技术】
[0002]SPARC是一种开源的RISC处理器架构技术,在国内广泛的应用在航天领域。同时,随着航天任务的复杂化,嵌入式实时操作系统在航天领域的应用也越来越广泛。为保证系统的实时性与安全性,嵌入式实时操作系统中任务使用的堆栈一般都静态分配,对于基于RTOS的应用开发人员,由于缺乏对底层硬件及编译器编译规则的了解,通常难以给任务分配合适的栈大小,导致任务栈溢出,开发人员需花大量时间查找原因。因此现在有些嵌入式实时操作系统提供了任务栈溢出的检测函数,在系统空闲时调用,可以在任务栈将要溢出或已经溢出时给出报警,帮助应用开发人员了解任务栈的使用情况,并调整任务栈大小,预防任务栈的溢出。
[0003]现有技术存在的主要问题:
[0004]1、现有的任务栈溢出检测算法简单、通用,但由于SPARC平台的特殊性,不能给出运行在SPARC平台的任务栈溢出的准确判定结果。如目前在国内航天领域广泛使用的SPARC V7、V8架构,硬件并不提供栈溢出检测的支持,该算法在就绪任务运行之前,比较其SP指针与栈最大使用量限制指针StkLimitPtr,在栈向下增长时,如果SP小于StkLimitPtr,则任务运行时会有溢出的可能。但即使SP大于StkLimitPtr,在任务获得CPU不断运行过程中,仍有可能导致栈溢出,且在任务放弃CPU时,由于函数栈帧的释放使SP指针已经后退到StkLimitPtr之下,这种情况下,该算法无法检测出任务栈发生过溢出。
[0005]2、还有一种方法是通过进行任务栈最大使用量检测来判断任务栈的溢出。该算法在任务创建时将任务栈清0,在系统空闲时,检测任务栈的使用量,从栈顶开始,向栈底依次判断当前内存内容是否为0,记录第一个不为O的内存地址,计算当前的内存空闲量,以判断任务栈是否溢出。该算法性能较差,可能尚未比较完,就被高优先级的任务打断,再次返回时任务栈的使用量可能已超过当前比较地址,从而得出错误的结果;另外由于SPARC架构下寄存器窗口的特殊性,每个函数的栈帧都至少有0x40字节的空间用来存储寄存器窗口溢出时当前寄存器窗口的内容。该段空间大多数情况下,并不会被使用,内容仍然为0,如果该段空间恰好在栈顶处,此时任务栈已经溢出,但是该算法会给出错误的判断。

【发明内容】

[0006]本发明要解决的技术问题是克服上述缺陷,提供一种SPARC平台任务栈溢出检测算法,该算法准确、效率高,可以有效帮助应用开发人员合理分配任务栈大小,提高系统的可靠性及安全性。
[0007]为解决上述问题,本发明所采用的技术方案是:
[0008]一种SPARC平台任务栈溢出检测算法,其特征在于:所述检测算法针对每个任务维护一个单独的变量current_stack_max,记录当前栈的最大使用量,初始值为O ;任务栈在任务创建时初始化为O ;任务栈的栈顶保留一个空函数栈帧大小的余量,栈使用超过该余量,即视为溢出。
[0009]作为一种改进,所述算法步骤如下:
[0010]I)、首先比较current_stack_max和任务控制块中保存的当前函数栈巾贞的栈顶TCB_SP,求得 min (current_stack_max, TCB_SP);
[0011]2)、从 stack_top 开始依次比较[stack_top, min (current_stack_max, TCB_SP)]区间段内存单元的内容,遇到非零的内存单元停止比较,指针order_search指向该单元;
[0012]3)、比较 stack_top 与 order_search_0x68,如果 stack_top 大于等于 order_search_0x68,则任务栈溢出;否则将 current_stack_max 更新为 order_search。其中 0x68为空函数函数栈帧的大小。
[0013]由于采用了上述技术方案,与现有技术相比,本发明是针对每个任务维护一个单独的变量current_stack_max,记录当前栈的最大使用量,初始值为O ;任务栈在任务创建时初始化为O ;任务栈的栈顶保留一个空函数栈帧大小的余量,栈使用超过该余量,即视为溢出。本发明算法准确、效率高,可以有效帮助应用开发人员合理分配任务栈大小,提高系统的可靠性及安全性。
【专利附图】

【附图说明】
[0014]图1为本发明一种实施例的精确的SPARC平台栈溢出检测算法示意图。
【具体实施方式】
[0015]实施例:
[0016]如图1所示,一种SPARC平台任务栈溢出检测算法,所述检测算法是针对每个任务维护一个单独的变量current_stack_max,记录当前栈的最大使用量,初始值为O ;任务栈在任务创建时初始化为O ;任务栈的栈顶保留一个空函数栈帧大小的余量,栈使用超过该余量,即视为溢出。
[0017]在本实施例中,所述算法步骤如下:
[0018]I)、首先比较current_stack_max和任务控制块中保存的当前函数栈巾贞的栈顶TCB_SP,求得 min (current_stack_max, TCB_SP)。
[0019]2)、从 stack_top 开始依次比较[stack_top, min (current_stack_max, TCB_SP)]区间段内存单元的内容,遇到非零的内存单元停止比较,指针order_search指向该单元。
[0020]3)、比较 stack_top 与 order_search_0x68,如果 stack_top 大于等于 order_search_0x68,则任务栈溢出;否则将 current_stack_max 更新为 order_search。其中 0x68为空函数函数栈帧的大小。
[0021]本发明是针对每个任务维护一个单独的变量current_stack_max,记录当前栈的最大使用量,初始值为O ;任务栈在任务创建时初始化为O ;任务栈的栈顶保留一个空函数栈帧大小的余量,栈使用超过该余量,即视为溢出。本发明算法准确、效率高,可以有效帮助应用开发人员合理分配任务栈大小,提高系统的可靠性及安全性。
[0022]以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种SPARC平台任务栈溢出检测算法,其特征在于:所述检测算法针对每个任务维护一个单独的变量current_stack_max,记录当前栈的最大使用量,初始值为O ;任务栈在任务创建时初始化为O ;任务栈的栈顶保留一个空函数栈帧大小的余量,栈使用超过该余量,即视为溢出。
2.根据权利要求1中所述的SPARC平台任务栈溢出检测算法,其特征在于:所述算法步骤如下: 1)、首先比较current_stack_max和任务控制块中保存的当前函数栈巾贞的栈顶TCB_SP,求得 min (current_stack_max, TCB_SP); 2)、从stack_top 开始依次比较[stack_top, min (current_stack_max, TCB_SP)]区间段内存单元的内容,遇到非零的内存单元停止比较,指针order_search指向该单元; 3)、比较stack_top 与 order_search_0x68,如果 stack_top 大于等于 order_search_0x68,则任务栈溢出;否则将 current_stack_max 更新为 order_search。其中 0x68为空函数函数栈帧的大小。
【文档编号】G06F9/30GK103870244SQ201410060928
【公开日】2014年6月18日 申请日期:2014年2月21日 优先权日:2014年2月21日
【发明者】卓保特, 李尚杰, 程胜, 许开维 申请人:北京神舟航天软件技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1