学习Exynos4412启动流程前,我们先看看三星4412芯片启动框图:

我们从图中可以看到4412内部有64K的ROM和256K SRAM,在ROM中已经固化好了一段代码,当硬件上电后首先运行的就是这段代码,这段代码三星起名为BLO(iROM BOOT 代码)。其作用是初始化SRAM,并将eMMC中256k代码拷贝到SRAM中,进行初始化DRAM。在图中我们很清楚看到这一个运行过程。

1、在芯片的iROM中已经固化一个代码,当硬件上电后就读取OM电平从而确定硬件设置的启动模式:0110为从eMMC启动,1000位SD卡启动;

2、把已经设置启动存储单元代码复制到内部RAM中并跳转到RAM运行;

3、运行OS;

一、iROM

iROM把启动设备上特定位置处的程序读入片内存 (iRAM) ,并执行它。这个程序被称为 BL1(Bootloader 1) ,BL1 是三星公司提供的,无源码。

BL1又把启动设备上另一个特定位置处的程序读入片内内存,并执行它。这个被称为 BL2(Bootloader 2) ,是我们编写的源码。

下图是 iROM 启动流程图:

由上图可以看出,首先关闭看门狗,关闭中断及MMU,关闭数据缓存,打开指令缓存,清除TLB,然后将其他核进入IDLE模式,只留CPU0,这里有了第一个跳转分支,IROM判断当前启动模式,是冷启动还是唤醒,如果是唤醒模式,那么就是直接跳转到BL1,在BL1里面我们会再次判断是否是唤醒模式,如果是就直接跳转到唤醒函数,一般都是linux内核的唤醒句柄。当然在裸机里都是冷启动的,休眠唤醒一般是不需要关注的,当然如果你的裸机程序需要支持休眠唤醒,就需要增加相应的代码了。

继续分析,设置IRQ及SVC模式的栈空间,这个时间,栈地址是其内部的一片IRAM,这小片RAM是IROM运行的外部随机存储器,没有这片小内存,IROM是无法运行的。接下了就是初始化IROM里面所使用的各种变量,初始化只读数据段,未初始化数据段清零,导出部分核心函数,这个函数可以在BL1中使用,获取当前复位的状态,设置系统时钟分频,获取OM管脚配置模式,这里可以从多种外设启动,具体启动模式如下表:

简单地说,iROM就是先设置程序运行环境 (比如关看门狗、关中断、关MMU 、设置栈 、设置栈 、启动 PLL 等 );然后根据OM引脚确定启动设备 (NAND Flash/SD 卡/其他 ),把 BL1 从里面读出存入iRAM;最后启动 BL1 。

二、BL1 

下图是 BL1 的启动过程

单地说,也是设置程序运行环境(初始化中断、设置栈等 );然后从启动设备上把 BL2读入iRAM;最后启动它。

三、SD卡作为启动方式

BL1 位于SD卡偏移地址 512字节处(即从第一个扇区开始,前面有一个扇区保留,每个扇区512字节,为什么保留第一个扇区,如果有同学对DOS分区表有过研究,就能明白其中的道理了,第一个扇区是分区表的配置区),iROM从这个位置读入8K 字节的数据,存在iRAM地址 0x02021400位置处。 所以 BL1不能大于8K 。

IROM计算校验和且验证通过后并解密BL1成功后就可以跳转到BL1了,至此IROM已执行完备,权限已交由BL1了,补充说明一下,解密BL1是加密模式启动时才需要的,非加密模式启动是无需解密BL1的。

BL2 位于 SD 卡偏移地址 (512 +8K)字节处,BL1从这个位置读入14K 字节的数据,存在iRAM 地址 0x02023400 处。 BL2 不能大于(14K – 4) 字节,最后 4字节用于存放较验码(在汇编流水灯试验中我们用mkbl2工具制作的BL2,其中mkbl2工具最主要的作用就是计算出校验码)。

如果我们的程序大于 (14K – 4) 字节,那么需要截取前面 (14K – 4) 字节用来制作BL2并烧入SD卡偏移地址 (512 +8K) 字节处。当BL2启动后,由它来将存放在SD卡另外位置的、完整程序读入内存。

