"the Stack" 如何影响线程的执行?

How does "the Stack" play into the execution of a thread?

我正在开发 Pintos。

这有点像学习构建操作系统的教育工具,并且正在进行第二个项目,该项目旨在围绕构建对用户程序的支持。

因此,首要任务是 设置 The Stack! 很好。

问题是 - 自 class 开始以来,我一直对这些词不寒而栗 The Stack - 因为我永远无法完全理解 [= =21=]Stack 是什么以及它如何影响程序或线程的执行。所以我理解它是在 RAM 中设置的内存区域,但仅此而已。

我的问题如下:

堆栈就是内存。唯一使内存成为堆栈的是进程访问它后进先出。

What is the function of the stack?

栈在计算机中的作用是支持函数调用。函数调用反映堆栈的操作。调用一个函数来推动它。退出函数弹出。

How does "The Stack" play into the execution of a thread in the CPU, with respect to the Program Counter, Registers, and Stack Pointer?

从CPU的角度来看,线程就是一个进程。操作系统通过让多个进程共享同一地址 space 来欺骗 CPU。这样进程就变成了线程。

程序计数器和堆栈指针是寄存器。在大多数处理器上都有操作堆栈指针寄存器的指令。例如,函数调用指令将通过递减堆栈指针并将程序计数器存储在堆栈指针引用的新位置来将程序计数器压入堆栈。

How are things added to the stack and how are they removed from it?

Stack memory is allocated by decrementing the stack pointer. Something like:

   SUB   #32, SP

将在堆栈上分配 32 个字节,

  ADD  #32, SP

将释放该内存。栈的优点是分配内存很快

另外,如前所述,有些指令很可能会操作堆栈。

Furthermore, even if you don't know about Pintos, what does it mean to "set up the stack" when building support for user programs in an operating system?

要设置堆栈,您必须:

  1. 为堆栈分配内存。
  2. 您可能还想分配在堆栈两侧受保护的保护内存,以检测上溢和下溢。
  3. 你将栈顶的地址赋值到状态指针寄存器中。

正如我之前所说,堆栈就是内存。程序可以轻松分配自己的内存并将其地址移动到堆栈指针中以创建新堆栈。