基于MTK7981平台,学习了解理解SoC上电和boot流程

news2024/10/1 17:32:17

       当SoC芯片流片回来后,并不是直接通电就可以使用的。需要进行上电复位,然后对SoC进行配置使其进入到正常工作状态,然后才能运行正常的程序和任务。这是一个比较复杂的过程,也是在芯片设计阶段,SoC需要重点考虑的问题。上电不能成功,芯片流片回来直接就不能启动,这也是最重大的失败,所以保证芯片能正常上电启动是SoC设计最重要的第一步。

由于SoC各种各样,不同是SoC的启动流程是有区别的,但是大部分SoC遵循着基本的流程:

  1. 上电复位:芯片通电后,所有寄存器和内存被重置到初始状态。

  2. Boot阶段:初始化硬件;

  3. 操作系统启动:内核初始化,加载驱动,挂载文件系统。

  4. 用户空间初始化:启动系统服务和用户界面。

这个过程确保了SOC从断电状态到操作系统完全运行的平滑过渡。下面详细说明每个阶段的内容。

上电复位(Power-On Reset)

当SOC通电或复位信号触发时,SOC进入复位状态。复位电路会将所有寄存器和内存重置为已知的初始状态,确保系统从一个干净的状态开始启动。

Power-On Reset缩写为POR,这是一个非常常见的缩写,需要记住

这个阶段还需要准备好Boot Mode Pin,确定Boot的介质,Boot Mode在POR释放时候锁存。

POR释放后开始reset flow阶段,SoC内部一般有一个控制reset sequence的状态机FSM,来进行启动阶段的reset。这个reset的控制和SoC内部实现强相关,不同的SoC有不同的实现方式。

同时还会完成下面任务:

  1. 确认PLL输出时钟稳定;

  2. 会启动必要的外设的时钟;

  3. 释放必要的模块的reset;

  4. 使用OTP配置内部模块;

  5. 进行进行Power-On Self-Test(POST)等

越是复杂的SoC,在这个阶段需要做的事情越多。

Boot阶段

系统引导程序

在遥远的单片机时代,嵌入式设备功能比较单一,每个设备只需要执行一件简单的任务,因此在系统初始化完成后,程序就运行在一个大循环中,此时,系统启动流程和功能代码并没有很严格的区分。 随着技术的发展,嵌入式系统变得越来越复杂,单片机(MCU)和系统级芯片(SoC)之间的差异也越来越明显。在早期的单片机时代,设备的处理能力有限,通常只需要执行一些简单的任务,如控制一个电机或者读取传感器数据。这些任务通常可以通过一个简单的程序循环来实现,不需要复杂的操作系统。

然而,随着SoC的出现,情况发生了变化。SoC通常包含多个处理器核心、图形处理单元(GPU)、数字信号处理器(DSP)、以及其他专用硬件模块,如网络接口、存储控制器等。这些复杂的硬件需要更高级的管理,以便它们能够协同工作,提供更丰富的功能。

系统引导程序(Bootloader)在SoC中扮演着至关重要的角色。它的主要任务包括:

  1. 硬件初始化:在系统上电后,引导程序首先需要初始化硬件,包括设置时钟、配置内存、初始化外设等。

  2. 安全启动:为了保护系统不被恶意软件攻击,引导程序会检查操作系统映像的完整性和合法性。

  3. 配置系统环境:设置系统运行所需的参数,如CPU工作模式、内存管理单元(MMU)配置等。

  4. 加载操作系统:将操作系统映像从存储设备(如闪存、硬盘)加载到内存中。

  5. 跳转到操作系统:一旦操作系统加载完成,引导程序会将控制权交给操作系统,让操作系统接管系统的控制。

这些操作系统或启动程序是由c或者c++等程序写成的,编译成.bin或者.hex文件,存储到非易失性存储器中,或者存储在外部存储设备上。这些文件被称为镜像文件(image)

BootROM和XIP

在系统初始化时,cpu只能访问可以直接寻址的存储器:

  1. 如果支持XIP启动方式,可被存储在片外可直接执行的介质中(如NOFLASH);

  2. 如果不支持XIP启动,则需要存储到芯片内部的ROM中,也就是最常见的BootROM;

在芯片出厂后该部分代码就将被固化,后续再也不能被修改和升级。若芯片要支持安全启动,则需要将BOOTROM作为启动时的信任根,此时除调试阶段外,SOC必须禁用XIP。

