操作系统调用的每个例程都会创建自己的“堆栈”吗?

时间:2011-02-05 14:39:06

标签: operating-system stack cpu-usage

对不起,简单的问题,但在谈到操作系统理论时,这总是让我感到困惑。

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

在这种情况下,CPU中的堆栈指针怎么样?在这两种情况下,它的功能如何?

对于我的描述含糊不清的道歉,整个想法只是为我提供了相互矛盾的想法!

1 个答案:

答案 0 :(得分:2)

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

x86 / x64上的Windows有一个内存,可以为每个线程准备好系统堆栈。它可以在该线程中进行系统调用时重复使用。

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

我还可以提供更多信息,只要询问您是否希望了解更具体的信息。

堆栈指针:

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