在不同的处理器上运行代码(x86程序集)

Rhy*_*haw 10 x86 assembly real-mode smp multiprocessing

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

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

Dig*_*oss 9

所以你有一个独立的(你说的"预启动")程序,就像一个以实模式运行的引导加载程序?这是在普通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
Run Code Online (Sandbox Code Playgroud)

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

有关更多信息,请参阅英特尔多处理器规范.