在不同处理器上运行代码(x86汇编)

11

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

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


1
你能在实模式下进行内存保护吗? - Draemon
没有任何关于 MP 的特定模式。毫无理由不这样做。 - Nathan Fellman
1
看起来像是一个重复的问题,与https://dev59.com/jXNA5IYBdhLWcg3wZ81R相似。 - Nathan Fellman
最小示例:https://dev59.com/jXNA5IYBdhLWcg3wZ81R#33651438 - Ciro Santilli OurBigBook.com
1个回答

10

你有一个独立的(你说是“pre-boot”)程序,比如引导加载程序,在实模式下运行吗?这是在普通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多处理器规范


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接