这是什么原因?我已经看到在MIPS上下文切换中也有一些特殊的寄存器存储到堆栈中并从堆栈中恢复。实际上我想弄清楚当线程切换当前线程到x86程序集中的新线程时堆栈帧是如何工作的。我读过{{ 3}}和其他一些文章。我不明白发生了什么
答案 0 :(得分:1)
UNIX标准ABI(Application Binary Interface)以及作为其一部分的C编程二进制接口实现,指的是特定于处理器的"补充"部分。
对于32位x86,这是Intel386 Architecture Processor Supplement文档,并且(在许多其他事项中)指定了在进行函数调用时如何使用寄存器 - 特别是调用者拥有的和被调用者拥有的寄存器(如果某个函数选择使用它们,哪些是必须保存/恢复的,哪些是临时的。)
这样的处理器补充文档适用于使用UN * X样式接口/ ELF二进制文件的所有体系结构; Wikipedia page on ELF提供了许多关于"处理器补充的指示"对于32位x86以外的CPU。
答案 1 :(得分:0)
堆栈帧和线程切换是无关的。每个线程都有自己的堆栈,每个堆栈都有自己的堆栈帧。线程切换过程遵循以下方式: -
thread 1 interrupted
cpu state is saved to thread 1 stack (cpu, fpu, sse, etc)
stack pointer is changed to point to thread 2's stack
cpu state is restored
return from interrupt (getting return address from thread 2's stack!)
这只是一个基本的大纲,实际的实现将会有更多,例如,确定实际上是什么线程2等等。
要记住的重要一点是,当线程切换发生时,绝对会将所有内容都推送到堆栈。