所以我最近开始接触一些汇编,我是一个初学者,所以我想知道是否有人可以澄清一些事情。我认为每个进程都有自己的一组寄存器,并且每个线程都可以修改这些寄存器,对吧?那么多个线程如何使用相同的寄存器而不引起冲突呢?或者每个线程都有自己的一组寄存器?
最佳答案
线程上下文切换涉及保存当前执行上下文的寄存器,以及从开始切换到的执行上下文加载具有保存值的寄存器。 (除其他事项外)。因此每个线程实际上都有自己的一组寄存器。还有它自己的堆栈,因为 ESP 是寄存器之一。
考虑这个问题的一种方法是,通过保存当前寄存器状态并用新状态加载寄存器来获取线程。如果这种情况没有发生,那么它不是线程切换。如果您还切换到一组不同的虚拟地址表,那么您拥有的是进程切换而不是线程切换。
你说:
I take it every process has it's own set of registers, and each thread can modify these registers right?
但这不太正确。每个 CPU 核心都有一组寄存器。每当操作系统切换到不同的线程时,这些寄存器都会更改。但在任何时刻,CPU 核心中都只有一个线程在执行。进程实际上并没有自己的寄存器,进程拥有自己的线程(或至少一个线程),并且线程有寄存器,或者更确切地说,在线程等待 CPU 核心可用时保存寄存器值的地方继续运行。
关于汇编寄存器初学者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2406128/