微信公众号:mindshare思享
今天突然翻出好几年前写的一篇关于Armv7-A CPU SMP启动流程的文章,还是当时Arm第一款真正意义上的SMP多核系统,所以当时花了很多时间来去研究Linux kernel怎么支持的。
在那个年代还没有device tree, 比较多的SMP的支持还需要platform的代码支持,power on/off也没有PSCI的定义,都是平台自己的实现。
Timer也没有现在的Architecture Timer支持的标准。
到了Cortex-A7/A15以后的时候,随着device tree和Arm CPU HW越来越标准,PSCI规范的出现,现在port一个能基本工作的Linux kernel基本工作量比较少,一般硬件没问题的话,2-3天能将一个基本的Linux kernel带起来。
基本的loader--boot monitor
Boot monitor是Arm在vesatile express板子上的最基本的loader,现在已经被Arm Trusted Firmware取代,现在在Firmware里做了更多的事情。
Boot monitor采取了最常用的方式来逐个将CPU启动起来。
它的方式与下面的类似,
还有一种也比较常用的启动SMP的方式,
现在的Arm的JUNO开发板就是采用这种方式,只是JUNO上不是AVP,而是一个Cortex-M3的控制器。
SMP kernel 启动流程图
SMP kernel boot 代码流程
红色部分是需要平台实现的代码。
OnPrimary CPU
以上Setup_arch具体工作为
On SecondaryCPU