SOC的多核启动流程详解

news2024/11/20 1:26:50

目录

        • 1、基础概念
        • 2、启动流程
        • 3、ATF(TF-A)代码的剖析
        • 5、软件如何判断当前是cold reset/warm reset/primary boot/senondary boot
          • 5.1 cold reset和warm reset
          • 5.2 primary boot和secondary boot
        • 6、mailbox的介绍
          • 6.1 mailbox是什么
          • 6.2 mailbox的作用
          • 6.3 mailbox的示例
        • 7、具体场景的总结
        • 推荐

本文转自 周贺贺,baron,代码改变世界ctw,Arm精选, armv8/armv9,trustzone/tee,secureboot,资深安全架构专家,11年手机安全/SOC底层安全开发经验。擅长trustzone/tee安全产品的设计和开发。

思考:
1、 SOC一上电,只有一个核启动,还是所有核都启动?
2、如果SOC一上电,如果只有一个核启动,那么从核启动的时候,从核的入口是哪里?
3、啥是cold boot? 啥时warm boot? 在哪些场景下会使用warm boot?
4、啥是cold reset/warm reset/primary boot/senondary boot?


说明:
1、本文以为armv8-aarch64、armv9为例、TF-A代码为例,不讨论其它硬件架构和固件软件中的设计。
2、重点讲述cold reset/warm reset/primary boot/senondary boot之间的流程和概念。


1、基础概念

请先自行理解以下4个概念:

  • cold boot
  • warm boot
  • Primary boot
  • Secondary boot

另外还两种配置:

  • 你的reset地址是可编程的,则会配置PROGRAMMABLE_RESET_ADDRESS=1,与之对立的则是你的reset地址是不可编程的。
  • 你在SOC启动的时候,首先只启动一个core,则会配置COLD_BOOT_SINGLE_CPU=1,与之对立的则是你的SOC启动的时候,所有core都上电了。
2、启动流程

我们就假定 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
3、ATF(TF-A)代码的剖析

以BL1代码为例分析,该代码适配支持cold reset/warm reset/primary boot/senondary boot等诸多场景。
在这里插入图片描述

  • 如果reset是可编程的,PROGRAMMABLE_RESET_ADDRESS=1, 则_warm_boot_mailbox = 0,则下面这段代码不会被编译,无论cold boot还是warm boot都不会走_warm_boot_mailbox
  • 如果reset是可编程的,PROGRAMMABLE_RESET_ADDRESS=0, 则_warm_boot_mailbox = 1,则下面这段代码会被编译,但cold boot走do_cold_boot 流程,warm boot需要走br x0 流程
	.if \_warm_boot_mailbox
		/* -------------------------------------------------------------
		 * This code will be executed for both warm and cold resets.
		 * Now is the time to distinguish between the two.
		 * Query the platform entrypoint address and if it is not zero
		 * then it means it is a warm boot so jump to this address.
		 * -------------------------------------------------------------
		 */
		bl	plat_get_my_entrypoint
		cbz	x0, do_cold_boot
		br	x0
do_cold_boot:
.endif /* _warm_boot_mailbox */
  • 如果SOC启动的时候只启动一个core, COLD_BOOT_SINGLE_CPU=1_secondary_cold_boot = 0,则下面代码不被编译, 则无论主核还是从核都不需要走_secondary_cold_boot流程
  • 如果SOC启动的时候启动多个core, COLD_BOOT_SINGLE_CPU=0_secondary_cold_boot = 1, 则下面代码会被编译,则主核走do_primary_cold_boot流程, 从核需要走plat_secondary_cold_boot_setup流程
	.if \_secondary_cold_boot
		/* -------------------------------------------------------------
		 * Check if this is a primary or secondary CPU cold boot.
		 * The primary CPU will set up the platform while the
		 * secondaries are placed in a platform-specific state until the
		 * primary CPU performs the necessary actions to bring them out
		 * of that state and allows entry into the OS.
		 * -------------------------------------------------------------
		 */
		bl	plat_is_my_cpu_primary
		cbnz	w0, do_primary_cold_boot

		/* This is a cold boot on a secondary CPU */
		bl	plat_secondary_cold_boot_setup
		/* plat_secondary_cold_boot_setup() is not supposed to return */
		bl	el3_panic

	do_primary_cold_boot:

根据以上的代码规则,这里也画了两张图:
(1)、BL2 at EL3的场景
在这里插入图片描述

(2)、BL2 at S-EL1的场景
在这里插入图片描述

5、软件如何判断当前是cold reset/warm reset/primary boot/senondary boot

TF-A中定义了多核的启动框架,如上一节框图所示,在启动的过程中会进行一些判断,是cold reset还是warm reset,是primary boot还是secondary boot?那么代码中是怎么知道这些状态的呢?

5.1 cold reset和warm reset

这种判断方法由平台实现,其实就是读取mailbox的值。
在第一个核cold boot时,会写mailbox内存(magic,entrypoint…)
在第二个核启动时、或第一个核再次启动时(有可能是resume唤醒时),会读取mailbox内存,如果读取到了符合期望的magic的值,则走warm流程,否则走cold流程。 注意这里所说的warm流程,只是软件上的warm流程,并非说当前是warm reset。

