此问题的灵感来自pthread API中的pthread_attr_setguardsize
和pthread_attr_getguardsize
方法。可以找到该方法的文档here。
在这些方法的文档中,我最接近找到实际上是什么后卫尺寸的解释是这样的:
guardsize属性控制创建的线程堆栈的保护区域的大小。 guardsize属性提供防止堆栈指针溢出的保护。如果创建了具有保护保护的线程堆栈,则实现在堆栈的溢出端分配额外的存储器作为堆栈指针的堆栈溢出的缓冲区。如果应用程序溢出到此缓冲区中,则会产生错误(可能是SIGSEGV信号传递给线程)。
我确信这对某人来说是完全合理的,但我仍然有点失落。
我知道保护是堆栈末尾的溢出缓冲区,旨在防止堆栈溢出。但是我有两个问题:
我确信有一些简短的,概念性的东西可以回答这两个问题,我希望有人能够提供这些问题。谢谢大家!
P.S。这也非常有趣,我终于可以使用" stack-overflow"来标记问题。
答案 0 :(得分:4)
接下来的问题是在线程堆栈之后发生的事情。
它可能是任何东西。它可能是另一个线程堆栈的顶部,也就是堆的一部分。一些内存映射文件等
如果没有保护内存,线程可能会将其堆栈溢出到该区域,如果该内存是可写的,那么没有任何东西阻止线程覆盖该内存而不会产生任何错误/陷阱/信号。< / p>
您可以分配更大的堆栈。但有多大足够大?如果你将它分配得太大,就意味着其他任何东西的可用内存都会减少(特别是在内存空间非常有限的32位系统上)
警卫区试图解决此问题。此区域将被标记为不可写,因此如果有人尝试写入该区域(即,线程溢出其堆栈),则会通知硬件内核,向该进程发送信号并(默认情况下)终止它。
杀死这个过程通常会比一个线程无声地破坏它不应该的内存而感到更好。