一种SPARC平台任务栈溢出检测算法制造技术

技术编号:15401212 阅读:62 留言:0更新日期:2017-05-24 12:15
本发明专利技术公开了一种SPARC平台任务栈溢出检测算法,其特征在于:所述检测算法针对每个任务维护一个单独的变量current_stack_max,记录当前栈的最大使用量,初始值为0;任务栈在任务创建时初始化为0;任务栈的栈顶保留一个空函数栈帧大小的余量,栈使用超过该余量,即视为溢出。本发明专利技术算法准确、效率高,可以有效帮助应用开发人员合理分配任务栈大小,提高系统的可靠性及安全性。

A task stack overflow detection algorithm for SPARC platform

The invention discloses a SPARC platform task stack overflow detection algorithm, which is characterized in that the detection algorithm for each task to maintain a single variable current_stack_max, use the largest record of the current stack, the initial value is 0; in the task of creating a task stack are initialized to 0; the task remains a top of the stack empty function stack frame size of the margin, the margin is more than the use of the stack, as overflow. The invention has the advantages of accurate algorithm and high efficiency, and can effectively help the application developer to reasonably distribute the task stack size and improve the reliability and the security of the system.

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

【技术保护点】
一种SPARC平台任务栈溢出检测算法,其特征在于:所述检测算法针对每个任务维护一个单独的变量current_stack_max,记录当前栈的最大使用量,初始值为0;任务栈在任务创建时初始化为0;任务栈的栈顶保留一个空函数栈帧大小的余量,栈使用超过该余量,即视为溢出;算法步骤如下: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为空函数栈帧的大小。

【技术特征摘要】
1.一种SPARC平台任务栈溢出检测算法,其特征在于:所述检测算法针对每个任务维护一个单独的变量current_stack_max,记录当前栈的最大使用量,初始值为0;任务栈在任务创建时初始化为0;任务栈的栈顶保留一个空函数栈帧大小的余量,栈使用超过该余量,即视为溢出;算法步骤如下:1)、首先比较current_stack_max和任务控制块中保存的当前函数栈帧的栈顶TCB_SP,求得min(current_stack_max,TCB_SP);2)、从栈顶...

【专利技术属性】
技术研发人员:卓保特李尚杰程胜许开维
申请(专利权)人:北京神舟航天软件技术有限公司
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1