系列文章目录
前言
一、什么是BootLoader?
在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行,是嵌入式系统开发过程中不可逾越的一步。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由Boo Loader来完成。 uboot就是bootloader的一种,全称Universal Boot Loader。
第一阶段使用汇编来实现,它完成初始化的CPU体系结构,并调用第二阶段的代码;
第二阶段则通常使用C语言实现,这样可以实现更复杂的功能,而且代码会有更好的可读性和可移植性
Make menuconfig图形化界面配置内核,把编译后的uboot烧写到SD卡,插到板子上,和主机交互。只有BL2是可以改变的,我们写的裸机代码放到BL2这部分.
二、BL0的作用
芯片上电后肯定会从0x0这个地址开始跑
M3芯片它开始跑程序的时候是直接从 main开始跑吗?先跑的启动文件(start.s)
exynos芯片的0地址对应的IROM64KB IROM是掉电不丢失的存储介质 这里面的这个存储空间是用户不能访问的空间
这个64KB的空间存储的有一定的程序
三星提供了IROM里面的代码(不开源你看不到的)
这段代码干嘛用的呢?
1:判断硬件的启动方式
2:去不同的启动方式的启动设备里面加载BL1
三、BL1的作用
1、BL1的说明
BL1存放在外部的存储介质的
说白点BL1需要我们下载存储介质里面
BL1干的事情比较多也比较复杂
这一部分代码是三星提供的二进制文件
它是不开源的
只有二进制文件
2、BL1的作用
- 硬件设备初始化
- 使ARM芯片进入超级管理权限SVC
- 关闭中断,关看门狗
- 设置CPU的速度、时钟频率及终端控制寄存器
- 复制BL2到RAM空间中
- 分配堆栈空间,设置堆栈指针;
- 清零 BSS 数据段
- 跳转到第二阶段代码的C入口函数。
四、BL2的作用
1、BL2的说明
BL2这个阶段可以是用户写的代码
BL2两种情况:
1:小于14KB的时候
BL2全部加载到256KB SRAM
2: 当BL2大于14KB的时候
BL2会把前14KB放到 256KB SRAM
BL2会把 14KB之后的内容全部搬运
1GB的DDR3-RAM
2、BL2的作用
- 重新进入SVC模式
- 初始化本阶段要使用的硬件设备
- 检测系统内存映射
- 将内核映像和根文件系统映像从FLASH上读到RAM空间中
- 为内核设置启动参数
总结
BL0 BL1 我们动不了,改不了。
BL2 我们可以动
普及:ARM的启动过程
- 向量表定义
- 地址重映射及中断向量表的转移
- 堆栈初始化
- 设置系统时钟频率
- 中断寄存器的初始化
- 进入C应用程序