转自:http://blog.csdn.net/radianceblau/article/details/73229005

http://www.aiuxian.com/article/p-1414261.html

http://www.xuebuyuan.com/2209890.html

对于嵌入式工程师了解芯片启动过程是十分有必要的,在分析、调试各种问题的时候都有可能涉及到这方面的知识。同时这部分知识也是比较复杂的,因为其中涉及到芯片内部架构,启动各个阶段软件代码执行顺序,启动模式等等。下面以比较常用的Qualcomm MSM8953芯片的启动过程为例,进行宏观分析(大部分翻译了高通的手册^-^),下一篇文章进行代码分析。

处理器核心

可以看到MSM8953中的处理器有5个,分别为:

1,  APPS           Cortex A53 core,运行android

2,  RPM(Resource Power Manager)      CortexM3 core,主要用于低功耗应用

3,  Modem(MSS_QDSP6)        高通自有指令集处理器,处理3G、4G通信协议等

4,  Pronto(WCNSS) 处理wifi相关代码

5,  LPASS        音频相关

对映下面芯片硬件结构图中各个处理器的框图来看就很清晰了。

启动相关image介绍

1,PBL(Primary Boot Loader)   位于rom中,是芯片上电后执行的真正第一行代码,在正常启动流程中会加载SBL1。如果启动异常会虚拟出9008端口用于紧急下载(短接板子上的force_boot_from_usb引脚(MSM8953 为gpio37)到1.8v可以强制进入紧急下载模式)。

2,SBL1(Second BootLoader stage 1) 位于eMMC中,由PBL加载,初始化buses、DDR、clocks等,会虚拟出9006端口,用于不能开机时dump ram

3,QSEE/TrustZone  安全相关,如fuse

4,DEVCFG OEM配置信息(如OEMLock)

6,  Debug Policy 调试相关

7,  APPSBL      即为BootLoader,目前使用LK(littlekernel)

8,HLOS(High LevelOperating System) 即为Linux/Android

9,Modem PBL  即为Modem处理器的PBL

10,MBA(Modem BootAuthenticator) Modem处理器启动鉴权

启动流程

1,  系统上电,使MSM8953从上电复位开始运行。

2,  在Cortex A53中运行的PBL会加载:

a,  从启动设备(如eMMC)加载SBL1 segment1到L2(即为TCM)

b,  加载SBL1 segment2到RPM处理器的RAM中。

3,  SBL1 segment1会初始化DDR,然后完成如下加载:

a,  从启动设备加载QSEE image到DDR

b,  从启动设备加载DEVCFG image到DDR

c,  从启动设备加载Debug Policy image到DDR

d,  从启动设备加载HLOS APPSBL image到DDR

e,  从启动设备加载RPMfirmware image到RPM的RAM中。

4,  SBL1移交运行控制权给QSEE。QSEE建立安全运行环境,配置xPU,支持fuse。

a,  SBL1运行在AArch32(译者注:名词相关知识见文末“附件介绍一”)模式,而QSEE运行在AArch64模式。为了切换到AArch64模式,SBL1会启动重映射器,操作RMR寄存器,然后触发warm-reset,QSEE就能够运行在AArch64模式了。

5,  QSEE通知RPM启动RPM 固件的执行。

6,  QSEE移交运行控制权给HLOS APPSBL。

a,  APPSBL只能在AArch32模式开始运行。

b,  这时AArch32的运行模式切换是在EL3/Monitor模式(译者注:名词相关知识见文末“附件介绍二”)完成的。通过查看APPSBL的ELF头能够得知其需要运行在32位指令集架构下。EL3/Monitor模式改变到32位模式,然后再启动APPSBL。

7,  APPSBL加载、验证kernel。APPSBL通过SCM调用改变到HLOS kernel需要的AArch64模式。这和之前LK直接跳转到kernel运行是不同的。

8,  HLOS kernel通过PIL加载MBA到DDR

9,  HLOS kernel对Hexagon modem DSP进行解复位。

10,Modem PBL继续它的启动。

11,HLOS kernel 通过PIL加载AMSS modemimage到DDR

12,Modem PBL验证MBA然后跳转到MBA。

13,HLOS通过PIL加载WCNSS(Pronto)image到DDR

14,HLOS对WCNSS(Pronto)进行解复位以便Prontoimage开始执行。

