任务栈溢出概述

任务栈溢出是缓冲区溢出的一种。 由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象就称为缓冲区溢出。缓冲区长度一般与用户自己定义的缓冲变量的类型有关。

在C语言中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。在任务中的局部变量是直接从任务栈中分配的,静态局部变量不在线程栈中,所以如果函数调用过多或者在函数中定义了大的数组或者变量容易导致局部变量占用空间超过栈空间,导致任务栈溢出。因此尽量避免在函数中定义占用空间较大的变量,如果需要可通过malloc函数从堆中分配。

各个嵌入式实时操作系统中系统默认任务栈大小各不相同。有的系统默认任务栈为4K,有的为8K,针对嵌入式系统而言,内存资源相对紧张,如果任务栈设置太大会导致内存资源的浪费。所以一般创建任务时提供参数让用户可以设置任务栈大小和任务栈地址,如果创建任务时使用的栈地址的默认值为NULL,系统会为任务分配堆栈。

国军标GJB7714(军用嵌入式实时操作系统应用编程接口)接口中定义了四个任务栈相关接口,用于用户设置和获取任务栈大小和任务栈地址。

int pthread_attr_setstacksize(pthread_attr_t *attr,size_t stacksize);

该接口用于设置任务属性对象 attr 中的 stacksize 属性,该属性指定了创建任务栈需分配的长度(字节)。

int pthread_attr_getstacksize(const pthread_attr_t *attr,size_t *stacksize);

该接口用于获取任务属性对象 attr 中的任务创建的 stacksize 属性。

int pthread_attr_setstackaddr(pthread_attr_t *attr,void *stackaddr);

该接口用来设置任务属性对象 attr 中的 stackaddr 属性。 stackaddr 属性指定了任务栈的存储位置,存储区域的大小最小为 PTHREAD_STACK_MIN。如果用户设置了任务栈,那么用户负责任务栈对应内存资源的回收。

int pthread_attr_getstackaddr(const pthread_attr_t *attr ,void **stackaddr);

该接口用于获取任务属性对象 attr 中的 stackaddr 属性,并存放在参数 stackaddr 指定的地址中。任务的 stackaddr 属性指定了任务栈的存储位置,最小为PTHREAD_STACK_MIN。

实时操作系统任务栈溢出检测原理

任务堆栈一但溢出,意味着系统的崩溃,因此操作系统提供栈溢出检查非常有必要。当前大多数CPU都具备MMU或者MPU,对任务栈溢出的检测十分简单。

通过设置栈顶部分空间为只读属性(即红色部分),当任务栈溢出访问红色部分空间时,MMU会产生内存性保护异常,操作系统就知道任务栈溢出了,一般操作系统会挂起对应的任务并输出打印信息提示用户任务栈溢出。

