【问题标题】:How does the operating system detect a stack overflow?操作系统如何检测堆栈溢出?
【发布时间】:2011-06-22 13:47:46
【问题描述】:

在许多操作系统上,堆栈和堆从进程的虚拟地址空间的相对两侧开始,并相互向对方增长。这允许堆栈在不撞到堆的情况下尽可能地扩展。

假设我有一个导致堆栈溢出的程序。我目前的理解是,这将导致堆栈不受控制地向堆增长并最终击中它。它是否正确?如果是,操作系统如何检测到发生堆栈溢出?似乎操作系统无法检测到程序正在尝试使用为堆分配的虚拟内存作为堆栈的一部分,因为它们位于连续的内存区域中。

我知道这是特定于操作系统的,但是了解任何操作系统中发生这种情况的机制肯定会有所帮助。这一直困扰着我一段时间,我似乎找不到任何好的解释。

【问题讨论】:

    标签: language-agnostic operating-system stack-overflow


    【解决方案1】:

    这只是直觉,但确保堆栈不会干扰堆听起来像是 JVM 的工作。我看不出为什么我不能自己制作糟糕的编程语言,让堆栈开始覆盖堆(在崩溃之前)。

    【讨论】:

    • @WuHoUnited- 在 JVM 的情况下是这样,但 JVM 是一个模拟堆栈和堆的软件,因此在管理它时有更多的主动控制。特别是,它可以设置堆栈深度限制。我更好奇使用 C 或 C++ 等语言中的本机代码会发生什么,其中操作系统不负责设置每个堆栈帧。
    【解决方案2】:

    操作系统为堆栈分配一些空间。当进程访问堆栈的未分配部分时,处理器会引发页面错误并由操作系统捕获。如果操作系统认为增加堆栈仍然是合理的,它只需为其分配新空间并将控制权返回给进程。如果不合理,则会引发堆栈溢出异常。

    【讨论】:

    • @CAFxX- 这似乎是合理的,但作为后续,假设我有一个带有非常大的堆栈帧的程序(例如,大于一页虚拟内存)。那么我的程序是否可以为其堆栈分配大量页面,然后在堆栈之后“跳过”内存并进入堆内存?
    • 操作系统对此进行了检查。当我说如果它不合理会引发堆栈溢出时,我的意思是如果堆栈增长太多(例如,太多以至于你实际上到达堆 - 即使通常限制更严格和平台 -依赖)操作系统会通过引发堆栈溢出来阻止你这样做——这通常会终止进程,这样就不会发生坏事(TM)。
    • 我突然想到,也许您在询问另一种类型的堆栈溢出,即导致堆栈损坏的堆栈溢出。这是不同的,通常由进程运行时通过在堆栈中放置“哨兵”来检查。如果哨兵被覆盖,则意味着堆栈已损坏并引发堆栈溢出/损坏异常(但同样,通常是由进程运行时引起的,而不是由操作系统引起的)。
    • @CAFxX- 我指的是操作系统级别的“你的堆栈已经变得太大,因此你的进程是烤面包”风格溢出在这个问题中,但感谢您提出有关堆栈损坏的观点.
    【解决方案3】:

    堆栈溢出在堆栈中倒退 - 它们通过覆盖堆栈中已初始化部分中的数据来工作,这正是因为堆栈向下增长而可能发生的。

    因此,操作系统无法检测到这种情况,因为进程可以随时修改其堆栈的已初始化部分。

    扩展堆栈由使用堆栈空间的进程进行,并且操作系统陷入页面错误处理程序,因为没有设置页面。一些操作系统只允许在“保护页”上进行这些访问,即紧接在当前堆栈之前的页面将触发重新分配,而其他操作系统则在故障发生时查看堆栈指针寄存器的内容,看看这是否应该是一个堆栈访问。

    【讨论】:

      【解决方案4】:

      大多数现代处理器都有 MMU(内存管理单元),它是向每个程序应用虚拟地址的“硬件”设备,每个程序都存在于自己的内存空间中。操作系统处理这个 MMU,当程序想要从专用内存中读取或写入地址时,MMU 会引发中断。

      http://en.wikipedia.org/wiki/Memory_management_unit

      通过这种方式,它可能会检测到 SO。 堆栈和堆不在连续的内存地址上。

      我还看到了使用保护词的不同方法。每个进程的堆栈都分配在堆上并填充了 whit 守卫(类似于 0xc0cac01a)。这种方式很容易通过计算保护词来获得每个进程的堆栈大小。如果没有至少一个保护词,操作系统会引发恐慌。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-11
        • 2011-10-26
        • 2014-05-27
        • 2010-10-19
        • 2020-09-26
        • 1970-01-01
        • 1970-01-01
        • 2014-03-16
        相关资源
        最近更新 更多