Bootloader的启动流程一般分为两个阶段:stage1和stage2,下面分别对这两个阶段进行讲解:
1.stage1
(1)完成基本的硬件初始化。初始化的工作主要包括屏蔽所有的中断、设置CPU的速度和时钟频率、RAM初始化、初始化LED、关闭CPU内部指令和数据cache等。
(2)为加载stage2准备RAM空间。为了更快执行速度,通常把stage2加载到RAM空间中来执行,因此必须为加载Bootloader的stage2准备一段可用的RAM空间范围。
(3)拷贝stage2到RAM中。确定stage2的可执行映像在固态存储设备的存放起始地址和终止地址以及RAM空间的起始地址。
(4)设置堆栈指针sp。这是为执行stage2的C语言代码做好准备。
2.stage2
(1)用汇编语言跳转到main入口函数
(2)为了实现更复杂的功能和取得更好的代码可读性和可移植性,stage2的代码通常用C语言来实现。在编译和链接bootloader时,不能使用glibc库中的任何支持函数。
(3)初始化串口、初始化计时器等硬件设备。在初始化这些设备之前、可以输出一些打印信息。
(4)检测系统的内存映射,所谓内存映射就是指在整个4GB物理地址空间中有指出哪些地址范围被分配用来寻址系统的RAM单元。
(5)加载内核映像和根文件系统映像,这里包括规划内存占用的布局和从Flash上拷贝数据。
(6)设置内核的启动参数。
U-Boot的目录及存放原则
board
和一些已有开发板有关的文件,比如Makefile和U-Boot.lds等都和具体开发板的硬件和地址分配有关。
common
与体系结构无关的文件,实现各种命令的C文件
cpu
CPU相关的文件,其中的子