我试图了解有关操作系统的更多信息,目前正在研究如何加载和初始化Linux内核。
由于有几个相关的问题和this book,我基本上能够理解transition from real mode to protected mode的工作原理。
但是,我不了解的一件事是,如何以及何时将其余内核切换到多内核处理器的保护模式(据我所知,每个内核都有自己的一组控制寄存器,并且切换似乎只在启动过程中发生一次。
(我只发现this somehow related question with an (short) answer,不可能以不同的模式拥有两个内核,但是没有给出任何来源。)这个答案是错误的(例如,{{ 3}}中指出这一点。
编辑:正如评论所指出的那样,内核可能会在初始化过程的稍后阶段执行此操作,但是何时发生?
答案 0 :(得分:4)
借助sawdust,Peter Cordes和Michael 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