ARM Linux的启动流程大致分为:BootLoader->Kernel->Rootfs->Application。
此处记录一下BootLoader的启动过程:
BootLoader的主要任务就是将内核映象读到 RAM 中,然后跳转到内核的入口去运行,即开始启动操作系统。BootLoader需要根据硬件来调整代码,通用性差。多阶段BootLoader一般都是stage1和stage2两个阶段的启动过程:
stage1(汇编实现)
进入SVC模式,屏蔽所有的中断
中断屏蔽可以通过写 CPU 的中断屏蔽寄存器或状态寄存器来完成(CPSR寄存器)。
设置 CPU 的速度和时钟频率
RAM 初始化
包括正确地设置系统中内存控制器的功能寄存器以及内存( Memory Bank )的控制寄存器等。
关闭 CPU 内部的指令/数据 Cache
拷贝stage2到RAM
分配stage2地址空间范围,测试RAM可用性,清空这段RAM,拷贝stage2。
设置堆栈指针sp
通过trampoline跳转stage2 main函数入口。
stage2(C实现)
初始化硬件设备
初始化串口设备,计时器,flash等。
检测系统内存映射
把CPU预留的RAM地址空间的一部分映射到RAM单元中,其余部分未使用。
加载映像
从flash上拷贝内核和rootfs。
设置内核启动参数
内核参数(页面大小、根设备等)、内存映射情况、命令行参数、initrd映像参数(大小、起始地址)、Ramdisk参数(解压后大小)。
调用内核
跳转到内核的第一条指令处。