汇编寄存器初学者

时间:2010-03-09 01:50:23

标签: assembly cpu-registers

所以我最近一直在进行一些集会,我是初学者,所以我想知道是否有人可以澄清一些事情。我认为每个进程都有自己的寄存器集,每个线程都可以修改这些寄存器吗?那么多个线程如何使用相同的寄存器而不会引起冲突?或者每个线程都有自己的一组寄存器?

6 个答案:

答案 0 :(得分:10)

线程上下文切换涉及保存当前执行上下文的寄存器,并使用保存的值从执行上下文开始切换到加载寄存器。 (除其他事项外)。因此每个线程实际上都有自己的一组寄存器。也是它自己的堆栈,因为ESP是寄存器之一。

考虑这一点的一种方法是通过保存当前寄存器状态并使用新状态加载寄存器来获取线程。如果没有发生,那么它不是一个线程切换。如果您还要切换到一组不同的虚拟地址表,那么您所拥有的是一个进程切换而不是一个线程切换。

你说:

  

我认为每个进程都有自己的寄存器集,每个线程都可以修改这些寄存器吗?

但这不太对。每个CPU内核都有一组寄存器。只要操作系统切换到不同的线程,就会更改这些寄存器。但是在任何时候CPU核心中只有一个线程在执行。进程实际上没有自己的寄存器,进程自己的线程(或至少一个线程),并且线程有寄存器,或者更确切地说是一个位置来保持寄存器的值,同时线程正在等待CPU内核可用于继续。

答案 1 :(得分:4)

在硬件中,每个处理器内核只有一组寄存器。因此,一次只有一个线程可以使用寄存器。通过从一个线程快速切换到另一个线程,多个线程在单个核心上同时运行。调度哪个线程在作业操作系统时运行。

当从一个线程切换到另一个线程时,寄存器的内容被保存到特殊的存储区域,下一个线程的寄存器被复制回处理器。这包括指令指针,因此线程知道在它获得控制权时继续执行的位置。此过程称为上下文切换。

由于操作系统的调度程序位于另一个线程中,因此它只能在运行时调度进程。这意味着需要特殊的硬件功能 - 中断 - 来控制上下文切换。只有操作系统才能安排上下文切换中断。

答案 2 :(得分:2)

线程由内核或操作系统完成,因此程序不应该关心它。如果没有可用的内核或操作系统,那么您需要自己实现它。为此你需要:

  • 一个可以保存状态的功能 CPU中的所有寄存器(SP:堆栈 指针,内部寄存器值, PC:程序计数器等......) 其他内存空间切换到新的 线程。
  • 将线程环境加载到CPU环境的函数,将先前保存的内部寄存器值恢复到CPU寄存器。

答案 3 :(得分:1)

根据处理器的不同,只有一组寄存器。每个帖子没有一套。

有一些方法可以保存所有寄存器的状态,这样线程就可以占用它停止的位置。

Some processors facilitate this

答案 4 :(得分:1)

你有

  • 一组进程,这是您的操作系统之一,
  • 每个进程都有一个包含动态分配内存静态数据代码程序集的内存空间,< / LI>
  • 每个流程都有主题
  • 的列表
  • 每个主题都有自己的一组寄存器程序计数器堆栈

使用上下文切换您的调度程序交换线程数据以将执行传递给另一个。

通常进程线程更重,并且存在各种调度方法:

  • 在内部(绿色线程)进行上下文切换到您的程序(您的操作系统只会将其视为单个进程,因此:硬多核)
  • 您可以指定一些实际流程,以实现混合方法,从而实现轻松的多核优化。

答案 5 :(得分:0)

每个线程都有自己的上下文,其中包括寄存器集,CPU标志,堆栈等。