【问题标题】:Can I write assembler code on a per-core basis?我可以按内核编写汇编代码吗?
【发布时间】:2023-03-07 21:27:01
【问题描述】:

有没有人愿意演示一下英特尔汇编代码如何代表不同内核处理的不同线程?我想每个线程/核心没有一个程序集文件?

编辑:让我改写一下:如果我想在不同的 CPU 内核上编写汇编程序,我可以控制内核 X 上发生的事情以及每个内核之间的通信(就像可以控制内核上的寄存器值一样) ?

【问题讨论】:

  • 线程是一个操作系统概念。它与汇编代码无关。 “启动线程”没有机器代码指令,它需要操作系统调用。
  • 我已更改标题以更准确地反映我的要求
  • 高度相关:What does multicore assembly language look like? 有一个裸机代码示例,用于在 x86 PC 上启动多个内核。当你这样做时,你可以让不同的内核运行不同的代码,就像你在操作系统下启动线程并给每个线程一个函数 + 数据 arg 一样。

标签: assembly x86 intel masm


【解决方案1】:

在汇编级别,线程看起来就像任何其他代码一样。某些指令具有在线程上下文中有用的语义,例如 LOCK CMPXCHG,它执行原子比较和交换。但一般来说,线程是通过操作系统调用来创建和管理的,你通常看不到“管道”。您只需将您的一个函数传递给线程创建 API,它就会开始与当前代码并行(或交错)执行。剩下的就看你自己了。

在操作系统中,线程是通过旋转堆栈和其他寄存器来响应定时器中断来实现的。没有这样的“创建线程”操作码。

【讨论】:

  • 您可能应该更改有关CMPXCHG 的措辞,在涉及线程时使用原子与单指令多操作操作码不同。在线程情况下,总线锁定需要 LOCK 前缀
  • @Necrolis:感谢您指出这一点。我添加了前缀;这是一个足够的修正吗?
【解决方案2】:

所以你想在没有操作系统帮助的情况下启动一个线程。

在最新的 Intel 处理器上,您确实通过 ACPI 函数启动了第二个内核。该函数向暂停的逻辑处理器发出 IPI(处理器间中断),然后在作为 IPI 一部分指定的地址处开始执行代码(新线程)。

如果您真的想查看血淋淋的细节,http://lxr.linux.no/#linux+v3.2/arch/x86/kernel/smpboot.c#L477 就是一个例子。

英特尔® 64 和 IA-32 架构中提供了更多详细信息和文档 软件开发人员手册第 3 卷(系统编程指南),第 8.6 章。由于英特尔一直在随机更改链接,您最好使用 google 找到它。

【讨论】:

  • 好答案,赞成。尽管如此,问题的措辞并没有明确说明 OP 是在现有操作系统下工作,还是要创建一个新操作系统。在前一种情况下,这一切都行不通——操作系统不允许它来自用户程序。
【解决方案3】:

这完全取决于您的架构——Windows? Linux?苹果系统?通常线程将由您的操作系统管理,就像在高级语言中一样。从代码的角度来看,您需要让操作系统使用与 C 语言相同的 API 创建线程。

基本上,创建线程是您要求主机操作系统执行的操作,无论您是在编写 C、程序集、C#、Objective-C 还是其他任何东西,这都是相同的基本概念。

【讨论】:

    【解决方案4】:

    既然是 MASM,我猜你使用的是 Windows。你调用 CreateThread 传递线程启动过程的地址(和其他一些东西)。

    一些相关帖子:http://www.google.co.uk/search?q=createthread+site:masm32.com

    更新

    您仍然受限于操作系统为您提供的功能。例如,您可以致电SetThreadAffinityMaskSetThreadIdealProcessor。正如 Marcelo Cantos 和 Hans Passant 所指出的,线程是由操作系统实现的,而不是由 CPU 实现的,因此您需要与它对话。

    我不相信英特尔处理器具有在它们之间传递消息的机制(除了非常低级和自动的东西,如缓存一致性)。

    【讨论】:

    • 当然,您不仅限于操作系统提供的内容。你总是可以自己做,或者你认为操作系统首先是如何启动线程的?
    • @drhirsch:是的,您可以创建协程、Erlang 风格的轻量级线程等,但它们不是通常意义上的操作系统调度的线程。另外,你不能让你的一个假装线程在不同的处理器上运行,这是 OP 问题的重点。
    • 我不是指协程或轻量级线程。您可以完全省略操作系统并编写自己的启动内容,只是为了在每个处理器上启动一些例程,例如 BareMetalOS (returninfinity.com/baremetal.html)。我以为 OP 确实想知道如何做到这一点,但他的问题不是很清楚。
    【解决方案5】:

    是的,你可以。您需要编写自己的操作系统才能完全控制。这是操作系统功能的一部分,它提供给您的功能量因操作系统而异。

    【讨论】:

      猜你喜欢
      • 2010-11-08
      • 1970-01-01
      • 2019-11-30
      • 2021-01-02
      • 2015-11-03
      • 2021-03-03
      • 2017-11-18
      • 1970-01-01
      • 2013-11-07
      相关资源
      最近更新 更多