Exynos 4412的启动过程分析[2]
做实验时我们是把 bin 文件烧入SD卡,比如前面做的汇编流水灯实验。
问:是谁把这些指令从 SD 卡读出来执行?
答:是固化在芯片内部ROM上的代码---它被称为iROM ,iROM是厂家事先烧写在芯片上的,无源码。
iROM把启动设备上特定位置处的程序读入片内存 (iRAM) ,并执行它。这个程序被称为 BL1(Bootloader 1) ,BL1 是三星公司提供的,无源码。
BL1又把启动设备上另一个特定位置处的程序读入片内内存,并执行它。这个被称为 BL2(Bootloader 2) ,是我们编写的源码。
个人总结:
iROM(出厂已经烧写好)将BL1读到片内iRAM并运行它,在运行BL1的时候又把BL2读到了片内,也运行了BL2。
iROM→BL1→BL2
iROM原本就在片内;
BL1,BL2从片外到片内;
Personal summary:iROM(The factory has a good programmer) do BL1 read above chip iRAM and run it. When running BL1,BL1 start up BL2,and run it.
persönliche Zusammenfassung:iROM(Die Fabrik hat eine gute Programmierer)BL1 lesen Sie die Innenlage und führen Sie es iRAM,Im Vorfeld wieder, wenn BL1 BL2 ausgelesen Chip,Auch laufen die BL2.
在汇编流水灯程序中我们通过mkbl2工具制作的BL2,当时也做了比较详细的讲解,执行如下命令:
./mkbl2 leds_on.bin bl2.bin
iROM 、BL1更细致的启动过程如下图所示(摘自Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf):
(1) iROM :下图是 iROM 启动流程图
由上图可以看出,首先关闭看门狗,关闭中断及MMU,关闭数据缓存,打开指令缓存,清除TLB,然后将其他核进入IDLE模式,只留CPU0,这里有了第一个跳转分支,IROM判断当前启动模式,是冷启动还是唤醒,如果是唤醒模式,那么就是直接跳转到BL1,在BL1里面我们会再次判断是否是唤醒模式,如果是就直接跳转到唤醒函数,一般都是linux内核的唤醒句柄。当然在裸机里都是冷启动的,休眠唤醒一般是不需要关注的,当然如果你的裸机程序需要支持休眠唤醒,就需要增加相应的代码了。
继续分析,设置IRQ及SVC模式的栈空间,这个时间,栈地址是其内部的一片IRAM,这小片RAM是IROM运行的外部随机存储器,没有这片小内存,IROM是无法运行的。接下了就是初始化IROM里面所使用的各种变量,初始化只读数据段,未初始化数据段清零,导出部分核心函数,这个函数可以在BL1中使用,获取当前复位的状态,设置系统时钟分频,获取OM管脚配置模式,这里可以从多种外设启动,具体启动模式如下表:
我们整个裸机教程都是从外部SD卡启动,根据OM启动模式,从SD卡拷贝前8K代码,如果拷贝成功,就验证校验和,BL1的前16个字节就是提供给IROM用来标识BL1相关信息的,具体信息如下(后面的教程我们会自己写一个BL1,现阶段先用三星提供的):
/*
* bl1 header infomation for irom
*
* 0x0 - bl1 size
* 0x4 - reserved (should be 0)
* 0x8 - check sum
* 0xc - reserved (should be 0)
*/
.word 0x2000
.word 0x0
.word 0x0
.word 0x0
首先是描述BL1的大小,然后还有一个BL1的校验和,那我们怎么知道BL1的校验和呢,这个是在编译生成最终的二进制文件后,通过mk4412程序制作的
简单地说,iROM就是先设置程序运行环境 (比如关看门狗、关中断、关MMU 、设置栈 、设置栈 、启动 PLL 等 );然后根据OM引脚确定启动设备 (NAND Flash/SD 卡/其他 ),把 BL1 从里面读出存入iRAM;最后启动 BL1 。
(2) BL1 :下图是 BL1 的启动过程
简单地说,也是设置程序运行环境(初始化中断、设置栈等 );然后从启动设备上把 BL2读入iRAM;最后启动它。
有几个问题需要解决:
① 在启动设备上哪个位置存放 BL1、BL2?
② 把BL1 BL2 读到 iRAM哪个位置?
③ BL1 、BL2 大小是多少?
④ 怎么保证 BL1 、BL2 程序的完整性(即读出程序时没有错误 )?
假设启动备为 SD 卡, 如下图所示(这里只分析SD卡启动):
BL1、BL2在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卡另外位置的、完整程序读入内存。
对于其他启动设备,可以参考 《Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf》,下面会附上下载地址。
(1)BL0:是指S5PV210的iROM中固化的启动代码
作用:初始化系统时钟,设置看门狗,初始化堆和栈,加载BL1
(2)BL1:是批在iRAM自动从外扩存储器(nand/sd/usb)中拷贝的uboot.bin二进制文件的头最大16K代码
作用:初始化RAM,关闭Cache,设置栈,加载BL2
(3)BL2:是指在代码重定向后在内存中执行的uboot的完整代码
作用:初始化其它外设,加载OS内核
(4)三者之间的关系:(Interal ROM固化代码)BL0将BL1(bootloader的前16KB--BL1)加载到iRAM;BL1然后在iRAM中运行将BL2(剩下的bootloader)加载到SDRAM;BL2加载内核,把OS在SDRAM中运行起来,最终OS是运行在SDRAM(内存)中的。
原文:
http://www.techbulo.com/1335.html
参考:
http://www.cnblogs.com/Ph-one/p/4282124.html
http://www.cnblogs.com/Ph-one/p/4547395.html
瘋耔
2015/08/21
----------
Exynos 4412的启动过程分析[2]的更多相关文章
- 如何在Ubuntu下使用TF/SD 卡制作Exynos 4412 u-boot启动盘
/** ****************************************************************************** * @author Maox ...
- 如何在Mac下使用TF/SD 卡制作Exynos 4412 u-boot启动盘
/** ****************************************************************************** * @author Maox ...
- jLink V8调试exynos 4412 u-boot的几点补充
/** ****************************************************************************** * @author Maox ...
- Exynos 4412
Exynos 4412采用了三星最新的32nm HKMG工艺,是三星的第一款四核处理器 1.启动 有时间再接着写……
- X-002 Exyson4412芯片启动过程分析
移植u-boot到FriendlyARM Tiny4412开发板上,首先我们需要对Samsung Exyson4412芯片的启动方式.系统时钟初始化.串口初始化.内存初始化以及开发板的内存地址空间分配 ...
- ASP.Net Core MVC6 RC2 启动过程分析[偏源码分析]
入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢? .NET Web Development and Tools Blog ASP.NE ...
- Exynos 4412 Uboot源码解析
原文地址:http://www.cnblogs.com/jacklu/p/6226330.html Exynos 4412 Uboot的汇编代码就不贴了,没有的可以私信我. 这是我当时阅读代码时的思维 ...
- 开机SystemServer到ActivityManagerService启动过程分析
开机SystemServer到ActivityManagerService启动过程 一 从Systemserver到AMS zygote-> systemserver:java入层口: /** ...
- Neutron分析(2)——neutron-server启动过程分析
neutron-server启动过程分析 1. /etc/init.d/neutron-server DAEMON=/usr/bin/neutron-server DAEMON_ARGS=" ...
随机推荐
- Centos 6.5 配置nginx服务
官方网站:http://nginx.org最新版本:1.7.11官方文档:http://nginx.org/en/docs/ 一.安装NGINX查看当前centos版本: #cat /etc/redh ...
- L001-老男孩教育-Python13期VIP视频-19节-pbb
L001-老男孩教育-Python13期VIP视频-19节-pbb Windows上安装 Python3开发环境 下载:www.python.org >选择Downloads>All re ...
- VS2010 常见错误总结
错误一:“此时无足够的可用内存,无法满足操作的预期要求,可能是由于虚拟地址空间碎片造成的,请稍后重试” 安装VS2010补丁:http://xiazai.jb51.net/201007/tools/V ...
- DTCMS视频模版更改,
1.去掉style.css中视频的高度 .video-box{ position:relative; width:100%; height:473px; _clear:both; _display:i ...
- Laravel Homestead安装教程
1/先在https://www.vagrantup.com 下载vagrantup ,对应平台下载,并安装,安装后可以在命令行使用vagrant https://www.vagrantup.com/ ...
- jquery Loading图片延迟加载特效
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [大牛翻译系列]Hadoop(1)MapReduce 连接:重分区连接(Repartition join)
4.1 连接(Join) 连接是关系运算,可以用于合并关系(relation).对于数据库中的表连接操作,可能已经广为人知了.在MapReduce中,连接可以用于合并两个或多个数据集.例如,用户基本信 ...
- php版获取重定向后地址的代码分享
如何获取重定向的地址呢?我们用php实现这样的功能,分享下我的代码,有需要的朋友参考下. 代码如下: <?php //取重定向的地址 class RedirectUrl{ //地址 var $u ...
- 监听EditText
0.得到焦点的时候,作一些处理 public class AbcActivity extends Activity implements OnFocusChangeListener{ @Overrid ...
- 深层次详解Exception
所有的异常类都继承自System.Exception类,当异常产生时,CLR将创建该异常类的实例对象,将从最底层依次寻找合适的异常类型,同时若存在catch语句时将会选择最合适的语句进行处理. cat ...