Exynos4412启动过程分析相关推荐

  1. 嵌入式linux启动过程分析,嵌入式Linux裸机开发(二)——S5PV210启动过程分析

    嵌入式Linux裸机开发(二)--S5PV210启动过程分析 一.iROM启动方式简介 友善之臂Smart210开发板的SoC为三星S5PV210,S5PV210采用iROM启动方式进行启动,通过查阅 ...

  2. OpenWrt启动过程分析+添加自启动脚本【转】

    一.OpenWrt启动过程分析 转自: http://www.eehello.com/?post=107 总结一下OpenWrt的启动流程:1.CFE->2.linux->3./etc/p ...

  3. pixhawk PX4FMU和PX4IO最底层启动过程分析

    摘要: pixhawk PX4FMU和PX4IO最底层启动过程分析1.1 主处理器和协处理器的固件烧写和运行流程首先,大体了解PX4IO 与PX4FMU各自的任务.PX4IO(STM32F100)为P ...

  4. linux 重定位arm,Arm linxu启动过程分析(一)

    本文着重分析 FS2410 平台 linux-2.6.14 内核启动的详细过程,主要包括: zImage 解压缩阶段. vmlinux 启动汇编阶段. startkernel 到创建第一个进程阶段三个 ...

  5. linxu 启动过程分析

    linxu 启动过程分析 Linux启动过程如下:当用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备(通常是硬盘)启动,接着启动设备上安装的引导程序lilo或grub开始引导Linux ...

  6. 开机SystemServer到ActivityManagerService启动过程分析

    开机SystemServer到ActivityManagerService启动过程 一 从Systemserver到AMS zygote-> systemserver:java入层口: /*** ...

  7. AliOS Things的启动过程分析(一)

    AliOS Things的启动过程分析(一) 在本篇文章中,我们以developerkit开发板为例,介绍AliOS Things的启动过程.AliOS Things支持多种工具链进行编译链接的方式生 ...

  8. Chromium的GPU进程启动过程分析

    Chromium除了有Browser进程和Render进程,还有GPU进程.GPU进程负责Chromium的GPU操作,例如Render进程通过GPU进程离屏渲染网页,Browser进程也是通过GPU ...

  9. Android开发入门教程2-Android init 启动过程分析

    Android init 启动过程分析   分析android的启动过程,从内核之上,我们首先应该从文件系统的init开始,因为 init 是内核进入文件系统后第一个运行的程序,通常我们可以在linu ...

最新文章

  1. 播客#47:劳伦斯·布拉德福德
  2. python数据逆透视_PIVOT(透视转换)和UNPIVOT(逆透视转换)
  3. MySQL------Navicat安装与激活
  4. oracle 只读同名词,Oracle创建只读用户,授予视图/同义词/会话权限
  5. selecte设置不可用使用disabled属性注意
  6. AIX 磁盘和文件系统
  7. 封装一个邮件发送工具类,一个字,巴适
  8. 如何保证交叉表编译器和目标系统版本一致_嵌入式系统词汇表
  9. ICPC程序设计题解书籍系列之八:(美)斯基纳等:《挑战编程-程序设计竞赛训练手册》
  10. kafka安装完整步骤_还在寻找Kafka最新的安装教程吗?精细的安装步骤分享给大家...
  11. 【linux就该这么学】-09
  12. java d打字游戏_Java实现打字游戏
  13. 不装插件,查看.rp文件
  14. 【电脑突然识别不了外置光驱】
  15. java程序员怎么创建自己的网站:第四章:做个网站引入广告赚点小钱
  16. 扒一扒迅雷的代码结构
  17. 利用卷积神经网络(CNN)构造社区问答系统
  18. Python global的用法
  19. OpenCV配置(利用Source编译,并配置扩展库opencv_contrib)
  20. poi 宋体_(六)POI-操作Excel的poi的字体设置

热门文章

  1. 雷军:互联网思维本质上就是群众路线
  2. linux 内核配置过程中遇到的问题
  3. java 控制jsp_JSP学习之Java Web中的安全控制实例详解
  4. kfc流程管理炸薯条几秒_炸薯条成为数据科学的最后前沿
  5. leetcode1267. 统计参与通信的服务器(dfs)
  6. Docker初学者指南-如何创建您的第一个Docker应用程序
  7. python 删除重复字符_Google面试问题指南:使用Python删除重复出现的字符
  8. MyBatis-Plus入门Demo详解
  9. C# PagedList 真分页
  10. 了解Linux操作系统发展阶段