在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,该函数是全能的boot_secondary(),它使用write_pen_release(cpu_logical_map(cpu))编写pen_release.
然后发送IPI arch_send_wakeup_ipi_mask(cpumask_of(cpu));
4)smp_secondary_init
例如功能多样的_secondary_init()函数再次使pen_release为-1
这不是主CPU初始化/启动辅助CPU的方式吗