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

在linux内核smp中,使用pen_release标识符来启动第二个cpus,我也发现它在其他地方也被使用。

我已经检查了它在sysdump中的值,也试图用lauterbach设置来理解它,但不能得到使用这个的基本概念。

据我所知,它是一种锁,用来把辅助CPU放在一个循环中,直到我们从主CPU释放笔。 我试图通过各种方法来证实这种理解,但是却没有太多的办法。

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

答案在这里: 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