BOOT流程

一般情况下都会采用内部ROM的方式进行boot,如果内部ROM出问题了,可以采用XIP进行debug或者作为备份。

典型的boot流程一般分为:

First stage (BootRom)->Second Stage (u-boot/bare metal)

两个阶段。对不同的cpu架构,规定的boot流程规范是不同的。

ARM boot流程

ARM V8 Boot流程:

Armv8的启动流程包含多个阶段,典型地有BL1、BL2、BL31、BL32、BL33,根据需求的不同,这些阶段可以适当地裁剪或添加。

它们的源码会被编译成独立的启动镜像,并被保存到特定的存储介质中。由于一般的存储介质(如SPI Flash,nand flash、emmc、ssd等)都不支持代码的直接执行,因此需要在启动时先将镜像加载到可直接执行代码的存储介质,如SRAM中,然后运行相关代码。其典型的加载流程如下:

图片

在ARMv8架构中,启动流程包含多个阶段,这些阶段通常被称为BL(Bootloader)阶段:

  1. BL1:这是第一阶段的启动固件,通常位于ROM中,负责引导BL2并对其进行安全验证。

  2. BL2:第二阶段的启动固件,通常存储在Flash中,负责平台相关的初始化,比如内存(DDR)初始化,并寻找BL31或BL33执行。

  3. BL31:如果存在,BL2会加载BL31。BL31是持久存在的可信固件,负责系统安全服务和在安全与非安全世界之间切换。

  4. BL32(可选):通常包含OP-TEE OS和安全应用,运行在EL1,启动EL0的安全应用,完成后返回BL31。

  5. BL33:这是非安全世界的启动固件,通常是U-Boot或者直接启动Linux内核。

这里说明一下:

armv8架构分为Secure World和Non-Secure World(Normal World),四种异常级别从高到低分别为EL3,EL2,EL1,EL0。

安全世界与非安全世界:

  • Secure World:执行可信的固件和应用,如支付、指纹识别等。

  • Non-Secure World:运行常见的操作系统和裸机程序。

异常级别:

  • EL3:最高权限级别,负责安全监控和模式切换。

  • EL2:提供虚拟化支持。

  • EL1:特权模式,运行操作系统或安全OS。

  • EL0:无特权模式,运行应用程序。所有APP应用都在EL0。

完整的调用流程如下:

图片

ARM Trusted Firmware (ATF) 是为 ARMv8-A 架构设计的一套开源安全固件,它实现了从芯片启动到操作系统加载的整个过程中的安全启动要求。ATF 支持 ARM 的 TrustZone 技术,提供了Secure和Non-Secure执行环境之间的隔离。

BL2根据是否存在BL31和BL32可选择性的加载不同firmware,若系统需要支持Secure和Non-Secure两种执行状态,也就是支持ATF启动,则必须要从secure空间开始启动,且启动完成后需要通过secure monitor(BL31)完成normal os对secure空间服务相关请求的处理。

不支持ATF的启动

如果不支持ATF,那么阶段对应关系如下:

BL1: BootROM;

BL2: SPL(Secondary Program Loader),SPL在启动链中一般由bootrom加载而作为第二级启动镜像(bl2),它主要用于完成一些基础模块和ddr的初始化,以及加载下一级镜像uboot。

BL33:最常见的是u-boot;

这时候流程为:

图片

由于SPL需要被加载到SRAM中执行,对于有些sram size比较小的系统,可能无法放入整个spl镜像,TPL即是为了解决该问题引入的。

TPL: Tertiary Program Loader,三级加载器

加入了TPL之后,可将SPL的功能进一步划分为两部分,如SPL包含ddr初始化相关代码,而TPL包含镜像加载相关驱动,从而减少SPL镜像的size。此时启动流程可被设计为如下方式:

图片

支持ATF的启动

支持ATF的启动就是上面所述的完整的ARM V8启动流程:

图片

ATF启动uboot的典型镜像跳转流程如下:

图片

在以上流程中BL32是可选的,若不支持trust os则可裁剪掉该流程。典型情况下BL33为uboot,而BL2既可以使用ATF实现也可以用SPL实现。

ATF 还支持从 BL1 直接跳转到 BL31 的启动模式,这种方式可以加快启动速度,因为它跳过了 BL2 的加载过程。此外,ATF 还支持固件更新和恢复模式。

ATF 的启动流程是高度可定制的,不同的芯片厂商可能会根据自己的需求进行调整。

RSIC-V BOOT流程

先介绍一下RSIC-V的几种模式:

  1. M-mode(Machine Mode)

  2. S-mode(Supervisor Mode)

  3. U-mode(User Mode)

对比ARM架构如下:

图片

对于arm64来说,系统上电后启动会处于EL3 secure world ,所以对于arm64来说,一般都会使用ARM Trusted firmware (TF-A)  在normal world EL2 与 secure EL3  进行切换。

而对于risc-v来说,系统上电启动后会在M-Mode,而risc-v目前是没有Hypervisor这一层的概念的,所以目前采用的是opensbi。

启动流程:RISC-V的启动流程可能包括以下几个阶段:

  • ZSBL (Zeroth Stage Boot Loader):片上ROM程序。

  • FSBL (First Stage Boot Loader):启动PLLs和初始化DDR内存。

  • BBL (Berkeley Boot Loader):提供加载,并且管理着二进制接口(SBI)。

  • 操作系统加载:如Linux内核的加载和启动。

图片

操作系统启动

      当引导加载程序加载操作系统内核并将控制权移交给内核后,操作系统的启动过程正式开始。这个阶段包括内核初始化、硬件设备驱动程序初始化、挂载根文件系统以及初始进程启动。

用户空间初始化

     在操作系统内核成功启动后,系统进入用户空间初始化阶段。这包括启动脚本和服务、用户登录和图形界面的启动,为用户提供交互界面。

这两个部分主要涉及到软件,内容比较复杂,就不展开讨论。

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

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

相关文章

机器人的性能指标

1. 负荷能力 负荷能力负荷能力是指机器人在满足其他性能要求的情况下,能够承载的负荷重量。例如,一台机器人的最大负荷能力可能远大于它的额定负荷能力,但是达到最大负荷时,机器人的工作精度可能会降低,可能无法准确地沿着预定的轨迹运动,或者产生额外的偏差。机器人的负荷量与…

如何确定光纤用几芯 用光纤与网线区别在哪里

光纤用几芯? 光纤芯数,主要和光纤连接的设备接口和设备的通信方式有关。一般来说,光纤中光芯的数量,为设备接口总数乘以2后,再加上10%~20%的备用数量,而如果设备的通信方式有设备多…

Linux数据备份

1、Linux服务器中哪些数据需要备份 1)Linux系统重要数据: ①/root/目录,管理员家目录 ②/home/目录,普通用户家目录 ③/etc/目录 ,系统重要的配置文件保存目录 2)安装服务的数据:例apache①…

新160个crackme -070-CodeFantasy-crackme

运行分析 需破解用户名和注册码点击注册无反应 PE分析 Delphi程序,32位,无壳 静态分析&动态调试 ida找到关键字符串,进入函数 动态调试关键函数,逻辑:对Names进行sub_408A68函数加密得到v14,若v14与Ser…

<<迷雾>> 第5章 从逻辑学到逻辑电路(4)--或门及其符号 示例电路

info::操作说明 鼠标单击开关切换开合状态 系统中使用一个类似箭头的形状表示或门 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/cyjsjdmw-examples/assets/circuit/cyjsjdmw-ch05-13-or-gate.txt 原图

使用TiDB企业版Lightning导入ORC文件到TiDB

作者: 数据源的TiDB学习之路 原文来源: https://tidb.net/blog/818f84f0 TiDB Lightning 是用于从静态文件导入 TB 级数据到 TiDB 集群的工具,常用于 TiDB 集群的初始化数据导入。在开源社区版本中,TiDB Lightning 支持以下文件…

疾风大模型气象,基于大模型预测未来天气的探索

引言 天气预测一直是科学领域的重要课题,影响着农业、航空、交通等多个行业。传统的天气预报依赖于数值天气预报(Numerical Weather Prediction, NWP)模型,这些模型基于物理定律和历史数据来模拟大气运动。然而,随着数…

LUCEDA IPKISS Tutorial 74:布尔运算去掉部分图层

案例分享:通过布尔运算,将版图部分图层挖空 所有代码如下: from si_fab import all as pdk from ipkiss3 import all as i3 import numpy as npclass grating_coupler(i3.PCell):_name_prefix "grating_coupler"r i3.Positive…

