检测堆栈溢出

操作系统如何检测用户空间程序的堆栈溢出[然后向这些用户空间程序发送SIGTERM或SIGSEGV]?

Solutions Collecting From Web of "检测堆栈溢出"

答案将取决于目标架构和特定的操作系统。 由于这个问题是以Linux为标签的,所以你更偏向于表面上看起来更普遍的问题。

在诸如Linux或QNX Neutrino之类的复杂OS或RTOS中,如果支持MMU保护,则可以使用内存保护机制,例如已经提到的保护页。 这样的操作系统当然需要有MMU的目标。

较简单的操作系统和没有MMU支持的典型RTOS调度内核可能会使用许多方法。 最简单的方法是在堆栈顶部放置一个警戒签名,当调度程序运行时检查修改。 这是有点碰运气,它要求堆栈溢出实际上修改签名,并且在调度程序下一次运行之前,导致的损坏不会导致崩溃。 某些带有片上调试资源的系统可能会在签名字上放置一个访问断点,并在被命中时导致异常。

在开发中,一种常见的技术是首先用签名填充每个线程堆栈,然后让线程定期检查“高潮”,并在超过一定的百分比级别时发出警告。

守卫页面。 当操作系统为程序创建堆栈时,它将分配比指定的多一点点。 内存以页面分配(通常每个4KB),额外的页面将设置为任何访问它的尝试都将导致抛出异常。

除了在另一个回答中提到的防护页面,一些较小(无MMU)的嵌入式微控制器对堆栈溢出(和下溢)也有特定的例外。