15,HLOS通过PIL加载LPASS image到DDR

16,HLOS对LPSAA进行解复位以便LPASSimage开始执行。

下面是流程的简化图,其中区分了AArch32和AArch64位的QSEE/TrustZone

关于eMMC和DDR的初始化时间问题

从上面的描述中已经可以看清,为避免迷惑,在分离出来看看:

1,PBL中是含有eMMC驱动的,有访问eMMC的能力,自身运行在MCU内部SRAM中。

2,除了PBL程序的img在MCU片内ROM外,其余img均存储在eMMC中。

3,PBL首先从eMMC加载SBL1到L2(内部缓存并非DDR),SBL1同样运行在片内SRAM。

4,有SBL1初始化DDR各种时序后,DDR自此可用(eMMC一直可用)

5,再由SBL1加载其余各个img到DDR,然后按照linux的正常顺序启动^-^....

附加介绍一:AArch64、AArch32

AArch64是ARMv8架构的一种执行状态。

为了更广泛地向企业领域推进,需要引入 64位构架。同时也需要在 ARMv8架构中引入新的 AArch64执行状态。AArch64不是一个单纯的 32位 ARM构架扩展,而是 ARMv8内全新的构架,完全使用全新的 A64指令集。这些都源自于多年对现代构架设计的深入研究。更重要的是, AArch64作为一个分离出的执行状态,意味着一些未来的处理器可能不支持旧的 AArch32执行状态。虽然最初的 64位 ARM处理器将会完全向后兼容,但我们大胆且前瞻性地将 AArch64作为在 ARMv8处理器中唯一的执行状态。我们在这些系统中将不支持 32位执行状态,这将使许多有益的实现得到权衡,如默认情况下,使用一个较大的 64K大小的页面,并会使得纯净的 64位 ARM服务器系统不受遗留代码的影响。立即进行这种划分是很重要的,因为有可能在未来几年内将出现仅支持 64位的服务器系统。没有必要在新的 64位架构中去实现一个完整的 32位流水线,这将会提高未来 ARM服务器系统的能效。这样回想起来, AArch64作为在 Fedora ARM项目中被支持的 ARM构架是一个很自然的过程: armv5tel、armv7hl、aarch64。新的架构被命名为:aarch64,这同 ARM 自己选择的主线命名方式保持一致,同时也考虑到了 ARM架构名与 ARM商标分开的期望。

ARMv8-A 将 64位架构支持引入 ARM架构中,其中包括:

  • 64 位通用寄存器、SP(堆栈指针)和 PC(程序计数器)
  • 64 位数据处理和扩展的虚拟寻址

两种主要执行状态:

  • AArch64 - 64 位执行状态,包括该状态的异常模型、内存模型、程序员模型和指令集支持
  • AArch32 — 32 位执行状态,包括该状态的异常模型、内存模型、程序员模型和指令集支持

这些执行状态支持三个主要指令集

  • A32(或 ARM):32 位固定长度指令集,通过不同架构变体增强部分 32 位架构执行环境现在称为 AArch32。
  • T32 (Thumb) 是以 16 位固定长度指令集的形式引入的,随后在引入 Thumb-2 技术时增强为 16 位和 32 位混合长度指令集。部分 32 位架构执行环境现在称为 AArch32。
  • A64:提供与 ARM 和 Thumb 指令集类似功能的 32 位固定长度指令集。随 ARMv8-A 一起引入,它是一种 AArch64 指令集。 
    ARM ISA 不断改进,以满足前沿应用程序开发人员日益增长的要求,同时保留了必要的向后兼容性,以保护软件开发投资。在 ARMv8-A 中,对 A32 和 T32 进行了一些增补,以保持与 A64 指令集一致。

附件介绍二:Exception Level

• ARMv8定义EL0-EL3共 4个Exception Level来控制PE的行为.

ELx(x<4),x越大等级越高,执行特权越高

执行在EL0称为非特权执行

EL2 没有Secure state,只有Non-secure state

EL3 只有Secure state,实现EL0/EL1的Secure 和Non-secure之间的切换

EL0 & EL1 必须要实现,EL2/EL3则是可选实现

Exception Level 与Security

Exception Level

EL0

Application

EL1

Linux kernel- OS

EL2

