检测堆栈溢出

7
操作系统如何检测用户空间程序的堆栈溢出(并向这些用户空间程序发送SIGTERM或SIGSEGV信号)?
3个回答

11

守护页。当操作系统为程序创建堆栈时,会分配比指定的内存稍微多一点。内存以页面(通常每个页面4KB)的方式分配,并且额外的页面设置使得任何试图访问它的尝试都将导致引发异常。


7
答案取决于目标架构和特定的操作系统。由于问题被标记为Linux,因此您已经偏向了这个问题,但它似乎更为一般。在像Linux或QNX Neutrino这样的复杂操作系统或实时操作系统中,具有MMU保护支持,可能会使用诸如已提到的守卫页面之类的内存保护机制。当然,这些操作系统需要具有MMU的目标。没有MMU支持的简单操作系统和典型的RTOS调度内核可以使用多种方法。最简单的方法是在堆栈顶部放置一个守卫签名,在调度程序运行时检查是否修改了该签名。这是一种不太可靠的方法,需要堆栈溢出实际上修改签名,并且导致的破坏不会在调度程序下一次运行之前导致崩溃。一些具有芯片级调试资源的系统可能能够在签名字上放置访问断点,并在命中时引发异常。在开发过程中,常见的技术是最初用签名填充每个线程堆栈,并定期检查“高潮”,如果超过某个百分比水平则发出警告。

5

除了另一个答案提到的守卫页面之外,一些较小的(没有MMU的)嵌入式微控制器还有针对堆栈溢出(和下溢)的特定异常处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接