完成端口 堆栈溢出_Zephyr使用的堆栈保护技术

本文介绍了Zephyr操作系统如何应对线程堆栈溢出问题,包括堆栈检查点、函数堆栈检查和随机堆栈指针等软件保护技术,以及硬件保护技术如MPU的使用。此外,还提供了评估和预防线程堆栈溢出的方法。
摘要由CSDN通过智能技术生成

在Zephyr中每个线程的堆栈大小在创建时就已经指定,运行过程中无法再做改变,线程运行的上下文是存放在线程的堆栈中,一旦堆栈被破坏意味着线程的执行上下文被破坏,这将导致线程执行出现不可预期的异常,Zephyr针对可能造成线程破坏的情况提供了保护,监控,预防手段。本文将介绍比较通用的一些堆栈保护技术,这些技术除了在Zephyr上出现外,其它OS也广泛的采用了这些技术。

Zephyr线程堆栈结构

Zephyr使用K_THREAD_STACK_DEFINE创建的线程堆栈,所有的线程堆栈会在内存中依次放在noinit段内。如下图所示187dd8a33e337c54414a8d494447f700.png
Zephyr创建了A~E五个线程相邻而放,在一个线程堆栈内函数调用会占用堆栈,诸如局部变量,传递参数等会放到堆栈内,上图函数调用关系是Fun1调用Fun2,Fuc2调用Fun3。一般情况下堆栈的生长方向是由高地址向低地址(也有特殊的体系架构是反着的),本文只讨论高向低生长的情况。基于以上的堆栈结构,堆栈可能出现下面2个问题:
问题1. 线程中调用的函数层级过深,或者某个函数需要的堆栈很大,会导致堆栈增长超过线程分配的堆栈而写到其它线程堆栈中,例如线程C中Fun3继续调用其它函数一层层下去,堆栈会增长超过C的stack而进入到B中,把B写坏。
问题2. 函数操作局部变量发生溢出写过局

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值