多核汇编语言是什么样的?

2024-01-04

例如,曾几何时,要编写 x86 汇编程序,您可能会收到这样的指令:“将值 5 加载到 EDX 寄存器”、“递增 EDX”寄存器等。

对于具有 4 个核心(甚至更多)的现代 CPU,在机器代码级别看起来是否只是有 4 个独立的 CPU(即只有 4 个不同的“EDX”寄存器)?如果是这样,当您说“递增 EDX 寄存器”时,什么决定了哪个 CPU 的 EDX 寄存器递增?现在x86汇编器中有“CPU上下文”或“线程”概念吗?

内核之间的通信/同步如何工作?

如果您正在编写操作系统,通过硬件公开什么机制可以让您在不同的内核上安排执行?是一些特殊的特权指令吗?)

如果您正在为多核 CPU 编写优化编译器/字节码 VM,那么您需要具体了解 x86 的哪些知识才能使其生成在所有内核上高效运行的代码?

为了支持多核功能,对 x86 机器代码进行了哪些更改?


这不是问题的直接答案,而是评论中出现的问题的答案。本质上,问题是硬件为多核操作提供什么支持,即真正同时运行多个软件线程的能力,而无需在它们之间进行软件上下文切换。 (有时称为表面处理系统 https://en.wikipedia.org/wiki/Symmetric_multiprocessing).

尼古拉斯·弗林特说得对 https://stackoverflow.com/users/19521/nicholas-flynt,至少对于 x86 而言。在多核环境(超线程、多核或多处理器)中,引导核心(通常是处理器 0 中核心 0 中的硬件线程(又名逻辑核心)0)开始从地址获取代码0xfffffff0。所有其他内核(硬件线程)都以特殊的睡眠状态启动,称为等待SIPI。作为其初始化的一部分,主内核通过 APIC 向 WFS 中的每个内核发送一个称为 SIPI(启动 IPI)的特殊处理器间中断 (IPI)。 SIPI 包含该内核应开始获取代码的地址。

这种机制允许每个内核从不同的地址执行代码。所需要的只是为每个硬件核心提供软件支持,以建立自己的表和消息队列。

操作系统使用those进行软件任务的实际多线程调度。 (普通操作系统只需在启动时启动其他内核一次,除非您热插拔 CPU,例如在虚拟机中。这与启动或将软件线程迁移到这些内核上是分开的。每个内核正在运行内核,如果没有其他事情要做,它会花时间调用睡眠函数来等待中断。)

就实际的程序集而言,正如 Nicholas 所写,单线程或多线程应用程序的程序集之间没有区别。每个核心都有自己的寄存器集(执行上下文),因此编写:

mov edx, 0

只会更新EDX为了当前正在运行的线程。没有办法修改EDX在另一个处理器上使用单个汇编指令。您需要某种系统调用来要求操作系统告诉另一个线程运行将更新其自身的代码EDX.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多核汇编语言是什么样的? 的相关文章

  • 从 exe 文件中获取汇编级代码?

    我当时正在做linux汇编编程 在过去的几天里我已经转而学习windows汇编编程 我在用ml作为我的汇编器和golink作为我的链接器 我有我的汇编代码并已获得我的exe从中 现在我需要取回它的十六进制 xff xab x55等等 在li
  • 如何在 Debian 上编译 DOS 程序?

    在我的汇编语言课程中 我们使用 DPMI 编写 DOS 程序 不幸的是 我无法一直使用 32 位 Windows 机器 我在我使用的几乎每台计算机上都安装了 Debian 虚拟机 我已经安装了 DOSBox 和 DOSEMU 有什么办法可以
  • “mov (%ebx,%eax,4),%eax”如何工作? [复制]

    这个问题在这里已经有答案了 一直在从事装配作业 并且在很大程度上我对装配非常了解 或者至少对于这项任务来说足够好 但这个 mov 的声明让我很困惑 如果有人能解释这个 mov 语句如何操作寄存器值 我将非常感激 mov ebx eax 4
  • 程序集比较标志理解

    我正在努力理解汇编程序中的以下代码片段 if EAX gt 5 EBX 1 else EBX 2 在汇编程序中 可以写如下 根据我的书 模拟jge操作说明 https www felixcloutier com x86 jcc您通常会使用
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作
  • 如何编译GCC生成的asm?

    我正在玩一些汇编代码 有些事情困扰着我 我编译这个 include
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne
  • NodeJS CPU 一次飙升至 100%

    我有一个用 NodeJS 编写的 SOCKS5 代理服务器 我正在使用原生net and dgram打开 TCP 和 UDP 套接字的库 它可以正常工作大约 2 天 所有 CPU 的最大利用率约为 30 两天没有重新启动后 一个 CPU 峰
  • 在 x86 程序集中存储大量布尔值的最佳方法是什么?

    最近我一直在处理充满布尔值的大型数组 目前 我将它们存储在 bss部分有一个 space指令 它允许我创建字节数组 但是 由于我只需要存储布尔值 因此我希望从数组中逐位读取和写入数据 目前 我能想到的最好方法是有一个 space指令所需存储
  • LC3 LEA指令和存储的值

    我对这个问题感到困惑 指令后寄存器0中存储的值是多少 LEA R0 A 被处决了吗 为什么答案是x370C 我认为应该将A的地址加载到R0中 如果是这样我们怎么知道地址 有人可以帮忙吗 非常感谢 ORIG X3700 LEA R0 A LD
  • 在 x86 汇编中将 64 位常量移至内存

    我正在使用 Intel x64 程序集 NASM 编译器 尝试将 0x4000000000000000 常量移至内存 该常量在 ieee 754 标准双精度中应等于 2 0 我正在使用的代码是 define two 0x4000000000
  • 长多字节 NOP:通常理解的宏或其他符号

    x86 和 x86 64 处理器不仅具有单字节 这不是什么大秘密NOP指令 还包括各种类型的多字节类 NOP 指令 这些是我设法找到的 AMD 推荐 参考 AMD 系列 15h 处理器的 AMD 软件优化指南 文档 47414 http s
  • 高效memcspn

    有谁知道 memcspn 函数的有效实现吗 它的行为应该类似于 strcspn 但在内存缓冲区中查找跨度 而不是在以 null 结尾的字符串中查找跨度 目标编译器是 VisualC 谢谢 卢卡 一种近乎最佳的实现 size t memcsp
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • CPU 周期与总 CPU 时间

    在 Windows 上 GetProcessTimes 和 QueryProcessCycleTime 可用于获取应用程序所有线程的总计 我期望 显然是天真地 找到总周期数和总处理器时间 用户 内核 之间的比例关系 当转换为相同的单位 秒
  • 避免 gcc 函数序言开销?

    我最近遇到了很多 gcc 在 x86 上生成非常糟糕的代码的函数 它们都符合以下模式 if some condition do something really simple and return else something comple
  • 无法识别的仿真模式:MinGW32 上的 elf_i386

    我正在尝试制作内核 但无法链接C与程序集一起输出 这ld 我收到错误 无法识别的仿真模式 elf i386 我正在使用 Windows 10 专业版以及 MinGW32 和 MSYS 我正在使用的代码 link ld link ld OUT
  • 使用 Gas 生成与位置无关的代码 (-fPIC)

    我尝试在 x86 64 上创建共享库但失败 问题归结为以下代码 请不要介意 它没有多大意义 section data newline ascii n section text globl write newline type write n
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 如何在 GCC C++ 中编写多行内联汇编代码?

    这看起来不太友好 asm command 1 command 2 command 3 我真的必须在每一行加上双引号吗 另外 由于多行字符串文字在 GCC 中不起作用 我也无法欺骗它 我总是在互联网上找到一些例子 该人手动插入制表符和换行符而

随机推荐