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

标签 assembly x86 multiprocessing smp real-mode

在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/

相关文章:

assembly - x86硬件如何检测并设置溢出寄存器标志

python - Tkinter 启动画面和主循环外的多处理

python - 在进程之间通信时,队列比管道有什么优势?

assembly - 将 16 位添加到 64 位寄存器

c++ - 为什么为openmp并行处理不适用于矢量化色彩空间转换?

c++ - 从程序集中调用的 C++ 方法返回对象数据

winapi - Windows Embedded 8 Pro上的Win32应用程序崩溃

python - 如何在多个进程之间共享缓存?

c - 毫不费力地想象同一种语言中的两种类型的 bool 对

c - x86_64 汇编约定保存参数寄存器