广告

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

2022-02-14 10:27:55 IAR Systems 阅读:
在开发以MCU为核心的嵌入式系统时,当软件程序向预设的数据结构(通常是一个固定长度的缓冲区)之外的程序调用堆栈的内存地址范围写入数据时,就会发生堆栈缓冲区溢出。这几乎必然会损坏附近的数据,甚至会改变返回函数。

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

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

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

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

U3Xednc

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

实际应用实现堆栈保护

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

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

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

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

总结

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

责编:Franklin
  • 微信扫一扫
    一键转发
  • 最前沿的电子设计资讯
    请关注“电子技术设计微信公众号”
  • 德国投资148亿美元吸引芯片制造商,三星和台积电曾拒绝 EDN电子技术设计引援路透社报道,德国经济部长罗伯特·哈贝克(Robert Habeck)表示,德国政府有望提供140亿(约148亿美元)的财政支持来吸引芯片制造商。
  • 全球首发天玑8000-MAX 5G处理器,OPPO K10性能表现如何? 昨日OPPO 发布了OPPO K10和OPPO K10 Pro两款手机新品,以及OPPO智能电视 K9x 65英寸和OPPO Enco Air2 Pro两款IoT新品。在手机性能上,OPPO K10系列首次采用双旗舰芯片,OPPO K10 全球首发MediaTek天玑8000-MAX 5G处理器,而OPPO K10 Pro则搭载旗舰级芯片骁龙888 5G处理器,两款芯片均配备UFS 3.1闪存+LPDDR5内存。
  • 同时利用PIC两种外设输出的电路 在PIC微控制器中,MSSP(主同步串行端口)模块是利用多路复用引脚来应对I2C和SPI两种外设。使用这两个外设中的任何一个通常都没有问题。但是,如果要同时使用这两种外设而不改变微控制器该怎么办呢?
  • 电子元器件短缺对全球航天产业的冲击 值此全球疫情大流行时期,当还有医疗电子等其他更立即的优先事项需要解决时,航天产业要求更多的芯片是否合适?
  • 详解华为的3D芯片堆叠封装技术 EDN电子技术设计曾报道了华为公开的一种芯片堆叠封装及终端设备专利,近日,有业内人士表示,华为的这种混合 3D 堆叠方式比其他公司传统的 2.5D 和 3D 封装技术更通用。
  • 25kW SiC直流快充设计指南(第五部分):控制算法、调制方 在本系列文章的第一至第四部分中,我们从硬件角度分享并广泛介绍了25kW电动汽车充电桩的开发。第五部分则将从另一个维度深入探讨充电桩设计,我们将针对此类系统的控制策略和算法实现进行探讨,并提供实用见解。
  • 新MIPS公司将推出两款RISC-V微处理器 据Banatao声称,MIPS公司目前已经签署了一份合同,为一家汽车技术公司提供一种新的处理器设计。
  • 英伟达称其144核心超级芯片比英特尔Ice Lake快2倍 Nvidia 在3月底的GTC上推出了其新的144核 Grace CPU Superchip,日前外媒在 Nvidia 加速计算业务部门副总裁 Ian Buck 的 GTC 演示中发现了 Grace 与 Intel Ice Lake 的基准。该基准声称,在 HPC 中常用的天气研究和预报 (WRF) 模型中,Grace 比英特尔当前的 Ice Lake 快 2 倍,能效高 2.3 倍。
  • 拆解:Tile Mate蓝牙追踪器依靠软件工作 本文要拆解的是一款Tile Mate蓝牙追踪器。Tile是一个与其他东西连接或有其他关联的追踪器,同时也是一种寻找物品的防丢小帮手。透过Tile,甚至可以找到之前遍寻不着的“其他东西”。如果Tile还想创造有形收入(和利润!),它需要实现两项重要目标:售卖大量的产品;将物料清单成本控制在最低水平。
  • 松下将在三年内向电动汽车电池和供应链软件领域投资60 日前,松下表示将在截至 2025 财年的未来三年内,在汽车电池和供应链软件等领域共投资 6000 亿日元(49 亿美元)。这家日本企业集团表示,总投资金额将被分割,其中 4000 亿日元将用于其认为的“增长领域”,例如汽车电池和供应链软件,其余 2000 亿日元将用于技术等领域。作为网络物理系统。
  • 搭载132人的东航客机在广西发生事故,为何出事的又是波 据EDN电子技术设计了解,3月21日,一架东航波音737客机在广西梧州市藤县掉落,并引发山火。据广西梧州市应急管理局工作人员确认,飞机相关事故发生,目前正在准备组织救援,伤亡情况未明,不便透露更多情况,后续将开新闻发布会。事发突然,但此次空难已经不是波音737第一次坠毁了。
  • 大联大世平集团推出基于Artery产品的USB耳机方案 大联大控股宣布,其旗下世平推出基于雅特力(Artery)AT32F403A MCU的USB耳机方案。
广告
热门推荐
广告
广告
EE直播间
在线研讨会
广告
广告
面包芯语
广告
向右滑动:上一篇 向左滑动:下一篇 我知道了