1. iROM发动MP Core时,一般的做法:
(1)让CPU0履行首要开机流程,其它的处理器进入WFI.
(在发动时,每个处理器能够透过CPU ID得知自己是否为CPU0,假如不是,就进入WFI的程序代码中.)
即:让AP进入Sleep
(2) 初始化外部内存与履行体系的初始化
(3) 设定 Stack
在DRAM初始化前,Stack是建立在SRAM中的。
(4) 把BootRom程序代码复制到外部内存中
(5) 从头Mapping 内存方位
(把0×00000000地址对应到外部内存 或 I-TCM假如 0×00000000地址要跑中止表的话(or 中止表对应到0xffff0000))
由于,Cold Reset时为了顺畅开机,把iROM映射到了0x0000 0000处.
(6) 把第二阶段的BootLoader加载到外部内存中 or OnChip SRAM.\
(7) 履行第二阶段的BootLoader
2. 怎么辨认当时是哪个CPU在履行
履行时期,软件能够透过 CPU ID Register知道现在是MPCore中哪个处理器履行该程序代码,
CPU Id储存在CP15 c0中,长度为32bits,只能在特权等级(也便是SVC Mode下)被读取,读取的典范如下程序代码所示:
MRC p15,0,
31 12 11 … 8 7 … 4 3 … 0
SBZ Cluster ID SBZ CPU ID
阐明如下,
(1) Cluster ID:
用以支撑 Multi-MPCore架构下的Cluster辨认之用 (The Cluster ID field value is set by the CLUSTERID configuration pins.)
(2) CPU ID: 视处理器的个数,例如四个处理器ID依序为 0×00,0×01,0×02与0×03
3. Primary Core所做的本身初始化
(1)Invalidate Data Cache
(2)Invalidate SCU(Snoop Control Unit) duplicate tags for all processors
(3)Invalidate L2 Cache
(4)Enable SCU
(5)Enable Data Cache
(6)Enable L2 Cache
(7)Set SMP mode with ACTLR.SMP.
比及体系安稳后,可能会让Non BSP Core做:
(1). Invalidate Data Cache
(2). Enable Data Cache
(3). Set SMP with ACTLR.SMP.