在Linux中将多核处理器从实模式转换为保护模式

时间:2018-07-19 08:05:56

标签: linux linux-kernel x86-64 boot bootloader

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

由于有几个相关的问题和this book,我基本上能够理解transition from real mode to protected mode的工作原理。

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

(我只发现this somehow related question with an (short) answer,不可能以不同的模式拥有两个内核,但是没有给出任何来源。)这个答案是错误的(例如,{{ 3}}中指出这一点。

编辑:正如评论所指出的那样,内核可能会在初始化过程的稍后阶段执行此操作,但是何时发生?

1 个答案:

答案 0 :(得分:4)

借助sawdustPeter CordesMichael Petch的输入,我能够找到问题的解决方案(对于Linux v4.16,在这里):

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

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

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位置1):

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