5.2 primary boot和secondary boot

这种判断方法由平台实现,看似也很简单,一般而言就说读取mpidr寄存器进行判断。

(trusted-firmware-a/plat/marvell/armada/a8k/common/aarch64/plat_helpers.S)

func plat_is_my_cpu_primary
	mrs	x0, mpidr_el1
	and	x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
	cmp	x0, #MVEBU_PRIMARY_CPU
	cset	w0, eq
	ret
endfunc plat_is_my_cpu_primary
6、mailbox的介绍
6.1 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。

6.2 mailbox的作用

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

6.3 mailbox的示例

其实就是定义了一块内存,主核第一次跑时,会填充该内存。
主核第二次跑时或从和跑时,检测该内存已经填充过了,则走warm启动流程,即强制跳转到mailbox中的address地址。
在这里插入图片描述

7、具体场景的总结
  • 串口中断中敲击reboot命令、或系统panic时导致的机器重启 :在一些的SOC厂商设计中,应该是code reboot。比如在Linux Kernel中敲击reboot,到底层还是写的一些寄存器控制pmic(或PMU),直接给cpu下电了。然后再上电,SOC还是会给Core发送signal configuration,此时RVBAR_EL3又会变成ASIC设置的值.
  • Suspend和Resume : 比如我在看ATF中的海思平台,在ATF的suspend函数,将bl31_warm_entrypoint地址写入到了SOC PMIC的一个寄存器中(上电时,该寄存器会影响的是RVBARADDR信号)。
    此时系统深睡的时候,应该是Linux Kernel调用到ATF,将bl31_warm_entrypoint地址写入到了pmu/pmic相关的寄存器中,在下一次reset时,会影响到signal configuration继而改变RVBAR_EL3的值。 然后还会给各个模块下电(给哪些模块下电是SOC的设计和逻辑),最后再给ARM Core下电, 这就算是深睡了。 Resume的时候,也是有一些SOC的硬件行为,然后再给Core上电,那给Core上电后,一上电执行的是哪里?
    PC还是指向RVBAR_EL3中的地址,当然这是我们suspend的时候更改过的,其实就是bl31_warm_entrypoint
  • RMR_EL3 :本文中都没有提到RMR_EL3。 那么RMR_EL3是干啥的呢? 这是ARM的一个feature,怎么用?是你自己的设计,随便你。你写RMR_EL3中的bit,就可以触发warm reset. 一般的kernel dump、或者一些工具,就可以主动触发RMR_EL3,然后去干一些活. 还有在csdn上看到一篇高通soc的启动流程的博客,他们正常的启动流程中,某一个镜像跳转到另外一个镜像时,竟然就是写了一些RMR_EL3,触发warm_reset,另外一个镜像的地址恰好就是warm reset的跳转地址。

推荐
  • ARMv8/ARMv9架构从入门到精通 --博客专栏
  • 《Armv8/Armv9架构从入门到精通 第二期》 --大课程
  • 8天入门ARM架构 --入门课程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1507410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

案例分析01-题型分析与历年案例题真题考点汇总(2024年软考高级系统架构设计师冲刺知识点总结)

1、历年真题案例分析题考点汇总 1.1 2018年~2023年 1.2 2012年~2017年 2、考试安排 案例分析题的考试安排在下午,时间为1.5小时,相对来说比较轻松。 上午:09:00-11:30,150分钟,2.5小时 综合知识题,全选择题&#xff…

Ps:画笔工具

画笔工具 Brush Tool是 Photoshop 中最常用的工具,可广泛地用于绘画与修饰工作之中。 快捷键:B ◆ ◆ ◆ 常用操作方法与技巧 1、熟练掌握画笔工具的操作对于使用其他工具也非常有益,因为 Photoshop 中许多与笔刷相关的工具有类似的选项和操…

职场成功的关键:积极主动,勇于担当

在职场中,每个人都渴望成功。然而,成功并非一蹴而就,而是需要我们在日常工作中不断积累、锻炼和提升。本文将为您揭示职场成功的关键因素,帮助您在职场道路上越走越远。 一、积极主动,主动承担责任 在职场中&#xff0…

基于多源信息融合的巡飞弹对地目标识别与毁伤评估

源自:系统仿真学报 作者:徐艺博 于清华 王炎娟 郭策 冯世如 卢惠民 “人工智能技术与咨询” 发布 摘 要 面向利用多枚巡飞弹对地面高防御移动目标进行打击的任务场景,提出一种基于多源信息融合的巡飞弹对地移动目标识别与毁伤评估方法…

【C++从练气到飞升】02---初识类与对象

🎈个人主页:库库的里昂 ✨收录专栏:C从练气到飞升 🎉鸟欲高飞先振翅,人求上进先读书。 目录 ⛳️推荐 一、面向过程和面向对象初步认识 二、类的引用 1. C语言版 2. C版 三、类的定义 类的两种定义方式&#xff…

