当前位置:网站首页>嵌入式开发:使用堆栈保护提高代码完整性
嵌入式开发:使用堆栈保护提高代码完整性
2022-08-04 17:23:00 【粤嵌教育】
开发可靠的嵌入式软件归结为计划最坏的情况,并确保嵌入式开发人员有适当的防护措施和陷阱来处理这些情况。嵌入式软件中一个被忽视的领域通常是堆栈。堆栈是微控制器用来存储局部变量、函数调用返回地址、中断上下文和函数参数等信息的临时存储器。
为给定的应用程序设置堆栈大小完全取决于开发人员。许多编译器会提供默认值0x400字节,但这对所有应用程序来说真的足够了吗?对于任何给定的应用程序,确定堆栈的大小都很困难。开发人员需要确定最坏情况的使用,这包括了解最大函数调用深度、将在堆栈上定义多少局部变量,甚至可能需要存储多少并发中断上下文。即使有今天的技术和工具,这也不是一件容易的事。
那么开发者做什么呢?他只需确定当天的风向,从稀薄的空气中抽出一个数字,并把这个数字作为堆栈的大小。底线是,如果堆栈溢出了分配给它的内存区域,最坏的情况会是什么?图1显示了典型的内存映射以及堆、堆栈和全局/静态区域的位置。嵌入式开发随着堆栈的增长,它将朝着内存映射的全局/静态变量区域增长。如果堆栈溢出,它将开始覆盖全局和静态变量定义!导致存储在内存中的值被破坏,并有机会对系统的行为造成严重破坏。
图1–内存映射
一个可靠的系统不能允许堆栈溢出。那么,当这种情况出现时,有什么技术可以检测到呢?最常见的技术之一是在堆栈和全局/静态变量区域之间创建一个保护区域。应该选择足够大的保护区域,这样如果堆栈溢出,它就不能穿透下面的内存区域。一些常见的值是16和32字节,但这些需要基于一次可以放入堆栈的最大对象。存储器映射设置示例如图2所示。
图2–堆栈保护存储器映射
微控制器可以通过两种方式监控保护区。第一种是使用板载存储器保护单元(MPU )(如果微控制器上有)。在这种情况下,如果对存储器的堆栈保护区有任何写访问,MPU将被设置为触发中断。中断触发表明堆栈溢出,可以采取保护措施并记录错误。
如果MPU不可用,嵌入式开发人员可以在系统初始化期间用已知的位模式填充存储器的保护区。然后可以创建一个任务或函数,定期检查保护区,并将其与已知的位模式进行比较。如果模式已经改变,那么应用程序可以强制中断,然后记录错误并开始纠正措施。
有两种不同的方法可以用来创建大模式。第一种是使用链接器文件在堆栈保护中创建一个填充区域。该区域将在启动时的C复制期间自动初始化。第二种方法是手动写入位模式,作为系统初始化的一部分,方法是创建一个指向堆栈保护开始的指针,然后将位模式放入内存。
可以说,在适当的位置设置堆栈保护会降低嵌入式软件的效率。让应用程序定期检查防护是否仍然完好,可能需要一个函数调用、一个循环和一个取消引用的指针。这种性能影响在现代微控制器上几乎不明显,应该是一个静音点。在创建一个可靠的系统时,嵌入式开发人员需要进行这些类型的检查,以确保系统按预期运行。如果发生灾难性故障,如堆栈溢出,系统将能够检测到溢出,并在系统发生可怕的事情或甚至更糟的系统用户发生之前采取纠正措施。
边栏推荐
- 谷歌开发者社区推荐:《Jetpack Compose 从入门到实战》新书上架,带你踏上 Compose 开发之旅~
- 机器学习(十六):主成成分分析(PCA)
- 两个对象相同数据赋值
- IDEA以多端口启动同一个服务项目
- init和destory方法
- How to convert an int attribute into a string in the json format returned by the Go language gin framework?
- 学习探索-网站中引入百度统计
- 消灭异步回调,还得是async-await
- Cron表达式
- 通关剑指 Offer——剑指 Offer II 010. 和为 k 的子数组
猜你喜欢
如何模拟后台API调用场景,很细!
小程序笔记2
餐饮供应链管理系统
【技术积累】JS事件循环,Promise,async/await的运行顺序
Kotlin挂起函数原理是什么
Fork/Join框架
Clearance sword refers to Offer——The sword refers to Offer II 010. and the sub-array of k
mysql学习笔记——利用动态SQL和Session变量实现一个公式或者计算器
The second step through MySQL in four steps: MySQL index learning
《机器学习的随机矩阵方法》
随机推荐
北京海淀6家必胜客被暂停外卖订餐 存在食品安全问题
JSP的Web监听器(Listener)
Cesium快速上手0-Cesium安装与基本介绍
机器学习(十三):支持向量机(SVM)
RecyclerView 缓存与复用机制
【日记】mysql数据库连接池
软件测试高频面试题真实分享/网上银行转账是怎么测的,设计一下测试用例。
R语言时间序列数据算术运算:使用diff函数计算时间序列数据的逐次差分、使用时间序列之间的除法计算相对变化率(乘以100获得百分比)
【Gazebo入门教程】第二讲 模型库导入与可视化机器人建模(模型编辑器)
华硕win11安全启动如何开启
我的大一.
.NET云原生应用发展论坛--8月7日邀你一起云上探索
树莓派利用autofs自动挂载/卸载外部硬盘
R语言缺失时间序列的填充及合并:补齐时间序列数据中所有缺失的时间索引、使用merge函数合并日期补齐之后的时间序列数据和另外一个时间序列数据(补齐左侧数据)
taro 滚动组件ScrollView
R语言ggplot2可视化:使用ggpubr包的ggbarplot函数可视化柱状图、color参数指定柱状图的边框的色彩
启动项目(瑞吉外卖)
租房小程序登顶码云热门
小满nestjs(第一章 介绍nestjs)
pyhon爬虫之爬取图片(亲测可用)