上一篇介绍了资源紧缺型嵌入式系统的启动过程,如今介绍资源宽裕型嵌入式系统的启动过程。
内存资源宽裕型操作系统一般都外挂SDRAM,而且CPU的计算能力都比較强,比如基于cortex A、MIPS 74k等核心的SOC。
下图是两种嵌入式系统架构的差别:
图1,对于资源紧缺型系统,内置flash和ram。
上电之前就已经通过烧写工具将代码写到内置flash(nor flas)。而iram用于data读写。
图2是资源宽裕型系统。其代码都放在外置存储介质中,如nand。sd卡等,包含引导OS的启动代码、OS、根文件系统和用户数据。
上电后的执行过程是:
1)irom中有第一阶段的启动代码,一般称为boot loader 0(BL0),其作用是为了引导nand flash中的启动代码到IRAM中,而nand flash中的启动代码是为了引导OS代码,称为BL1。
BL0上电执行。这时SDRAM尚未初始化,所以其须要将BL1搬到IRAM中执行。BL0的代码量比較小,主要是固化nand flash和card的读驱动代码。由于其要支持不同的启动介质。
因为受成本约束,IRAM也不可能非常大。那BL0搬BL1的大小通常是固定的,一定要小于IRAM大小。而引导OS的启动代码往往超过IRAM大小。所以引导OS的启动代码又再分为两部分,一般分是由BL0搬到IRAM,即BL1;剩下的一部分称为BL2。UBOOT就是这样。
2)BL0引导BL1到IRAM后,把控制权交给BL1。BL1初始化好SDRAM,接着将BL2搬到SDRAM。
3)BL1将控制权交给BL2,BL2接着引导OS,最后把控制权交给OS。
其实。为了支持不同的启动模式。如上电复位,看门狗中断,睡眠唤醒等等。在2)中,BL1会将自身BL1和BL2一起搬到SDRAM。可见BL1可能执行在IRAM中,也有可能执行在SDRAM中,一份代码仅仅有一个链接地址。怎么能够在两个不同的虚拟地址上执行呢?答案就是BL1一定是位置无关的,GCC编译选项是-fPIC。
接下来的博文会具体分析UBOOT的代码细节---基于S5PV210,欢迎关注。