【发布时间】:2016-06-26 18:15:00
【问题描述】:
我正在阅读一些关于处理器内存操作的基本文章,我对处理器如何处理接下来的内容感到困惑。
调用堆栈的概念很清楚,但我想知道表达式堆栈/寄存器堆栈(用于进行计算)是否是同一个堆栈,或者即使是子程序的局部变量的堆栈(一个函数) 在一个程序中是同一个调用栈。
如果有人可以向我解释处理器是如何处理其堆栈的,那将对我有很大帮助。
【问题讨论】:
-
这不是由编译器做出的更多决定(取决于操作系统和库的调用约定)吗? CPU 对任何内存安排都很好,它只是运行指令。我想你可以在不使用任何堆栈的情况下编写代码。
-
@Thilo:如果 CPU 不能轻松高效地执行此操作,那么设计一个使用单独堆栈进行暂存空间和参数传递的 ABI 将是愚蠢的。例如,在 x86 中,它会占用另一个寄存器(在 32 位模式下仅保留 8 个寄存器中的 6 个作为“通用”),而小型高效的
push/pop指令仅适用于rsp。因此,将寄存器保存/恢复到“手动”堆栈将需要更多代码字节(以及更多指令,因为您必须手动子/添加到rbp(第二个堆栈指针的明显选择)。 -
@PeterCordes:这可能是 Rafael 正在寻找的答案:一个 CPU 应该有多组堆栈操作/寄存器来有效地支持多个堆栈(而 x86 没有)。
-
@PeterCordes 所以对于不同的线程,处理器使用相同的堆栈但不同的指针?
-
超线程(SMT:同一物理内核上的多个逻辑 CPU)提供了两个完全独立的上下文以及它们自己的架构状态。内核上线程之间的 OS 任务切换完全用另一个线程替换了一个线程的体系结构状态。不同的线程总是有自己的栈。 (它们都可以从进程地址空间中的同一大块虚拟内存中分割出来,但是如果一个线程将其数据写入另一个线程用来保存/恢复某些内容的堆栈空间,那么您的程序将无法运行。)
标签: cpu-registers cpu-architecture processor stack-memory stack-machine