未来函数在线检测_嵌入式实时操作系统任务栈溢出检测原理相关推荐

  1. 【文件上传绕过】——后端检测_文件的扩展名检测漏洞

    文章目录 一.漏洞说明: 二.工具: 三.实验环境: 四.实验目的: 五.检测方法: 1. 黑名单: 2. 白名单: 六.绕过方式: 1. 白名单绕过: 1.1 解析漏洞: 1.2 截断上传: 原理: ...

  2. keras faster物体检测_全网 | 深度学习目标检测算法(精选12篇)

    太多的公众号每天的文章是否让你眼花缭乱?刷了好多文章,发现大都是转来转去?今天我在全网公众号里为大家精选主题为深度学习目标检测算法的文章12篇,其中包括综述,R-CNN,SPP-Net,Fast R- ...

  3. java 波峰检测_脉搏波波峰波谷自动检测方法

    脉搏波波峰波谷自动检测方法 [技术领域] [0001]本发明属人体健康监护技术领域,涉及一种脉搏波波峰波谷自动检测方法,尤其涉及脉搏波中存在大量人为.系统噪声以及心率快速变化的情况.可用于临床心电图自 ...

  4. tensorflow图形检测_社交距离检测器——Tensorflow检测模型设计

    在隔离期间,我花时间在github上探索Tensorflow的大量预训练模型.这样做时,我偶然发现了一个包含25 个带有性能和速度指标的预训练对象检测模型的存储库.拥有一些计算机视觉知识并给出了实际的 ...

  5. python 椭圆检测_使用OpenCV和Python检测触摸/重叠圆/椭圆

    这是我检测圈子的尝试.综上所述 >执行BGR-> HSV转换,并使用V通道进行处理 V通道: >阈值,应用形态关闭,然后进行距离转换(我会称之为dist) 分区形象: >创建一 ...

  6. python 圆形检测_基于opencv-python的圆形检测

    一.图像基本处理 通常我们获取到的原始图像包含了比较多的背景噪声,影响我们对目标的提取,因此在进行变换前,我们会采取一些预处理方法对图像进行增强,如: 1.灰度处理 2.边缘检测,常用Canny算子: ...

  7. python图片目标检测_图像中的目标检测(HOG)

    我想探测显微镜图像细胞内的物体.我有很多带注释的图片(app.有对象的图像为50000,没有对象的图像为500000).在 到目前为止,我尝试使用HOG提取特征,并使用logistic回归和Linea ...

  8. 聚类技术---复杂网络社团检测_自然场景中交通标志牌检测~文末送书

    导读:近年来,交通标志牌检测技术已经成为智能驾驶公交车辆视觉导航系统和计算机视觉领域的热点之一. 本文为6月份刚出版的新书<智能驾驶技术:路径规划与导航控制>节选,探讨基于视觉协同显著性的 ...

  9. java 系统自动检测_如何在Java中检测OS(操作系统)名称?

    java 系统自动检测 To detect the OS (operating system) name in Java, we use the getProperties() method, whi ...

最新文章

  1. mysql 查询某个日期时间段,每天同一时间段的数据
  2. 从编译原理看一个解释器的实现
  3. MegaSAS RAID卡 BBU Learn Cycle周期的影响
  4. 单点登录终极方案之 CAS 应用及原理
  5. 工程中多个不同类型线程池_软件工程中不同类型的设计策略
  6. postman断言作用及怎么使用
  7. 【我的物联网成长记13】物联网卡能否携号转网?
  8. three.js中文文档下载_threejs基础学习一
  9. android view moveto,android – cursor.moveToPosition(i)的速度有多快?
  10. 2011-9-11 凌晨00:46
  11. 揭开BootStrap的神秘面纱
  12. 监听pda扫描_uniapp App监听PDA扫描工具数据
  13. 专访 | 阿里前辈李智慧:聊聊我这20年的架构经!
  14. java打印 X XX XXX XXXX
  15. 基于OpenXR,Collabora推开源VI-SLAM AR/VR定位系统
  16. 往自己脖子以上的投资永远不会贬值
  17. 【算法】 二叉树遍历
  18. android电视分辨率是多少合适,电视分辨率多少合适
  19. 2017-10-20 西电 新一代人工智能与深度学习“国际”研讨会第一天见闻
  20. hall 状态下,禁用指纹解锁

热门文章

  1. mongodb数组更新操作符$push
  2. ReferenceError: XXX is not defined 错误及解决办法
  3. linux pid文件找不到,linux – 当’正确’时,PID文件是否仍有缺陷?
  4. java提交按钮_java – 允许“Enter”键按提交按钮,而不是仅使用MouseClick
  5. mysql可扩展数据库_五大技巧提高MySQL可扩展性
  6. php 数组的处理,php 数组处理
  7. php 和风天气,【原创】彩云/和风天气插件
  8. 学习机软件测试,IBM P630 POWER4 AIX小型机适合软件测试及学习机
  9. java swing 如何设置按钮大小_Java Swing - Button不改变宽度的大小
  10. Ubuntu 添加用户