uboot启动过程这部分,其实可以通过分析源码得到.我这里又增加了uboot启动之前的一部分过程.
就嵌入式来讲,我们只关心这一过程
上电,…,uboot第一阶段被加载至SRAM,…,uboot第二阶段加载内核到SDRAM.
从上电 到uboot第一阶段请参考 嵌入式启动顺序 - uboot之前
下面介绍的是uboot第一阶段到uboot第二阶段
系统启动的时候可以通过1->2->3->4,也可以通过1->3->4来达到引导内核启动
1/Uboot的第一阶段
执行块:uboot的第一阶段
大小:必须小于4KB(其实就是将uboot.bin文件从头开始截取的4KB大小的文件.至于是不是4KB,或许和sram的大小有关,我还不清楚.)
存放位置:多种可能.
可能1:类sram接口的Nor flash
可能2:SPI接口的Nor Flash
运行位置:多种可能.
可能1:类sram接口的Nor Flash中.
可能2:sram(也叫iram,也叫L2 Cache)
上序:多种可能.
可能1:索引代码.
可能2:bootImage
入口: start.S 中的 _start: b reset
出口: start_armboot(旧版本) 或者 board_init_r(新版本)
功能:
1.关看门狗
2.设置时钟
3.开ICACHE
4.初始化sdram
5.设置栈指针
6.初始化Nand Flash(如果后面需要Nand则初始化,不需要则不做)
7.重定位代码(将Flash中的代码拷贝到SDRAM中,分为Nand 和 Nor 两种)
8.清BSS段
9.设置PC为第二阶段的入口地址 start_armboot(旧版本) 或者 board_init_r(新版本)
下序:Uboot的第二阶段
其他1:这里面最最值得注意的是初始化sdram并初始化nandflash并读nandflash到sdram中.
其他2:
如果uboot存放在Nor,且从Nor启动,那么在SOC看来,0-4KB就是Nor的前4KB.(具体怎么引导,看具体芯片,仅做参考)
如果uboot存放在Nand,且从Nand启动,那么在SOC看来,0-4KB就是sdram的前4KB.(具体怎么引导,看具体芯片,仅做参考)
其他3:第一阶段最大可以为4KB,但是第二阶段在可以在前4KB.
其他4:
第一阶段并不具体几个文件,只要完成前面所述的功能,就属于第一阶段
在旧版本第一阶段对应代码的start.S文件 (arch/arm/cpu/armv7/start.S)
在新版本第一阶段对应start.S 及 arch/arm/lib/crt0.S
其他5:第一阶段操作的资源有片内资源和片外资源.
对于片内资源的话,需要写寄存器.
对于片外资源
SDRAM 写一系列SDRAM控制寄存器
Nand Flash 初始化(写寄存器,时钟方面) 读(时序)
Nor Flash 不用初始化 读(像内存一样读)
其他6:移植方面第一阶段考虑
1/SDRAM
2/Nand Flash
3/Nor Flash
4/时钟
其他7:
对于旧版本,从 start.S 通过调用 start_armboot 过度到了第二阶段(arm/lib/board.c).
对于新版本,从start.S 通过调用 _main 过渡到了 arch/arm/lib/crt0.S,然后 crt0.S 通过 调用 board_init_r 过度到了 arm/lib/board.c
2/Uboot的第二阶段
执行块:uboot的第二阶段
大小:300多KB
存放位置:多种可能.可能1:Nand Flash 可能2:Nor Flash
运行位置:sdram
上序:Uboot的第一阶段
入口: start_armboot 或者 board_init_r
出口: main_loop(进入交互模式) 或者 bootm(进入引导os模式,bootm不会返回) // 默认会进入引导os模式.
功能:
1.初始化串口
2.初始化网卡
3.初始化MMC
4.初始化其他模块
5.从Flash中将内核读入SDRAM
6.设置参数
7.执行 bootcmd 中 的命令
下序:内核(uImage)
其他2:这部分打印的最后一句为Starting kernel ...
其他3:将initrd加载到sdram.这一过程是怎么样的?和加载uImage一样
其他5:bootm 中一般有什么命令
1.下载uImage及其他文件(dtb,initrd)到内核
2.解析这些文件并启动
其他4:uImage前64KB是什么东西? 包括 Load addr 和 entry addr
其他5:移植方面第二阶段考虑
串口 网卡 MMC bootargs及bootcmd 变量的设定