Hypervisor (可以理解为上面跑多个虚拟OS)

EL3

Secure Monitor(ARM Trusted Firmware)

Security

Non-secure

EL0/EL1/EL2, 只能访问Non-secure memory

Secure

EL0/EL1/EL3, 可以访问Non-secure memory & Secure memory,可起到物理屏障安全隔离作用

关于ARMv8架构的知识,推荐如下博客:

http://blog.csdn.net/forever_2015/article/details/50285865

linux驱动由浅入深系列:PBL-SBL1-(bootloader)LK-Android启动过程详解之一(高通MSM8953启动实例)的更多相关文章

  1. linux驱动由浅入深系列:高通sensor架构实例分析之二(驱动代码结构)【转】

    本文转载自:https://blog.csdn.net/radianceblau/article/details/73498303 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分 ...

  2. linux驱动由浅入深系列:高通sensor架构实例分析之三(adsp上报数据详解、校准流程详解)【转】

    本文转载自:https://blog.csdn.net/radianceblau/article/details/76180915 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分 ...

  3. (转)Linux 开机引导和启动过程详解

    Linux 开机引导和启动过程详解 编译自:https://opensource.com/article/17/2/linux-boot-and-startup作者: David Both 原创:LC ...

  4. Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)

    启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬 ...

  5. Linux启动过程详解

    Linux启动过程详解 附上两张图,加深记忆 图1: 图2: 第一张图比较简洁明了,下面对第一张图的步骤进行详解: 加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...

  6. Linux 开机引导和启动过程详解

    你是否曾经对操作系统为何能够执行应用程序而感到疑惑?那么本文将为你揭开操作系统引导与启动的面纱. 理解操作系统开机引导和启动过程对于配置操作系统和解决相关启动问题是至关重要的.该文章陈述了 GRUB2 ...

  7. linux 开机启动过程详解

    Linux开机执行内核后会启动init进程,该进程根据runlevel(如x)执行/etc/rcx.d/下的程序,其下的程序是符号链接,真正的程序放在/etc/init.d/下.开机启动的程序(服务等 ...

  8. Linux 启动过程详解

    目录 1. Linux启动过程 2. 启动过程概述 3. 引导加载阶段 4. 内核阶段 4.1 内核加载阶段 4.2 内核启动阶段 5. 早期的用户空间 6. 初始化过程 6.1 SysV init ...

  9. 11.Linux启动过程详解

    目录: 本文转载自:http://blog.csdn.net/miss_acha/article/details/50004717 经过对Linux系统有了一定了解和熟悉后,想对其更深层次的东西做进一 ...

随机推荐

  1. 一.MySQL安装

    版本:linux7.6 一.编译安装 1.下载epel源 [root@db01 ~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyu ...

  2. java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details

    Caused by: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Except ...

  3. element-UI表单验证

    转载自: 一.简单逻辑验证(直接使用rules) 实现思路 •html中给el-form增加 :rules="rules"•html中在el-form-item 中增加属性 pro ...

  4. vuex的学习和理解

    初识Vuex: vuex是 vue官方推荐的一个状态管理器,也是vue专用的一个插件.当我们遇到很多状态改变时,组件之间的通信就会变得复杂,这时候vuex的强大就体现出来了. Vuex 应用的核心就是 ...

  5. 小程序分享进入H5动态网页

    在要分享的界面加上这段代码 onShareAppMessage: function (options) { var that = this; // var return_url = that.data ...

  6. c++有关构造函数、析构函数和类的组合的一个简单例子

    来源链接 实验四(下) 代码 #include <iostream> using namespace std; enum CPU_Rank {P1 = 1, P2, P3, P4, P5, ...

  7. Python 进度条原理

    #进度条原理 import sys,time for i in range(50): sys.stdout.write("#")#标准输出 #若不能够按照时间一个一个依次显示,则代 ...

  8. JSON & XML

    什么是JSON? JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子 ...

  9. rocketMQ No route info of this topic 错误

    最近在使用rocketmq 发送消息,出现了No route info of this topic 异常,但奇怪的是我的其它的服务都可以成功发送,唯有crs服务不能成功发送,在网上搜索的解决方式基本上 ...

  10. excel 批量上传图片

    1.在excel中  输入公式  ="<table><img src=""D:\素材\"&A2&".jpeg&quo ...