【ARM】SOC的多核启动流程详解

基础概念

• cold boot 冷启动,一上电就开始运行

• warm boot 热启动,只是复位一下

• Primary boot 只给主核跑的那段代码

• Secondary boot 给从核跑的代码

还两种配置:

• reset地址是可编程的,则会配置PROGRAMMABLE_RESET_ADDRESS=1,与之对立的则是你的reset地址是不可编程的。

• 你在SOC启动的时候,首先只启动一个core,则会配置COLD_BOOT_SINGLE_CPU=1,与之对立的则是你的SOC启动的时候,所有core都上电了

reset地址:一上电主核开始启动的位置,reset地址如果变了,从核就从那里开始运行。

CPU启动的第一条指令

启动地址

• aarch64

boot address 是允许设置的,软件可配 ,根据信号RVBARADDR 具体设计而定

• aarch32

0x00000000(或VBAR) 和 0xffff0000, 二选一,根据VINIT value软件可配

• ARM M系列

boot address 是固定的,比如M4/M0 是0x00000000

在aarch64中,exception vector中是没有Reset的。在Reset时,由RVBARADDR信号决定RVBAR_EL3的值,PC指向的第一条地址从RVBAR_EL3中读出。

在aarch32中,Reset做为exception vector的一部分,芯片复位即PC跳转到向量表的reset offset,那么第一条指令的地址是什么?这就和Exception vectors start相关。而VINITHI信号决定了SCTLR.V的值.

• 对于未实现secure monitore的情况:

SCTLR.V = 0 : Exception vectors start=0x00000000

SCTLR.V = 1 : Exception vectors start=0xffff0000

• 对于实现secure monitor的情况:

对于secure monitor level, Exception vectors start = MVBAR

对于Normal EL1 level:

normal SCTLR.V = 0 : Exception vectors start=normal VBAR

normal SCTLR.V = 1 : Exception vectors start=0xffff0000

对于Secure EL1 level:

secure SCTLR.V = 0 : Exception vectors start=secure VBAR

secure SCTLR.V = 1 : Exception vectors start=0xffff0000

SOC的多核启动流程详解

启动流程

我们就假定 reset地址是可编程的、SOC启动的时候只启动一个core,来讲解我们的boot流程:

(1)、SOC一上电,SOC给ARM Core的signal configuration会改变RVBAR_EL3,这里一般就是就是bootrom的首地址。即CPU一上电,Primary core的PC指向的就是RVBAR_EL3的地址,机器就开始启动了。

(2)、当需要Secondary Core启动的时候,例如会走PSCI协议,【主核】进入ATF会将bl31_warm_entrypoint(或平台自定义的地址)写入到

SOC寄存器,改变reset地址(改变RVBAR_EL3的值),然后此时SOC的PMIC给Secondary Core上电,此时Secondary Core也就发生了cold

reset,PC从RVBAR_EL3(bl31_warm_entrypoint或平台自定义函数)处开始执行.

总结(针对本文示例情况:reset地址是可编程的、cold boot的时候只启动一个cpu):

• 开机一上电只有Primary Core再跑,从RVBAR_EL3处开始跑,属于cold boot

• 从核启动时,会修改reset的值,影响到RVBAR_EL3的值,然后给从核上电,此时属于Secondary boot,仍然是cold boot.

• 一般会将bl31_warm_entrypoint设置为reset地址,即Secondary Core的启动地址;

• 这个示例中没有用到warm boot

mailbox

mailbox就说一块内存,所有的core都能访问这块内存。

第一次启动时,core会填充mailbox,将其下次resume时的地址、secondary core的启动地址、warm reset的地址写入到mailbox内存中,这几个地址其实是一个地址。同时也会将这个地址写入到SOC PMIC寄存器中,影响到RVBAR_EL3的值。

当SOC一上电所有core都启动的这种情况下,主核会继续跑,从核会在SOC一上电就进入wfi状态。 当从核需要继续启动时,该core从BL1 BL2 BL31正常流程启动时,会在BL1、BL2 at EL3、BL31中,强制跳转到mailbox的地址,跳过主核已经初始化的部分;

当SOC一上电,只有一个core上电的情况下,主核继续跑,从核未上电。当从核需要启动时,相当于cold reset,从核会直接从RVBAR_EL3处开始跑,也就是你设置的entrypoint。

mailbox的作用

mailbox中定义了entrypoint地址,当core从BL1 BL2 BL31正常流程启动时,会在BL1、BL2 at EL3、BL31中,强制跳转到mailbox的地址,以跳过已初始化的部分。

cold reset和warm reset

这种判断方法由平台实现,其实就是读取mailbox的值。

在第一个核cold boot时,会写mailbox内存(magic,entrypoint...)

在第二个核启动时、或第一个核再次启动时(有可能是resume唤醒时),会读取mailbox内存,如果读取到了符合期望的magic的值,则走warm流程,否则走cold流程。 注意这里所说的warm流程,只是软件上的warm流程,并非说当前是warm reset。

相关推荐
振南的单片机世界11 小时前
IDLE中断:串口收完一帧数据,硬件自动“吹哨”
arm开发·stm32·单片机·嵌入式硬件
zbyyd1 天前
Linux 基础与 Shell 命令
linux·运维·arm开发
深念Y1 天前
订阅管理及节点过滤实践(技术笔记)
linux·网络·arm·优化·日志·工具·soc
振南的单片机世界2 天前
EXTI“一线多挂”陷阱:PA0和PB0同时触发,中断函数懵了
arm开发·stm32·单片机·嵌入式硬件
LCMICRO-133108477463 天前
国产长芯微LP4807完全P2P替代ADA4807,1mA、300MHz 增益带宽、电压反馈运算放大器
arm开发·嵌入式硬件·fpga开发·硬件工程·运算放大器·ada4807
LCMICRO-133108477463 天前
国产长芯微LP8628完全P2P替代AD8628,零漂移、单电源、输入输出轨到轨高精度运放
arm开发·嵌入式硬件·fpga开发·硬件工程·精密运放·ad8628
zlinear数据采集卡4 天前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源
CIAS4 天前
uniontechos-server-20 1050 u2a pxe Server -x86 arm loongarch
arm开发
振南的单片机世界4 天前
推挽vs开漏:一个“强拉硬灌”,一个“只拉不管”
arm开发·stm32·单片机·嵌入式硬件
zlinear数据采集卡5 天前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#