您的位置:首页 > 其它

tiny 4412--boot loader的一生

2020-04-02 08:00 337 查看

活着,到底有什么意义?

程序总有一死,有的轻如鸿毛,有的重若泰山。

有一个程序,名 bootloader,它生于iROM,走过SRAM,消亡于DDR。

它开天辟地,创造了稳定的系统世界,它的一生,就是为了成就操作系统。

它是一个是一个高尚的程序,一个纯粹的程序,一个有道德的程序,一个脱离了低级趣味的程序,一个有益于人民的程序。

今天,我们就来看一看它,回顾一下它传奇的一生。

 

bootloader 存在的意义,在于初始化底层硬件,构建操作系统可正常执行的环境,引导操作系统运行。所以,说它开天辟地,并不为过,没有它,操作系统都启不来,你咋玩王者荣耀?咋吃鸡?

顺便说一下,bootloader有很多种,有vivi、grub、armboot、redboot、u-boot等,我们就用非常常见的 u-boot 来分析吧。

 

先来看一个这个世界的环境。

Exynos4412 的 memory map 里面,能够执行程序的空间就这么几段:

    从 0x0000_0000 ~ 0x0001_0000,有一段 64 KB 的 iROM。

    从 0x0202_0000 ~ 0x0206_0000,有一段 256KB 的 iRAM。

    从 0x4000_0000 ~ 0xA000_0000,是 1.5G 的 DRAM,这个需要初始化。

    从 0xA000_0000 ~ 0x0000_0000,是 1.5G 的 DRAM,这个需要初始化。

系统上电后,程序从哪里运行?怎么执行?

当上帝之手转动地球,当作为上帝的你按下电源键之后 ………………

资料告诉我们,

    1. 系统上电后,程序从 iROM 开始运行,iROM程序是三星固化在芯片里面的,没有源码,也没有bin文件,以资料的说法:It's a small and simple code。这段small and simple code在 0x0000_0000 ~ 0x0001_0000 执行。那这段号称又短小又简单的代码,做了什么呢?

    2. 这个短小又简单的代码,把BL1 image,从Booting device(这个可以是NAND flash, SD卡,emmc,USB,具体下面会讲到-问题1),加载到内部256K 的SRAM上执行,这段 BL1 代码,运行在 0x0202_0000 ~ 0x0206_0000。BL1又做了什么呢?

    3. BL1,初始化系统时钟,DDR等,然后,把操作系统,从 Booting device,加载到 DRAM,也就是上图中 0x4000_0000以后的空间,然后,跳到操作系统。

    PS:有的同学很疑惑,文字说明中,是有BL2(Second boot loader)的,图中,却没有?其实,BL2是可以没有的,如果有个BL2的话,那BL1,判断某些条件后,就会执行BL2,然后由BL2加载操作系统。接下会讲iROM,BL1,BL2的流程-问题2。

    总结起来,就是上电后,系统从iROM开始,执行iROM code,程序运行在 iROM(0x0000_0000 ~ 0x0001_0000);接下来,BL1运行,再接下来BL2运行(如果有的话),BL1,BL2的作用是初始化系统,诸如时钟,堆栈,DRAM,MMU等等,然后,加载操作系统,BL1运行在 SRAM(0x0202_0000 ~ 0x0206_0000);接下来,就是操作系统运行了,操作系统,运行在 DRAM(0x4000_0000以后)。

    这段从上电,到把操作系统加载到内存并运行的程序,就是大名鼎鼎的 bootloader,它的作用就是:初始化硬件,加载操作系统啊,加载完成后,bootloader的使命就完成了,生命周期也从此结束,往后,这个世界,就是操作系统的世界。

    我们了解它,从出生,到消亡的过程,可以更好地理解系统的运行机制,从而定制出,适合我们的世界。

上面有2个未解决的问题:

问题1:关于Booting device(这个可以是NAND flash, SD卡,emmc,USB)怎么选择。

    Booting device的选择,是通过 OM Pin来选择的,要看原理图,看下硬件是怎么连接的,一般,是通过拨码开关来选择的。选择 00010,就是从SD卡启动。

    2nd Device,的意思就是在 1rd Device 找不到 BL1 的话,就会从 2nd Device 去找。

问题2:iROM、BL1、BL2 流程。

iROM启动流程:固化在芯片 iROM 上,无法自己烧录或者修改。

    关看门狗(不然系统每隔一段时间会重启一次)-->关MMU-->关cache-->... ... ... --> GO BL1 自己看吧。

    其中,Get bootmode(OM pin),就是获得OM pin,从面选择 Booting Device 了,如果选择的是 SDMMC,就从 SDMMC 加载 BL1。

BL1的启动流程:三星提供的 Bin 文件,没有源码,不过有文档。

    其中,READ BL2 image from booting device,就是从 booting device 里读取 BL2,如果没有 BL2,就读取 OS。

BL2的启动流程:这个可以自己写,但 Exynos4412 POP封装的,还是三星提供的 bin 文件。

    设置时钟 --> 初始化 DRAM --> ... ... ... --> 加载 操作系统 -- > ... ... ... 跳转到 DRAM 操作系统执行,之后,bootloader从此消亡。

    其中,READ F/W or OS image from booting device,就是从 booting device 里读取 OS。

总结:iROM --> BL1 --> BL2 --> 启动OS,

当然,这过程中,有一些硬件设备需要初始化,诸如,DDR,MMU,串口、以及操作系统启动参数、启动操作系统等,所以,bootloader的源码,还是比较多的。

  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
zy_kxo 发布了1 篇原创文章 · 获赞 3 · 访问量 1368 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: