tem*_*def 6 language-agnostic stack-overflow operating-system
在许多操作系统上,堆栈和堆从进程虚拟地址空间的相对两侧开始,并向彼此增长。这使得堆栈能够在不触及堆的情况下尽可能地扩展。
假设我有一个程序导致堆栈溢出。我目前的理解是,这将导致堆栈不受控制地向堆增长并最终到达堆。它是否正确?如果是,操作系统如何检测堆栈溢出的发生?操作系统似乎无法检测到程序正在尝试使用为堆分配的虚拟内存作为堆栈的一部分,因为它们位于连续的内存区域中。
我知道这是特定于操作系统的,但是了解在任何操作系统中发生这种情况的机制肯定会有所帮助。这已经困扰我一段时间了,我似乎找不到任何好的解释。
操作系统向堆栈分配一些空间。当进程访问堆栈的未分配部分时,处理器会引发页面错误并被操作系统捕获。如果操作系统认为增加堆栈仍然合理,它只需为其分配新空间并将控制权返回给进程。如果不合理,则会引发堆栈溢出异常。