iROM:64K片内ROM,初始化基本系统的功能(ROM中的代码运行需要一定sram),如:堆栈、时钟、加载BL1到SRAM。
BL1存储在启动设备上,BL1初始化系统时钟,DRAM控制器、加载OS到DRAM。(由三星提供)(初始化SOC,芯片级别)
BL2:初始化平台(开发板级别),不由三星提供。
BootLoader需要完成以下功能:
初始化RAM:因为 Linux 内核一般都会在 RAM 中运行,所以在调用 Linux 内核之前 bootloader 必须设置和初始化 RAM,为调用 Linux内核做好准备。初始化 RAM 的任务包括设置 CPU 的控制寄存器参数,以便能正常使用 RAM 以及检测RAM 大小等。
初始化串口:一般的 bootloader 都会在执行过程中初始化一个串口做为调试端口。
检测处理器类型:并保存在寄存器r1中,提供给内核。
设置Linux启动参数:将参数保存在内存中,并以列表的形式顺序存储,存储地址保存在R2中。
调用Linux内核镜像:跳转到Linux内核的第一条代码之前必须满足以下条件: CUP的寄存器必须满足以下条件:r0=0,r1=处理器类型,r2=标记列表在 RAM中的地址。
Bootloader分为两个部分,第一部分是汇编代码且不做压缩,第二部分是C代码且有压缩的。Bootloader开始执行时,第一部分汇编代码先负责初始化CPU、PLL、DDR、Cache等硬件,让CPU和内存能够稳定运行,然后解压第二部分的Image,并拷贝到到内存执行。第二部分C代码完成串口、flash、网口等驱动的加载,并构建一个shell环境来接受用户输入。注意,在整个Bootloader运行其间CPU的MMU是没有被初始化的,所有的地址访问都是采用物理地址直接访问的。
SD卡启动:
SD中内容和文件布局:
内部SRAM的地址映射和存储内容:
BL1 位于SD卡偏移地址 512字节处(即从第一个扇区开始,前面有一个扇区保留,每个扇区512字节,为什么保留第一个扇区,如果有同学对DOS分区表有过研究,就能明白其中的道理了,第一个扇区是分区表的配置区),iROM从这个位置读入8K 字节的数据,存在iRAM地址 0x02021400位置处。 所以 BL1不能大于8K 。