Memory Posix中的保护大小是多少?

Memory Posix中的保护大小是多少?,memory,stack,posix,stack-overflow,Memory,Stack,Posix,Stack Overflow,这个问题的灵感来自pthread API中的pthread\u attr\u setguardsize和pthread\u attr\u getguardsize方法。可以找到该方法的文档 在这些方法的文档中,我最接近于找到保护大小的解释是: guardsize属性控制所创建线程堆栈的保护区域的大小。guardsize属性提供防止堆栈指针溢出的保护。如果线程的堆栈是使用保护创建的,那么实现会在堆栈的溢出端分配额外的内存作为缓冲区,以防止堆栈指针的堆栈溢出。如果应用程序溢出到此缓冲区,则会导致错误

这个问题的灵感来自pthread API中的
pthread\u attr\u setguardsize
pthread\u attr\u getguardsize
方法。可以找到该方法的文档

在这些方法的文档中,我最接近于找到保护大小的解释是:

guardsize属性控制所创建线程堆栈的保护区域的大小。guardsize属性提供防止堆栈指针溢出的保护。如果线程的堆栈是使用保护创建的,那么实现会在堆栈的溢出端分配额外的内存作为缓冲区,以防止堆栈指针的堆栈溢出。如果应用程序溢出到此缓冲区,则会导致错误(可能会向线程发送SIGSEGV信号)

我相信这对某些人来说很有意义,但我还是有点迷茫

据我所知,防护是堆栈末尾的溢出缓冲区,旨在防止堆栈溢出。然而,我还有两个问题:

  • 为什么拥有一个特殊的溢出缓冲区比简单地使用一个更大的堆栈更可取
  • 如果溢出保护仍然向线程发送错误,那么拥有溢出缓冲区还有什么意义
  • 我相信有一些简短的概念性的东西可以回答这两个问题,我希望这里有人能够提供它。谢谢大家


    p.S.我终于可以用“堆栈溢出”来标记一个问题,这也非常有趣。

    下一个问题是线程堆栈之后会出现什么

    它可能是任何东西。它可能是另一个线程堆栈的顶部,也可能是堆的一部分。一些内存映射文件等

    如果没有保护内存,线程可能会将其堆栈溢出到该区域,并且如果该内存是可写的,那么在不生成任何错误/陷阱/信号的情况下,不会阻止线程覆盖该内存

    您可以分配一个更大的堆栈。但是有多大才足够大呢?如果分配的内存太大,则意味着其他任何东西的可用内存都会减少(特别是在内存空间非常有限的32位系统上)

    一个警卫区试图解决这个问题。该区域将被标记为不可写,因此,如果有人试图写入该区域(即线程溢出其堆栈),内核将在硬件协助下收到通知,并向进程发送信号(默认情况下)终止该区域


    通常情况下,终止进程比让线程默默地破坏内存要好。

    这对我来说非常有意义,谢谢。但是,如果您不介意一个小问题来澄清,您是说如果堆栈后的内存是可写的,并且没有保护,那么堆栈溢出甚至可能检测不到?或者你是说在发送错误信号之前,堆栈后的内存可能已损坏?没错,它可能无法检测到-为什么?线程只是向寄存器(堆栈指针)添加一个偏移量,然后访问该内存。如果这恰好扩展到同一进程中的有效内存中,而不是当前线程堆栈中,那么就不会注意到这一点。或者更确切地说,如果您想注意到这一点,那么每次扩展堆栈指针时都必须进行额外的检查。有些编译器可以被告知生成这样做的代码——尽管这样做会降低性能,除非您调用的所有库也执行相同的检查,否则可能不会有效。