嵌入式启动顺序 - uboot

版权声明:本文为博主原创文章,任何组织或者个人可以在任何媒介上发表或转载我的文章、图片等.且转载后必须注明出处和邮箱,博客地址(https://blog.csdn.net/u011011827),本人邮箱([email protected]) https://blog.csdn.net/u011011827/article/details/61927749

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 变量的设定

猜你喜欢

转载自blog.csdn.net/u011011827/article/details/61927749