现在的位置: 首页 > 技术文章 > Tiny4412专区 > 裸机程序 > 正文

Exynos 4412的启动过程分析

2014年10月22日 裸机程序 ⁄ 共 2580字 ⁄ 字号 评论 18 条 ⁄ 阅读 7,881 次

做实验时我们是把 bin 文件烧入SD卡,比如前面做的汇编流水灯实验。

问:是谁把这些指令从 SD 卡读出来执行?

答:是固化在芯片内部ROM上的代码---它被称为iROM ,iROM是厂家事先烧写在芯片上的,无源码。

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

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

汇编流水灯程序中我们通过mkbl2工具制作的BL2,当时也做了比较详细的讲解,执行如下命令:


./mkbl2 leds_on.bin bl2.bin 14336

 

iROM 、BL1更细致的启动过程如下图所示(摘自Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf):

(1) iROM :下图是 iROM 启动流程图

iRom Booting

iRom Booting

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

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

OM select boot device

OM select boot device

我们整个裸机教程都是从外部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 的启动过程

BL1 Booting

BL1 Booting

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

 

有几个问题需要解决:

① 在启动设备上哪个位置存放 BL1、BL2?

② 把BL1 BL2 读到 iRAM哪个位置?

③ BL1 、BL2 大小是多少?

④ 怎么保证 BL1 、BL2 程序的完整性(即读出程序时没有错误 )?

假设启动备为 SD 卡, 如下图所示(这里只分析SD卡启动):

BL1、BL2在SD卡上的存储位置

BL1、BL2在SD卡上的存储位置

BL1、BL2在iRam中的存储位置

BL1、BL2在iRam中的存储位置

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》,下面会附上下载地址。

文件下载

目前有 18 条留言    访客:10 条, 博主:8 条

  1. 消灭星星 2014年10月22日 上午11:42  @回复  Δ-49楼 回复

    很技术的文章


    • 管理员
      techbulo 2014年10月22日 下午7:47  @回复  ∇地下1层 回复

      记录一下学习中的问题

  2. 每日邮报 2014年10月22日 下午8:21  @回复  Δ-48楼 回复

    继续学习中~~~


    • 管理员
      techbulo 2014年10月24日 下午4:44  @回复  ∇地下1层 回复

      老兄的支持是我的动力啊~~ 😛

  3. valeev 2014年12月09日 下午9:20  @回复  Δ-47楼 回复

    您好,最近在看4412的裸机,学习了你的博客,这篇文章中说自己写BL1我比较感兴趣,因为一般用的都是三星提供的BL1.按照你上面说的那个文件头16个字节,我写了个简单的LED电灯,添加了文件头,但是系统起不来,希望能向你请教


    • 管理员
      techbulo 2014年12月10日 上午9:51  @回复  ∇地下1层 回复

      自己写BL1这一个实验我还没有做,现在还是用的三星提供的BL1,等做到那一节我再联系你,交流一下意见。 😀

      • valeev 2014年12月10日 上午9:53  @回复  ∇地下2层 回复

        好的,我这边有一个别的厂商写的修改头16字节的工具,不过没有开源,原理也没有弄懂,不过确实不是跟210那样的头16字节定义了,有时间可以一起研究一下,你留一下联系方式,我发给你

      • CC 2015年07月15日 下午1:45  @回复  ∇地下2层 回复

        您好!请问一下,你把LED.bin文件烧录到了SD卡里,那你的Uboot是烧到了什么地方?


        • 管理员
          techbulo 2015年08月09日 下午12:15  @回复  ∇地下3层 回复

          现在是裸机开发,还没上U-BOOt

          • cjf 2015年08月27日 下午4:39  ∇地下4层

            期待uboot烧写


          • 管理员
            techbulo 2015年09月22日 下午9:58  ∇地下4层

            会慢慢更新到的

  4. eddy 2015年04月26日 上午3:38  @回复  Δ-46楼 回复

    很好的文章,对我很有帮助谢谢!

  5. 蜗牛 2015年09月22日 下午10:11  @回复  Δ-45楼 回复

    博主抓紧更新啊~ 等着看下边的 😛

  6. 荷兰网 2015年09月28日 上午9:46  @回复  Δ-44楼 回复

    不错的文章,内容十全十美.禁止此消息:nolinkok@163.com

  7. 海子 2017年05月16日 下午8:39  @回复  Δ-43楼 回复

    看了邦飞的视频,说了一堆,还是没有这篇文件写得清楚,几句话就把启动过程讲清楚了, 😀

给我留言

留言无头像?



×