本文主要介绍树莓派的上电启动流程,从bootloader加载到内核启动。
This article mainly introduces the power-on startup process of Raspberry Pi, from bootloader loading to kernel startup.
树莓派上电启动大体可以分为4个阶段。
STAGE1.固化代码执行
一般的嵌入式设备的时候,都是有固定的第1行代码的启动策略。比如在NORFLASH里装载bootloader,板子上电后固定从0地址运行NORFLASH,然后再由这段代码去初始化CPU、SDRAM等,最后再加载内核、根文件系统到内存,实现系统启动。
而树莓派也是类似的,不过树莓派上电时首先运行的是GPU、由这个GPU去读取ROM里的出厂固化的代码,然后去运行。
对于树莓派2B而言,BCM2836的soc组成如下,没有从博通的官网找到数据手册,大致是下面这回事情。这个芯片包含了一个VideoCore IV的GPU和Cortet A7的ARM核。

STAGE2.运行bootcode.bin
第一阶段执行完毕后,GPU开始去加载SD卡第一个FAT分区根目录下载bootcode.bin文件,由于这个文件是GPU运行的代码,博通并没有开源。
STAGE3.运行start.elf
紧接着,GPU会读取SD卡第一个FAT分区根目录下的start.elf文件,很不幸,这个文件的代码也是不开源的。
STAGE4.加载运行
GPU读取SD卡第一个FAT分区根目录中的kernel.img(Linux 内核) 到内存,然后启动CPU运行内核。
参考文献
[1] https://www.jianshu.com/p/93d339418e04
[2] 开源VideoCore IV的启动固件https://github.com/librerpi/rpi-open-firmware