在x86上的实模式下,在多处理器系统中,需要使用什么指令在不同处理器上运行代码?
(我在汇编器中编写了一些预引导代码,这些代码需要设置某些CPU寄存器,并在实际操作系统启动之前在系统中的每个CPU上执行此操作。)
最佳答案
因此,您有一个独立的(您所说的“预启动”)程序,如引导加载程序,以实模式运行吗?这是在具有常规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架构的中断 Controller 扩展,在启动时未启用。这就是为什么代码担心它运行的是哪种ICU版本。所有这些都是相当深的内核魔术。您可以尝试查看Linux,NetBSD或其他* BSD源代码作为示例,但阅读起来并不容易。如果您真的赢了,您可能会在某个地方找到小型内核或独立的SMP测试程序。
有关更多信息,请参见Intel Multiprocessor Specification。
关于assembly - 在不同处理器(x86程序集)上运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1622388/