有许多技术可用于检测堆栈溢出。有些使用硬件,而有些则完全在软件中执行。正如我们很快将看到的那样,在硬件中具有这种能力到目前为止是更可取的,因为堆栈溢出可以在发生时立即检测到,事实上,可以避免,因为硬件实际上可以防止对无效访问的写入。
硬件堆栈溢出检测机制通常触发异常处理程序。异常处理程序通常将当前PC(程序计数器)和可能的其他CPU寄存器保存到当前任务的堆栈上。
当然,由于异常发生在我们试图访问堆栈之外的数据时,处理程序将覆盖应用程序中的一些变量或另一个堆栈;假设溢出堆栈的基础之外有RAM。
在大多数情况下,应用程序开发人员需要决定如何处理堆栈溢出情况。异常处理程序应该将嵌入式系统置于已知的安全状态并重置CPU还是什么都不做?
如果您决定重置CPU,您可能会找到一种方法来存储发生溢出的事实以及导致溢出的任务,以便您可以在重置时通知用户。
技术1:使用堆栈限制寄存器
一些处理器(不幸的是很少)具有简单但高效的堆栈指针溢出检测寄存器。此功能可在基于ARMv8-MCPU架构的处理器上使用。当CPU的堆栈指针低于(或高于取决于堆栈增长)此寄存器中设置的值(我们称之为SP_Limit寄存器)时,会生成异常。图3中的图形显示了这是如何工作的。