【问题标题】:Running code on different processor (x86 assembly)在不同的处理器上运行代码(x86 程序集)
【发布时间】:2010-12-09 23:49:47
【问题描述】:

在 x86 的实模式下,需要使用哪些指令在多处理器系统中的不同处理器上运行代码?

(我正在用汇编程序编写一些预启动代码,需要设置某些 CPU 寄存器,并在实际操作系统启动之前在系统中的每个 CPU 上执行此操作。)

【问题讨论】:

标签: assembly x86 multiprocessing smp real-mode


【解决方案1】:

所以你有一个独立的(你说“预引导”)程序,比如引导加载程序,在实模式下运行?这是在具有通常 BIOS 的 PeeCee 上吗?

在这种情况下,您只有一个 CPU 正在运行。为了启动其他 CPU 单元,操作系统通常会执行所谓的通用启动算法,如下所示:

BSP sends AP an INIT IPI
BSP DELAYs (10mSec)
If (APIC_VERSION is not an 82489DX) {
  BSP sends AP a STARTUP IPI
  BSP DELAYs (200μSEC)
  BSP sends AP a STARTUP IPI
  BSP DELAYs (200μSEC)
}
BSP verifies synchronization with executing AP

BSP 是引导处理器。 AP是应用处理器。 IPI 是处理器间中断。为了进行 IPI,您需要启用 APIC,这是 PC 架构的中断控制器扩展,在启动时未启用。这就是为什么代码担心它运行的是哪种 ICU 版本。所有这些都是相当深刻的内核魔法。您可以尝试查看 Linux、NetBSD 或其他 *BSD 源代码作为示例,但这并不容易阅读。如果你真的赢了,你可能会在某个地方找到一个小的内核或独立的 SMP 测试程序。

有关详细信息,请参阅Intel Multiprocessor Specification

【讨论】:

    猜你喜欢
    • 2021-01-12
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2020-09-30
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多