有没有人能够证明英特尔汇编代码如何代表不同内核正在处理的不同线程?我假设每个线程/核心没有一个汇编文件?
编辑:让我改写:如果我想在不同的CPU内核上编写汇编程序,我可以控制核心X上发生的事情以及每个核心之间的通信(就像可以控制核心上的寄存器值一样)吗
答案 0 :(得分:1)
在程序集级别,线程看起来就像任何其他代码一样。某些指令具有在线程上下文中有用的语义,例如LOCK CMPXCHG,它执行原子比较和交换。但一般来说,线程是通过操作系统调用创建和管理的,通常你看不到“管道”。您只需将其中一个函数传递给线程创建API,它就会开始与当前代码并行执行(或交错执行)。其余的由你决定。
在OS中,通过响应定时器中断来重复堆栈和其他寄存器来实现线程化。这样没有“创建线程”操作码。
答案 1 :(得分:1)
所以你想在没有操作系统帮助的情况下启动一个线程。
在最近的英特尔处理器上,您可以通过ACPI功能启动第二个核心。该函数向停止的逻辑处理器发出IPI(处理器间中断),然后开始在指定为IPI一部分的地址处执行代码(新线程)。
如果你确实想要查看血腥细节,可以在http://lxr.linux.no/#linux+v3.2/arch/x86/kernel/smpboot.c#L477找到一个例子。
更多详细信息和文档在英特尔®64和IA-32架构中 软件开发人员手册第3卷(系统编程指南),第8.6章。随着英特尔随机更改链接,您最好通过谷歌找到它。
答案 2 :(得分:0)
这完全取决于您的架构 - Windows? Linux呢?苹果系统?通常,线程将由您的操作系统管理,就像在更高级别的语言中一样。从代码的角度来看,您需要让操作系统使用您在C中使用的相同API创建一个线程。
基本上,创建一个线程是你要求主机操作系统做的事情,无论你是在写C,汇编,C#,Objective-C还是其他什么,它都是相同的基本概念。
答案 3 :(得分:0)
因为它是MASM我猜你正在使用Windows。你调用CreateThread传递线程启动程序的地址(以及其他一些东西)。
一些相关帖子:http://www.google.co.uk/search?q=createthread+site:masm32.com
<强>更新强>
您仍然受限于操作系统为您提供的功能。例如,您可以拨打SetThreadAffinityMask或SetThreadIdealProcessor。正如Marcelo Cantos和Hans Passant所指出的那样,线程是由操作系统实现的,而不是CPU实现的,因此它是您需要与之交谈的操作系统。
我不相信英特尔处理器有一种在它们之间传递消息的机制(除了非常低级别和自动化内容,如缓存一致性)。
答案 4 :(得分:0)
是的,你可以。您需要编写自己的操作系统来进行绝对控制。这是操作系统功能的一部分,它暴露给您的能力因操作系统而异。