操作系统如何检测用户空间程序的堆栈溢出[然后将SIGTERM或SIGSEGV发送到这些用户空间程序]?
答案 0 :(得分:10)
警卫页面。当OS为程序创建堆栈时,它将分配比指定的更多一点。内存以页面形式分配(通常每个4KB),额外页面将具有设置,以便任何访问它的尝试都将导致抛出异常。
答案 1 :(得分:8)
答案取决于目标架构和特定操作系统。由于这个问题被标记为Linux,所以你对这个问题的偏见似乎更为笼统。
在具有MMU保护支持的复杂操作系统或RTOS(如Linux或QNX Neutrino)中,可以使用内存保护机制,例如已经提到的保护页面。此类操作系统当然需要具有MMU的目标。
更简单的操作系统和没有MMU支持的典型RTOS调度内核可能会使用多种方法。最简单的方法是在栈顶部放置一个保护签名,在调度程序运行时检查该签名是否有修改。这有点昙花一现,它要求堆栈溢出实际上修改了签名,并且在下次运行调度程序之前导致的损坏不会导致崩溃。一些具有片上调试资源的系统可能能够在签名字上放置一个访问断点,并在签名时引发异常。
在开发过程中,一种常见的技术是首先使用签名填充每个线程堆栈,并让线程定期检查“高潮”并在超过某个百分比级别时发出警告。
答案 2 :(得分:5)
除了另一个答案中提到的保护页面,一些较小的(MMU-less)嵌入式微控制器具有堆栈溢出(和下溢)的特定异常。