趣学前端 | JavaScript标准库

背景 最近睡前习惯翻会书,重温了《JavaScript权威指南》这本书。这本书,文字小,内容多。两年了,我才翻到第十章。因为书太厚,平时都充当电脑支架。 JavaScript标准库 今天阅读的章节是JavaScript标准库,…

Python可视化 --条形图(bar)

1.matplotlib模块 应用matplotlib模块绘制条形图,需要调用bar函数,关于该函数的语法和参数含义如下: bar(x, height, width0.8, bottomNone, colorNone, edgecolorNone,linewidthNone, tick_labelNone, xerrNone, yerrNone,labe…

C++11——智能指针

本文将解决一下几个问题 1.什么是智能指针 2.为什么需要之智能指针 3.智能指针的使用场景 智能指针 RAII:是一种利用对象声明周期来控制的程序资源(如内存、文件句柄、网络连接、互斥量等)的技术 在对象构造的时候获取资源,接…

chatGPT发不出消息,一直转圈,最简单的解决办法。

chatGPT发不出消息,一直转圈,最简单的解决办法。-CSDN博客文章浏览阅读358次,点赞12次,收藏3次。解决chatgpt发消息一直转圈现象。https://blog.csdn.net/z3256707200/article/details/136607923?ops_request_misc&request_i…

谷歌BigQuery推出新玩意儿,向量搜索登场啦!

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

高分1、2号卫星原始遥感影像数据

高分一号 高分一号卫高分一号卫星是中国高分辨率对地观测系统的首发星,突破了高空间分辨率、多光谱与宽覆盖相结合的光学遥感等关键技术,设计寿命5至8年。 高分辨率对地观测系统工程是《国家中长期科学和技术发展规划纲要(2006~2020年)》确定…

Mamba.py: 状态空间模型的并行扫描

文章目录 Mamba.py:扫描和并行扫描什么是扫描什么是并行扫描累加计算的例子矩阵求和简化矩阵求和python实现累加求和的并行 Blelloch 算法Up-sweepDown-sweep selective_scan Mamba.py:扫描和并行扫描 mamba.py/docs/pscan.ipynb at main alxndrTL/mam…

Kafka可用与可靠机制

文章目录 kafka的副本机制ACKSIn-Sync Replicas(ISR)Unclean leader electionmin.insync.replicas acks1的情况acks-1的情况acks-1和min.insync.replicas2的情况 同步机制1.follower不对外提供服务的原因2.幂等性的实现 kafka的副本机制 假如3分区&…

Linux/Windows下部署OpenCV环境(Java/SpringBoot/IDEA)

环境 本文基于Linux(CentOS 7)、SpringBoot部署运行OpenCV 4.5.5,并顺带记录Windows/IDEA下如何调试SpringBoot调用OpenCV项目。 Windows下调试 首先我们编写代码,并在Windows/IDEA下调试通过。 下载Windows版安装包&#xff0…

OD_2024_C卷_200分_6、六_连续出牌数量【JAVA】【回溯算法】

题目描述 package odjava;import java.util.Arrays; import java.util.Scanner;public class 六_连续出牌数量 {// 定义扑克牌类static class Card {int num; // 牌号char color; // 花色public Card(int num, String color) {this.num num;this.color color.charAt(0); // 取…

网络套接字1

网络套接字1 📟作者主页:慢热的陕西人 🌴专栏链接:Linux 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容讲解了udp的Linux环境下的使用&#xff0c…

JVM3_数据库连接池虚引用ConnectionFinalizerPhantomReference引起的FullGC压力问题排查

背景 XOP服务运行期间,查看Grafana面板,发现堆内存周期性堆积,观察FullGC的时间,xxx,需要调查下原因 目录 垃圾收集器概述 常见的垃圾收集器分区收集策略为什么CMS没成为默认收集器 查看JVM运行时环境分析快照 Pha…

msfconsole中db_namp的使用方法以及如何让msf连接数据库

一、db_nmap使用方法 1.打开数据库 1.1查看数据库postgresql连接状态 systemctl status postgresql查看数据库postgresql连接状态、 1.2启动postgresql systemctl start postgresql启动postgresql 1.3初始化 msfdb init初始化 2.C段扫描(db_nmap的使用) 2.1 db_nmap -sP 192…

AIGC实战——GPT(Generative Pre-trained Transformer)

AIGC实战——GPT 0. 前言1. GPT 简介2. 葡萄酒评论数据集3. 注意力机制3.1 查询、键和值3.2 多头注意力3.3 因果掩码 4. Transformer4.1 Transformer 块4.2 位置编码 5. 训练GPT6. GPT 分析6.1 生成文本6.2 注意力分数 小结系列链接 0. 前言 注意力机制能够用于构建先进的文本…

windows和linux系统安装redis

Redis安装 Redis安装与启动windows服务 Redis 安装 这样安装完在系统服务中并没有redis服务 redis服务启动 Redis安装与启动Linux服务 1.下载压缩包到服务器 我下载的是最新版本7.0.12,这里我是直接下载到了root目录下 wget https://github.com/redis/redis…