【问题标题】:Does every routine called by the OS create it's own 'stack'?操作系统调用的每个例程是否都创建了自己的“堆栈”?
【发布时间】:2011-02-05 14:39:06
【问题描述】:

抱歉,这个问题很简单,但在谈到操作系统理论时,我总是感到困惑。

我的书声称通过使用“堆栈”可以实现重入 - 这是否意味着存在一个“堆栈”并且它以某种方式在所有例程之间共享,或者“堆栈”是否指的是抽象概念堆栈,每次调用某个子程序时都会创建一个堆栈并将其存储在主内存中? (假设需要)。

在这种情况下,CPU 中的堆栈指针呢?在这两种情况下,它是如何发挥作用的?

抱歉我的描述含糊不清,整个想法对我来说只是笼罩在相互矛盾的想法中!

【问题讨论】:

    标签: operating-system stack cpu-usage


    【解决方案1】:

    这是特定于平台的(取决于使用的硬件和软件)。

    x86/x64 上的 Windows 为每个线程准备好系统堆栈内存。每当您在该线程中执行系统调用时,它都会被重用。

    当多个独立的进程或线程可以一次调用系统例程时,系统是可重入的。在这种情况下,每个线程都使用自己的系统堆栈。系统堆栈(技术上的环 0 堆栈)独立于用户模式(环 3)堆栈。

    我还可以提供更多信息,请问您是否想了解更具体的信息。

    堆栈指针:

    • 在正常执行期间,每个线程都有自己的正常堆栈和自己的堆栈指针。它会在每次通话等时向下移动。
    • 当一个特定线程调用操作系统例程时,会存储当前堆栈指针值,并将堆栈指针设置为始终相同的地址 - 系统(环 0)堆栈。
    • 每个线程都有自己的系统(环 0)堆栈。
    • 当系统调用结束时,堆栈指针的原始值被恢复。所以这里我们实际上放弃了系统堆栈,回到正常堆栈。
    • “正常”堆栈的大小在编译器/链接器中设置。它可以增长到兆字节。但是系统堆栈具有有限的静态大小,您永远无法更改其位置或大小。它创建得非常大,因此任何系统调用都可以放在那里。
    • 如果一个系统例程在内部调用另一个系统例程,这会被硬件检测到并直接调用,即在这种情况下,不会对堆栈指针进行特殊排列。

    【讨论】:

    • 所以它会分别遍历每个线程,并且在线程处于临界区时使用堆栈,并且在进程通过其临界区后堆栈应该是空的,允许它被重用通过下一个线程/进程? :)
    • 没有。出于安全原因,每个线程都有自己的系统堆栈(或一组 3 个系统堆栈)。
    • 好的,我在答案中添加了有关堆栈指针的更多信息。所有信息仍然主要与 x86/x64 和 Windows 有关。 (这都是特定于实现的。)
    猜你喜欢
    • 2017-01-21
    • 2013-08-23
    • 2021-01-09
    • 2013-04-24
    • 2014-05-27
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多