Armv8-M架构中的堆栈限制检查与异常处理
1. 堆栈限制检查概述
堆栈溢出是一种常见的软件错误,指的是应用程序或多任务系统中的应用任务消耗的堆栈空间超过了其分配的空间。这种情况可能会破坏其他数据,导致应用程序失败(如得到错误结果或崩溃),还可能对物联网应用的安全产生负面影响。
在Armv8 - M架构之前,软件可以使用内存保护单元(MPU)来定义堆栈的内存空间分配,以检测堆栈溢出。一些实时操作系统(RTOS)产品支持在上下文切换期间通过软件步骤检测应用线程中的堆栈溢出。而在Armv8 - M架构中,增加了专门的堆栈限制检查功能。通过堆栈限制寄存器,特权软件能够定义分配给主堆栈和进程堆栈的最大堆栈大小。
堆栈限制寄存器的最低3位固定为0,这意味着堆栈限制始终是双字对齐的。如果堆栈指针的值低于堆栈限制,并且在使用该堆栈指针时发生与堆栈相关的操作,将检测到堆栈操作违规,并触发以下故障异常:
- 对于Armv8 - M基线架构,将触发HardFault异常(即安全HardFault,因为堆栈限制检查功能仅在安全状态下可用)。
- 对于Armv8 - M主线架构,将触发UsageFault异常,并将UsageFault状态寄存器中的STKOF故障状态位设置为1以反映此故障情况。UsageFault异常可以是安全的或非安全的,具体取决于堆栈溢出违规是与安全堆栈还是非安全堆栈相关。如果UsageFault未启用,或者其优先级不足以触发,则故障事件将升级为HardFault。
堆栈溢出故障异常是同步的,这意味着一旦检测到故障,处理器将无法在当前上下文中执行任何进一步的指令。只有当同时到达一个更高优先级的中断(如NMI)时,处理器才会继续执行;此时,故障
超级会员免费看
订阅专栏 解锁全文
344

被折叠的 条评论
为什么被折叠?



