Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编寄存器初学者_Assembly_Cpu Registers - Fatal编程技术网

Assembly 汇编寄存器初学者

Assembly 汇编寄存器初学者,assembly,cpu-registers,Assembly,Cpu Registers,所以我最近参加了一些集会,我是一个初学者,所以我想知道是否有人能澄清一些事情。我认为每个进程都有自己的寄存器集,每个线程都可以修改这些寄存器?。那么多个线程如何使用相同的寄存器而不引起冲突呢?或者每个线程都有自己的寄存器集吗?线程上下文切换涉及保存当前执行上下文的寄存器,并从执行上下文开始切换到加载保存值的寄存器。(除其他外)。因此,每个线程实际上都有自己的寄存器集。还有它自己的堆栈,因为ESP是寄存器之一 考虑这一点的一种方法是通过保存当前寄存器状态并加载具有新状态的寄存器来获得线程。如果这没

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

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

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

你说:

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


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

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

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

有很多方法可以保存所有寄存器的状态,这样线程就可以继续它停止的地方


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

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

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

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

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

您有

  • 操作系统中的一组进程
  • 每个进程都有一个内存空间,其中包含动态分配内存静态数据代码汇编
  • 每个进程都有一个线程列表
  • 每个线程都有自己的寄存器集程序计数器堆栈
使用上下文开关调度程序交换线程数据以将执行传递给另一个线程

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

    [LI]做上下文内部切换(绿色线程)到您的程序(您的操作系统将只考虑它是一个单一的进程,所以:硬多核)
  • 您可以为许多实际流程分配一种混合方法,以实现简单的多核优化

很好的信息,谢谢!那么在切换上下文之前,当前线程会pushfd和pushad?然后把它放回去,然后它就消失了?@Dnaiel:我不知道他们是否真的使用了这些指令,但这是基本的想法,是的。你可以说每个线程都有自己的寄存器状态,当你切换到那个进程时,它会被加载到架构寄存器中。包括程序计数器;恢复所有其他注册表后,您将跳转(或返回用户空间)到保存的PC,继续执行。(@Dnaiel:是的,这包括像EFLAGS这样的特殊寄存器,但它也包括堆栈指针本身。使用
pushad
保存所有寄存器可能是为了协同路由,而不是为了操作系统的先发制人多任务。)