0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何利用现代嵌入式开发工具中的堆栈保护功能

li5236 来源:IAR Systems 作者:IAR Systems 2022-03-29 14:50 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在开发以MCU为核心的嵌入式系统时,当软件程序向预设的数据结构(通常是一个固定长度的缓冲区)之外的程序调用堆栈的内存地址范围写入数据时,就会发生堆栈缓冲区溢出。这几乎必然会损坏附近的数据,甚至会改变返回函数。如果是有意为之,则这就是我们熟知的堆栈粉碎。防范堆栈缓冲区溢出的一种方法是使用堆栈canary,因其类似于在煤矿中使用金丝雀侦测毒气而得名。目前,在以IAR Embedded Workbench为代表的领先开发工具的所有最新版本中,均已支持堆栈保护功能。

堆栈保护功能已经成为最新嵌入式开发工具中必要的功能,但要在诸如IAR Embedded Workbench for Arm这样的行业标杆工具中实现堆栈保护,就要使用一种启发式算法来确认一个函数是否需要堆栈保护。如果任何函数内定义的局部变量为数组类型或包含数组类型成员的结构类型,则该函数就需要堆栈保护。此外,如果任何局部变量的地址被传播到函数之外,则该函数也需要堆栈保护。

如果一个函数需要堆栈保护,那么该函数的局部变量将被按序排放,将数组类型的变量在函数堆栈中被放置在尽可能高的地址。在这些变量之后,会放置一个canary元素。在函数入口处,canary被初始化。初始化值取自全局变量 __stack_chk_guard。在函数退出时,代码会验证canary元素是否仍然包含初始化值。如果该数值被改变,函数 __stack_chk_fail就会被调用。

以被广泛使用的IAR Embedded Workbench for Arm嵌入式开发工具为例,使用Project》Options》C/C++ Compiler》Code》Stack protection选项,即可针对被认定为需要保护的函数启用堆栈保护。

image.png

或者,您也可以使用Project》Options》C/C++ Compiler》Extra Options页面,指定 --stack_protection命令行来启用堆栈保护功能。

在实际应用实现堆栈保护

要使用堆栈保护,开发人员必须在应用中定义以下对象:

· extern uint32_t __stack_chk_guard全局变量 __stack_chk_guard在第一次使用前必须被初始化。如果初始化值是随机的,则安全性会更高。

· __interwork __nounwind __noreturn void __stack_chk_fail(void)__stack_chk_fail函数的作用是通知发生了错误,然后终止应用。请注意,这个函数的返回地址将指向失效函数。

arm\src\lib\runtime目录下的文件stack_protection.c提供了 __stack_chk_guard和 __stack_chk_fail函数的参考模板。

总结

