Multithreading 为什么在x86程序集中进行线程切换时会将%ebx%esi%edi%ebp这些寄存器推入堆栈

Multithreading 为什么在x86程序集中进行线程切换时会将%ebx%esi%edi%ebp这些寄存器推入堆栈,multithreading,assembly,x86,mips,Multithreading,Assembly,X86,Mips,原因是什么?我在MIPS上下文切换中也看到了一些特殊的寄存器被存储到堆栈中,并从堆栈中恢复。实际上,我想弄清楚在x86汇编中,当线程将当前线程切换到新线程时,堆栈框架是如何工作的。我读过和其他一些文章。但我仍然无法理解UNIX标准中发生了什么ABIs()以及作为其一部分的C编程二进制接口实现,请参阅特定于处理器的“补充”部分 对于32位x86,这是一个文档,它(在许多其他内容中)指定了在进行函数调用时如何使用寄存器,特别是调用方拥有的寄存器和被调用方拥有的寄存器之间的分离(即,如果函数选择使用它

原因是什么?我在MIPS上下文切换中也看到了一些特殊的寄存器被存储到堆栈中,并从堆栈中恢复。实际上,我想弄清楚在x86汇编中,当线程将当前线程切换到新线程时,堆栈框架是如何工作的。我读过和其他一些文章。但我仍然无法理解UNIX标准中发生了什么ABIs()以及作为其一部分的C编程二进制接口实现,请参阅特定于处理器的“补充”部分

对于32位x86,这是一个文档,它(在许多其他内容中)指定了在进行函数调用时如何使用寄存器,特别是调用方拥有的寄存器和被调用方拥有的寄存器之间的分离(即,如果函数选择使用它们,哪些寄存器必须保存/恢复,哪些是临时的)


这种处理器补充文件适用于使用UN*X风格接口/ELF二进制文件的所有体系结构;为32位x86以外的CPU提供了许多指向“处理器补充”的指针。

堆栈帧和线程切换是不相关的。每个线程都有自己的堆栈,每个堆栈都有自己的堆栈帧集。线程切换过程如下所示:-

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实际上是什么,等等

需要记住的真正重要的一点是,当线程切换发生时,所有内容都会被推送到堆栈中。

有一些指针,说明在历史上下文中“为什么”事情是这样做的。请注意,“堆栈框架”对于Microsoft工具集是可选的。有一个编译器选项可以禁用堆栈帧指针,这允许ebp用于一般用途(它仍然需要被调用方保存)。