广告

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

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

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

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

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

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

3nlednc

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

实际应用实现堆栈保护

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

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

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

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

总结

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

责编:Franklin
  • 微信扫一扫
    一键转发
  • 最前沿的电子设计资讯
    请关注“电子技术设计微信公众号”
  • 可解决工业自动化和IIoT挑战的MCU 工业自动化和工业物联网(IIoT)设计人员的性能要求不断变化。就MCU而言,他们希望获得更快的处理速度、更多的内存、更好的连接性和更多的安全功能。
  • 第三代半导体——碳化硅材料之制程与分析 SiC功率电子是加速电动车时代到来的主要动能。以SiC MOSFET取代目前的Si IGBT,不仅能使电力移转时的能源损耗降低80%以上,同时也可让芯片模块尺寸微缩至原本的1/10,达到延长电动车续航里程及缩短充电时间的功效。
  • 苹果iPhone 14 Pro、iPhone 14 Pro Max 将采用更快的 随着iPhone 14系列发布的临近,iPhone 14系列的内存供应商也被曝光。一份由DigiTimes发表的报道显示,今年晚些时候到达的"Pro"型号将配备6GB LPDDR5内存,这比当前一代的iPhone 13 Pro和iPhone 13 Pro Max都有6GB LPDDR4X内存提升了一代。
  • 国际象棋机器人Chessrobot夹断对手手指,意外还是设计缺 据悉,在7月19日的莫斯科国际象棋公开赛期间,一位7岁小男孩疑似因提前走子犯规手,意外被“对手”国际象棋机器人Chessrobot夹住手指,造成指骨骨折,该事件登上了热搜榜。该男孩是莫斯科9岁以下最强的30位棋手之一。
  • M2 Pro 和 M2 Max 或是苹果首款采用台积电3nm 工艺的 M1 Pro 和 M1 Max 最多可配置 10 核 CPU 和 32 核 GPU。借助 M2 Pro 和 M2 Max,Apple 有望突破这一门槛,为这两个领域带来更多的核心数量。目前M2 Pro相关的爆料很少,但据称M2 Max 有12 核 GPU 和 38 核 GPU。12 核 CPU 将包括 10 个性能核心和两个能效核心。
  • 中信拆了辆特斯拉Model 3,发现多个领域技术引领行业 EDN电子技术设计在6月底报道了海通国际手动拆解十万元的比亚迪“元”的详细拆解图,如今不到一个月的时间,中信证券微信公众号发表了一篇《从拆解Model 3看智能电动汽车发展趋势》的文章,文中称对特斯拉Model 3的E/E架构、三电、热管理、车身等进行了详细深入地分析,并坚定看好中国智能电动化发展趋势,引起了广泛关注。
  • 小米12S Ultra游戏性能超越iPhone 13 Pro Max?高通骁龙 高通将骁龙8 Plus Gen 1的量产交给台积电之后,其生产技术带来了许多改进,其中之一是提高了游戏性能。众所周知,Apple 的 A15 Bionic 是目前公认的最快的移动 SoC,但这一认知却被小米 12S Ultra 搭配高通骁龙8 Plus Gen 1所颠覆。
  • 为什么步进电机的微步没有想象的那么好? 在使用步进电机设计运动控制系统时,不能假设电机的额定保持转矩在微步时仍然适用,因为增量转矩会大大降低。这可能会导致意外的定位误差。在某些情况下,增加微步分辨率并不能提高系统精度。
  • AIoT生态发展大会智慧两轮车分论坛圆桌讨论:智慧两轮车 在AspenCore举办的“2022国际AIoT生态发展大会”上,“智慧两轮车分论坛”的圆桌讨论环节邀请到全志科技、威灵电机、发掘科技、台铃科技和灵动微电子五家两轮车市场的芯片商、方案商、系统商和整车厂,围绕“智慧两轮车市场如何弯道超车?”的主题展开了讨论。
  • 电动两轮车需要什么样的MCU方案? 电机控制器作为智慧电动两轮车的“控制中心”,操控着车辆的加速、定速巡航、能量回收。在6月29日全球领先的专业电子机构媒体AspenCore和深圳市新一代信息通信产业集群联合主办的“2022国际AIoT生态发展大会-智慧两轮车分论坛”上,专注于MCU研发和生产的灵动微电子,分享了智慧两轮车需要什么样的电机驱动芯片。
  • 面向未来物联网的高密度、高可靠、高安全性的计算平台 在AspenCore举办的“全球MCU生态发展大会”上,安谋科技解决方案总监邹伟发表了“面向未来物联网的高密度、高可靠、高安全性的计算平台”主题演讲。
  • 世界上尺寸最大的芯片Wafer Scale Engine-2打破了在单 Cerebras公司售价数百万美元的“全球最大AI芯片”Wafer Scale Engine-2又有新消息,在基于单个Wafer Scale Engine-2芯片的CS-2系统上训练了世界上最大的拥有200亿参数的NLP(自然语言处理)人工智能模型。
广告
热门推荐
广告
广告
EE直播间
在线研讨会
广告
广告
面包芯语
广告
向右滑动:上一篇 向左滑动:下一篇 我知道了