Linux 多核处理器从实模式到保护模式的转换

Transition of multi-core processor from real mode to protected mode in Linux

我正在尝试了解有关操作系统的更多信息,目前我正在查看 Linux 内核是如何加载和初始化的。

感谢几个相关问题和 this book, I was mostly able to understand how the transition from real mode to protected mode 作品。

但是,我不明白的是,其余内核如何以及何时切换到多核处理器的保护模式(据我所知,每个内核都有自己的一组控制寄存器和开关似乎只在启动过程中发生一次)。

(我只在评论中发现 this somehow related question with an (short) answer that it is not possible to have two cores in different modes, however there was no source given.) This answer is wrong (thanks to e.g. n.m. 指出了这一点)。

编辑: 正如评论已经指出的那样,内核可能会在初始化过程的后期执行此操作,但是那是什么时候发生的?

感谢 sawdust, Peter Cordes and Michael Petch 的输入,我能够找到我的问题的解决方案(这里是 Linux v4.16):

基本上每次内核启动时都会发生从实模式到保护模式的转换(如果支持热插拔,则随时可能发生)。

辅助处理器的第一次启动发生在 SMP (Symmetric Multiprocessing) initialization(这是内核初始化的一部分)期间。在那里,cpu_up() 被初始化期间存在的所有 CPU 调用:

for_each_present_cpu(cpu) {
  if (num_online_cpus() >= setup_max_cpus)
    break;
  if (!cpu_online(cpu))
    cpu_up(cpu); // Startup of the core in the following functions
}

此函数调用导致使用 APIC 激活核心(参见 INIT/SIPI 信号)。

首先,被唤醒的内核处于实模式,并以real mode trampoline code for x86-64作为入口点, 在 x86-64 的情况下。

在那里和以下函数中,二级处理器转换到 protected mode(例如设置 PE 位):

# Enable protected mode
movl  $X86_CR0_PE, %eax  # protected mode (PE) bit
movl  %eax, %cr0         # into protected mode