本文主要介绍树莓派的上电启动流程,从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