由于bootloader的实现依赖于CPU的体系结构,因此大多数的bootloader都分为stage1和stage2两大部分:依赖于CPU体系架构的代码同城携程短小精悍的汇编代码,放在stage1中,为了实现更复杂功能的代码都使用C语言,方便移植和读,一般放在stage2中。具体的启动过程如下:
1、stage1中的动作:
硬件设备初始化;
为加载stage2准备RAM空间;
复制stage2到RAM中;
初始化堆栈;
跳转到stage2的c入口。
实现的功能:硬件初始化:屏蔽了bootloader启动过程中的所有中端,设置cpu的速率和时钟,完成RAM初始化,关闭CPU内部指令和数据缓存。
复制stage2到RAM,设置堆栈指针sp,跳转到c入口 。
2、stage2中的动作:
初始化本阶段需要使用的硬件;
检测系统内存映射;
复制内核和根文件系统到RAM中;
设置内核启动参数;
调用内核。
实现的功能:硬件初始化:初始化串口;
加载内核镜像;
设置内核启动参数;
调用内核:CPU寄存器设置:R0=0;R1=机器类型ID;R2=启动参数标记列表在RAM的起始地址;
CPU模式设置:禁止中断(IRQ和FIQ),是CPU处于SVC模式;
MMU和缓存的设置:必须关闭MMU和数据缓存,指令缓存可以自主选择。