Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Multithreading Asm:将装配说明移动到特定地址_Multithreading_Assembly_Osdev - Fatal编程技术网

Multithreading Asm:将装配说明移动到特定地址

Multithreading Asm:将装配说明移动到特定地址,multithreading,assembly,osdev,Multithreading,Assembly,Osdev,我试图找到一条汇编指令,它将整个指令移动到一个特定的地址(与指令的大小无关)。如果没有这样的指令,有谁能给我一些关于如何在没有系统调用或其他软件的情况下实现多线程的想法吗?换句话说,假设我正在制作自己的操作系统,如何在汇编中使用高效代码实现多线程?关于如何在原始汇编中实现多线程的问题:现代32位x86处理器具有任务切换的硬件支持。您可以使用它来实现多任务(具有不同地址空间的多个进程)和/或多线程(单个进程中的多个执行线程) 此功能记录在第3卷第7章“任务管理”中。注意:阅读和理解这个高达4700

我试图找到一条汇编指令,它将整个指令移动到一个特定的地址(与指令的大小无关)。如果没有这样的指令,有谁能给我一些关于如何在没有系统调用或其他软件的情况下实现多线程的想法吗?换句话说,假设我正在制作自己的操作系统,如何在汇编中使用高效代码实现多线程?

关于如何在原始汇编中实现多线程的问题:现代32位x86处理器具有任务切换的硬件支持。您可以使用它来实现多任务(具有不同地址空间的多个进程)和/或多线程(单个进程中的多个执行线程)

此功能记录在第3卷第7章“任务管理”中。注意:阅读和理解这个高达4700页的文档可能需要12个生命周期

使用这种硬件支持是运行某些东西的最直接的方法,但可能不是最有效的方法。基于x86的操作系统很早就从这一点转向了手动任务切换。这允许系统实现CPU未提供的切换功能,并且在完全切换时执行优化切换。这种方法变得如此普遍,以至于x86处理器的64位长模式放弃了硬件任务管理支持。现代操作系统使用手动任务切换


关于将移动指令作为实现多线程的一种方式的想法,我认为这里的概念是在需要切换到新代码时在地址空间中移动代码。有两种替代技术可以消除这种需要

首先,您可以跳转到不同位置的代码,而不是移动代码。早期的多任务操作系统(如PDP-11上的Unix)使用这种技术。您可以将所有活动程序加载到不同位置的内存中,设置一个周期性中断,以便每隔一段时间就放弃对系统软件的控制,并在每次中断时选择要跳转到的下一个程序。系统应跟踪每个程序的停止位置,以便在同一位置恢复

第二种方法依赖于虚拟内存。仍然有一个物理内存空间。除此之外,还定义了多个“虚拟”内存空间。在任何给定时间,只有1个虚拟内存空间处于活动状态。无论何时访问内存,系统都会将虚拟地址转换为物理地址。访问内存的程序只能看到自己的虚拟地址空间

每个任务都有自己的地址空间。切换到新任务时,系统激活其专用地址空间,然后在专用地址空间中最后一次暂停的位置恢复执行。您实际上定义了一整套独立的地址空间,而不是在单个共享地址空间中移动对象,甚至不是在共享地址空间中从一个位置跳到另一个位置。您可以根据需要切换到新空间

现代多线程在很大程度上依赖于这种方法。每个进程都有一个专用地址空间;系统会根据需要在它们之间切换。一个进程将有1+个线程。进程中的每个线程共享相同的地址空间。然后,每个线程存储的所有内容都是上次暂停执行的位置。在同一进程中切换到新线程会保留当前地址空间,并在其中跳转到新线程上次暂停的位置


关于如何移动指令的问题,汇编语言不提供这种能力。这不是一件平常的事。如果您想对内存中的机器代码进行操作,可能需要使用类似的库。这样的库具有现有指令的知识和机器代码的字节格式。这使它能够将字节序列解释为指令


一旦您知道下面的指令有多大,在汇编中移动那个数量的字节就很容易了。在x86中,您将使用
mov
指令。

为什么您认为多线程处理需要在一条指令中移动指令?@EOF这是如何实现的?在一些具有固定大小指令的体系结构上,如ARM(A32和AArch64)、POWER MIPS等,这非常容易。在这样的体系结构上,您只需加载/存储一个32位定点数字。同样,你的问题也不清楚这与多线程有什么关系。你为什么要移动单个指令?@EOF我只是想知道是否有这样的指令……你提到了周期性中断!我该怎么做?我的意思是如何使cpu每5百万秒运行一组特定的代码(中断)(例如)?@Anastassis对计时器芯片进行适当的编程。