例如,曾几何时,要编写 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(使用前将#替换为@)