【问题标题】:assembly registers beginner组装登记初学者
【发布时间】:2011-01-25 06:07:41
【问题描述】:

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

【问题讨论】:

    标签: assembly cpu-registers


    【解决方案1】:

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

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

    你说:

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

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

    【讨论】:

    • 很好的信息,谢谢!几乎在上下文切换之前,当前线程会 pushfd 和 pushad?然后在弹出它并离开后它会消失吗?
    • @Dnaiel:我不知道他们是否真的使用这些指令,但这是基本想法,是的。
    • 你可以说每个线程都有自己的寄存器state,当你上下文切换到那个进程时,它会被加载到架构寄存器中。这包括程序计数器;恢复所有其他 regs 后,您跳转(或返回用户空间)到保存的 PC,继续执行。 (@Dnaiel:是的,这包括像 EFLAGS 这样的特殊寄存器,但它也包括堆栈指针本身。使用 pushad 保存所有 reg 可能是您为协程所做的事情,而不是操作系统抢先式多任务处理。)
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        你有

        • 一组进程,即您的操作系统之一,
        • 每个进程都有一个内存空间,其中包含动态分配的内存静态数据代码组合
        • 每个进程都有一个线程列表
        • 每个线程都有自己的寄存器组程序计数器堆栈

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

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

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

        【讨论】:

          【解决方案5】:

          根据处理器,只有一组寄存器。每个线程没有一组。

          有一些方法可以保存所有寄存器的状态,这样一个线程就可以从它离开的地方开始。

          Some processors facilitate this.

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 2014-01-01
              • 1970-01-01
              • 2012-03-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-03-26
              • 1970-01-01
              相关资源
              最近更新 更多