seconday cpu的启动由主内核启动。在主CPU上完成了一些工作,在辅助CPU上完成了一些工作,以完成cpu_up的热插拔操作。
我试图找到在主cpu上执行的确切指令,该指令触发辅助cpu的启动,然后它将检查pen_release变量的值。
您能否解释一下启动辅助cpu的过程,以及在启用了SMP的Linux内核中使用pen_release global的情况。
seconday cpu的启动由主内核启动。在主CPU上完成了一些工作,在辅助CPU上完成了一些工作,以完成cpu_up的热插拔操作。
我试图找到在主cpu上执行的确切指令,该指令触发辅助cpu的启动,然后它将检查pen_release变量的值。
您能否解释一下启动辅助cpu的过程,以及在启用了SMP的Linux内核中使用pen_release global的情况。
免责声明-我不是Linux专家)
通过Linux内核(Linaro Stable 3.14.22),代码似乎位于./arch/arm64/kernel/smp_spin_table.c中(我假设是ARMv8)。特别:
静态int smp_spin_table_cpu_boot(unsigned int cpu)
{
/ *
*更新笔释放标志。
write_pen_release(cpu_logical_map(cpu));
/ *
*发送一个事件,使辅助副本读取pen_release。
sev();
返回0;
}
因此,看起来内核正在向内存中写入标志,然后使用SEV指令唤醒其他内核。
其他内核将处于WFE循环中,每次唤醒时都会检查pen_release变量。