目录
1、开发板启动相关部件
2、开发板启动过程(以 EMMC 启动为例)
(1) 运行 BL0(初始化)
(2) 加载 uboot 引导程序
(3) 加载 linux 镜像、设备树、根文件系统
3、SD卡的存储结构
1、开发板启动相关部件
下面是一个简单的开发板局部部件示意图:
(1) BL0
存放在CPU内部IROM中的一段固化代码,这段程序是在芯片出厂的时候就已经设置好了的,一般是初始化软硬件,如内存初始化。
(2) 拨码开关
可用于控制开发板的启动状态。开关拨到不同的位置对应着不同的启动状态,如SD卡启动、EMMC启动等。
(3) EMMC
EMMC 相当于硬盘,断电不丢失,后续的系统移植都是保存到EMMC中。
(4) RAM
随机存储器,对于CPU而言,无论是 EMMC 还是 SD卡都属于外部存储设备,CPU无法直接访问到这些设备。因此,访问这些外部设备的任务就交给了内存,也就是这里的RAM。
总的来说,RAM 先从外部加载文件内容,CPU 再从 RAM 读取数据。
(5) SD卡
默认情况下,开发板是EMMC启动,但是如果EMMC中没有uboot程序,此时若要启动开发板,需要依赖SD卡中的uboot程序来启动。
2、开发板启动过程(以 EMMC 启动为例)
(1) 运行 BL0(初始化)
BL0是存放在CPU内部IROM中的一段固化代码,开发板在启动的时候会先运行BL0,随后会读取拨码开关的启动状态,后续开发板就知道是以哪种方式启动。
(2) 加载 uboot 引导程序
uboot 程序是一段引导程序,它会告诉CPU后续要做哪些事情,所以在完成初始化以后的第一件事就是加载 uboot 程序。
- SD卡启动:BL0会把SD卡中的uboot程序读取到内存,然后运行uboot
- EMMC启动:BL0会把EMMC中的uboot程序读取到内存,然后运行uboot
(SD卡 和 EMMC 终归属于外存,CPU无法访问外存,只有加载到内存,CPU才能访问)
(3) 加载 linux 镜像、设备树、根文件系统
uboot 会依次把linux、dtb、roofs从EMMC加载到内存
- linux(linux系统的上层代码、驱动代码,即软件部分)
- dbt(设备树,保存了硬件设备信息)
- rootfs(根文件系统,并不属于内核,本质是文件,linux在运行的时候可能会要用到一些文件,根文件系统中就保存了linux运行所需的文件)
linux + dtb 才是一个完整的linux内核(对上提供系统调用接口,对下控制硬件运作),rootfs 其实就是我们所看到的各种文件,如 usr、bin、et,这些目录下保存了linux内核运行时会用到的二进制执行文件、配置文件。
3、SD卡的存储结构
上述开发板其实也可以使用SD卡启动,使用SD卡启动时,SD卡中需要保存引导程序 uboot 以及 uboot 运行时所需的三个文件(linux镜像、设备树文件、根文件系统)。SD卡一般分为多个扇区,每个扇区 512 字节,存储uboot程序时应从第一扇区开始存储,随后BL0检测到SD卡启动时,默认是把第一扇区以后的内容加载到内存。
零扇区存储分区表,从第一扇区开始存储uboot程序