由于今天全球半导体供应链紧张状况尚未得到缓解,因此许多MCU等嵌入式应用需要利用开发工具来保持核心技术和器件供应上的灵活性,并最大限度地在不同硬件平台上重用已完成的软件。在这种情况下,无论是MCU芯片开发商还是嵌入式系统工程师,都需要利用那些已被业界最广泛使用的开发工具,如IAR Embedded Workbench for Arm。由于这些工具也是其开发商和行业领先的MCU供应商多年合作的成果,可以针对不同的硬件资源体系和应用环境给出相应的帮助,如IAR Embedded Workbench中的堆栈保护功能,因此可以以更短的研发周期,来实现嵌入式开发人员的研发目标。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    147

    文章

    18613

    浏览量

    387178
  • 嵌入式开发
    +关注

    关注

    18

    文章

    1103

    浏览量

    49844
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    一个面向单片机、事件驱动的嵌入式开发平台介绍

    为核心,打造一个统一的嵌入式技术生态,为广大企业用户和嵌入式开发者们,提供搞可靠性的、高性能的、现代且高开发效率的嵌入式开发环境。 Eve
    发表于 12-05 06:26

    分享一个嵌入式开发学习路线

    法,这些语法在嵌入式开发至关重要。 2. 技能进阶期(2-3个月) 从51单片机过渡到主流的ARM Cortex-M系列(嵌入式就业核心平台),学会使用STM32单片机,掌握嵌入式开发
    发表于 12-04 11:01

    嵌入式开发工具版本的选择策略

    今天,我们就来结合嵌入式常见的几个软件(如Keil / IAR、VS Code 、Source Insight、VMware、Git等),简单讲一讲嵌入式开发工具软件版本选择策略。 开发团队软件
    发表于 11-25 06:11

    嵌入式开发的关键点介绍

    嵌入式开发现代科技扮演着非常重要的角色。随着物联网的发展,嵌入式系统的需求也越来越大。嵌入式开发不仅需要
    发表于 11-13 08:12

    嵌入式开发工具的现状和发展简史

    集成开发环境(IDE)正在经历深刻变革。传统意义上披着“图形界面”外衣的编译器,已不再能满足当今的需求。随着嵌入式系统变得越来越强大,而且AI开始融入几乎所有设计开发者需要的是能够
    的头像 发表于 11-11 09:49 722次阅读

    恩智浦如何攻克两大嵌入式开发难题

    在我们的身边,嵌入式系统无处不在。而随着技术的进步和应用的拓展,今天的嵌入式开发也面临着诸多新课题、新挑战。
    的头像 发表于 10-27 09:28 1186次阅读

    新一代嵌入式开发平台 AMD嵌入式软件和工具2025.1版现已推出

    AMD 2025.1 版嵌入式软件和工具是面向新一代嵌入式系统开发而打造的综合平台,全面加速概念构想到部署落地。 2025.1 版嵌入式软件
    的头像 发表于 08-20 09:15 3631次阅读

    嵌入式开发就业还有前景吗?

    嵌入式的发展前景如何呢?随着科技的飞速发展,嵌入式开发在各个领域的应用越来越广泛,因此嵌入式开发的就业前景也备受关注。以下将从智能家居、医疗设备、工业控制、汽车电子、航空航天等方面,探讨嵌入式
    发表于 07-16 10:47

    嵌入式开发入门指南:从零开始学习嵌入式

    随着物联网、智能硬件的发展,嵌入式开发成为热门技能之一。以下将为初学者提供一份详细的嵌入式开发入门指南,涵盖学习路径、必备工具、推荐资源等内容。 1. 嵌入式系统的定义与应用
    发表于 05-15 09:29

    嵌入式开发:高门槛的系统性工程与 996 的行业困局

    嵌入式开发的门槛,往往被培训机构和表象所掩盖。许多人误以为 “用 C 语言写个跑在 ARM 上的程序” 就是嵌入式,实则连皮毛都未触及。真正的嵌入式开发是硬件与软件深度融合的系统性工程,需跨越三重壁垒
    的头像 发表于 04-09 11:06 677次阅读
    <b class='flag-5'>嵌入式开发</b>:高门槛的系统性工程与 996 的行业困局

    如何成为嵌入式开发工程师?

    如何成为嵌入式开发工程师? 成为嵌入式开发工程师通常需要掌握一系列技能和知识,并且在实践不断积累经验。以下是一些基本步骤和建议: 1. 基础教育:- 获取电子工程、计算机科学或相关领域的学位
    发表于 02-19 10:39

    盘点工程师常用的嵌入式开发工具

    嵌入式开发涉及硬件与软件的紧密结合,开发工具的选择对效率和质量至关重要。以下是嵌入式开发中常用的工具分类及代表性工具,涵盖
    的头像 发表于 02-07 10:06 3744次阅读

    如何提高嵌入式代码质量?

    技术 现代嵌入式开发工具和测试技术可以极大地提升代码质量和开发效率: 1. 静态分析工具:如Coverity、Lint等,能够帮助发现潜在的代码缺陷和安全漏洞。 2. 单元测试和集
    发表于 01-15 10:48

    嵌入式工程师常用的开发工具有哪些?

    。 一、集成开发环境(IDE) IDE是嵌入式开发的核心工具之一。例如 Keil MDK,它支持多种微控制器架构,提供了强大的代码编辑、编译、调试功能。工程师可以在一个集成的环境
    发表于 12-20 15:29

    如何使用 RISC-V 进行嵌入式开发

    RISC-V是一种开源的指令集架构(ISA),它允许任何人设计、制造和销售基于RISC-V的处理器,这为嵌入式开发提供了极大的灵活性和创新空间。以下是使用RISC-V进行嵌入式开发的基本步骤: 一
    的头像 发表于 12-11 17:32 2752次阅读