Spring Task 2024/9/30

Spring Task是Spring框架提供的任务调度工具,可以按照约定时间自动执行某个代码逻辑。 作用:定时自动执行某段java代码。 cron表达式 在线Cron表达式生成器 (qqe2.com)👈在线生成网站 入门案例 SkyApplication 启动类 package com.sky;im…

对于 Vue CLI 项目如何引入Echarts以及动态获取数据

🚀个人主页:一颗小谷粒 🚀所属专栏:Web前端开发 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 1、数据画卷—Echarts介绍 1.1 什么是Echarts? 1.2 Echarts官网地址 2、Vue CLI 项目…

【LeetCode】每日一题 2024_10_1 最低票价(记忆化搜索/DP)

前言 每天和你一起刷 LeetCode 每日一题~ 大家国庆节快乐呀~ LeetCode 启动! 题目:最低票价 代码与解题思路 今天这道题是经典动态规划,我们定义 dfs(i) 表示从第 1 天到 第 i 天的最小花费,然后使用祖传的:从记忆…

ArduSub程序学习(11)--EKF实现逻辑⑤

状态更新和卡尔曼增益的计算我选择一个进行举例 1.SelectMagFusion SelectMagFusion 函数主要负责选择和处理磁力计(磁传感器)数据的融合过程。这在导航系统中尤为重要,因为磁力计用于提供航向(偏航角)的信息&#xf…

Hopcroft算法划分解释

//基于等价类的思想 split(S){foreach(character c)if(c can split s)split s into T1, ..., Tk }hopcroft()split all nodes into N, Awhile(set is still changes)split(s) 根据状态是否为终结状态划分为终结状态A,和非终结状态N 对这两个大集合,分别…

Acwing 组合计数

一个递推式: 从 a 个元素中选择 b 个,有多少种取法 C a b a ( a − 1 ) ⋯ ( a − b 1 ) 1 2 3 ⋯ b a ! b ! ( a − b ) ! C a − 1 b C a − 1 b − 1 从a个元素中选择b个,有多少种取法C_{a}^{b} \frac{a\times(a-1)\times\…

基础算法之双指针--Java实现(上)--LeetCode题解:移动零-复写零-快乐数-盛最多的水

这里是Thembefue 今天讲解算法中较为经典的一个算法 本讲解主要通过题目来讲解以理解算法 讲解分为三部分:题目解析 > 算法讲解 > 编写代码 移动零 题目链接: 移动零 题目解析 这题的题目意思还是比较好读懂的 就是将数组出现零的地方移到数组最后…

【SpringCloud】 统⼀服务⼊⼝-Gateway

统⼀服务⼊⼝-Gateway 1. ⽹关介绍1.1 问题1.2 什么是API⽹关1.3 常⻅⽹关实现ZuulSpring Cloud Gateway 2. 上手 1. ⽹关介绍 1.1 问题 前⾯的课程中, 我们通过Eureka, Nacos解决了服务注册, 服务发现的问题, 使⽤Spring Cloud LoadBalance解决了负载均衡的问题, 使⽤OpenFe…

使用 Seaborn 热图的 5 种方法(Python 教程)

如何计算 SHAP 特征贡献的概述 原文地址: https://mp.weixin.qq.com/s/nBb9oKlSzRW8w7widHJr6w 热图可以让你的数据变得生动。用途广泛且引人注目。在很多情况下,它们可以突出显示数据中的重要关系。具体来说,我们将讨论如何使用它们来可视化: 模型准确度的混淆矩阵时间序列…

如何从硬盘恢复丢失/删除的视频

您是否想知道是否可以恢复已删除的视频? 幸运的是,您可以使用奇客数据恢复从硬盘驱动器、SD 卡和 USB 闪存驱动器恢复已删除的视频文件。 你有没有遇到过这样的情况:当你随机删除文件以释放空间时,你不小心按下了一些重要视频的…

SysML案例-停车场

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>>

求职Leetcode题目(12)

1.只出现一次的数字 异或运算满足交换律 a⊕bb⊕a ,即以上运算结果与 nums 的元素顺序无关。代码如下: class Solution {public int singleNumber(int[] nums) {int ans 0;for(int num:nums){ans^num;}return ans;} } 2.只出现一次的数字II 这是今天滴…