操作系统调用的每个例程是否创建它自己的“堆栈”?

问题描述:

对不起,简单的问题,但是在谈论操作系统理论时,总是让我困惑。操作系统调用的每个例程是否创建它自己的“堆栈”?

我的书声称通过使用“堆栈”使得重入成为可能 - 这是否意味着有一个“堆栈”,它在某种程度上在所有例程之间共享,或者“堆栈”是指抽象每次调用某个子例程时,都会创建一个堆栈并存储在主内存中? (假设它是需要的)。

在这种情况下,堆栈指针在CPU中呢?在这两种情况下,这个功能如何?

对于我描述模糊的道歉,整个想法只是笼罩在冲突的想法对我来说!

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

x86/x64上的Windows为每个线程准备好系统堆栈的内存。只要你在该线程中进行系统调用,它就会被重用。

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

我也可以提供更多的信息,只是询问你是否想知道更具体的东西。

堆栈指针:

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

因此,它会分别经过每个线程,并且在线程处于关键部分时使用堆栈,并且在该进程经过其临界区域后堆栈应该为空,从而允许其在下一个线程/进程? :) – user476033 2011-02-05 14:47:32