在linux中启动cpus时使用pen_release背后的基本概念是什么?

时间:2015-01-19 12:21:28

标签: linux kernel smp

在Linux内核smp中,pen_release标识符用于启动辅助cpus,我也发现它也在其他地方使用。

我已经在sysdump中检查了它的值,也尝试用lauterbach设置来理解它,但是无法获得使用它的基本概念。

据我所知,它是一种锁,用于将辅助cpu放入循环,直到我们从主cpu释放笔。我试图通过各种方法来证实这种理解,但不能得到太多。

任何人都可以详细解释这个吗?

1 个答案:

答案 0 :(得分:3)

答案在这里:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0425/ch04s07s01.html
当主核心启动时,辅助核心使用WFI指令保持待机状态。主内核为辅助内核提供启动地址,并使用处理器间中断(IPI)(通过GIC发信号通知的SGI)唤醒它们。使用全局变量pen_release序列化引导辅助核心。从概念上讲,您可以认为辅助核心位于握笔中,并且在主核心的控制下一次释放一个核心。

变量pen_release由内核代码设置为要引导的处理器的ID值,然后在引导时由该内核重置。发生处理器间中断时,辅助内核使用MPIDR寄存器检查pen_release的值是否与其自己的ID值相同。

辅助核心的引导以类似于主核心的方式进行。辅助核心启用MMU。它使中断控制器接口自身并校准本地定时器。它在cpu_online_map中设置一点并调用cpu_idle()。主处理器可以检测cpu_online_map中相应位的设置,并将pen_release设置为下一个辅助核心。

这里有更多信息: http://elinux.org/images/0/00/Clement-smp-bring-up-on-arm-soc.pdf

您可以看到mach-vexpress的代码。在此序列中调用四个函数用于smp初始化:
1)smp_init_cpus
2)smp_prepare_cpus
3)smp_boot_secondary
对于mach-vexpress,该函数是versatile_boot_secondary(),它使用write_pen_release(cpu_logical_map(cpu))写入pen_release;
然后发送IPI arch_send_wakeup_ipi_mask(cpumask_of(cpu));
4)smp_secondary_init
例如versatile_secondary_init()函数再次使pen_release为-1

这不是主CPU初始化/启动secondarys的方式