1) 树莓派上电启动
树莓派上电后,SoC 中的 第一启动程序 首先被执行,其作用是挂载 SD 卡上的 FAT32 分区,从而加载下一阶段的 bootloader。这部分程序被固化在 SoC 的 ROM 中,用户无法进行修改。
4B 在芯片内部增加了一块 EEPROM 来规避风险(由于 4B 硬件升级,导致启动过程较为复杂,如果将代码都写到 ROM 中,会增加复杂度以及引入可能的 BUG ),4B 上电运行 SPI 连接的 EEPROM 中的 bootloader 代码。
2) 树莓派执行 bootloader
在这个阶段,树莓派会加载 SD 卡上的 bootcode.bin
(bootloader
) 文件作为第二阶段的启动程序。bootloader
会启动GPU并加载第三阶段的启动器start.elf
。
需要注意,4B 上不使用 bootcode.bin
,因为它已由板载 EEPROM
中的启动代码替换。
3) 树莓派启动内核
start.elf
读取存放系统配置的文件 config.txt
,根据其内容设置 CPU 运行参数及内存分配情况,随后将用户代码加载至内存,启动 CPU;
CPU 启动后,加载内核进行启动。
系统会先搜寻 config.txt
中参数 kernel=xxx
指定的文件作为接下来接受系统控制权的对象,树莓派默认该文件是 linux 内核,我们可以替换为用 uboot
作为新一个 bootloader
然后之后再去启动 linux 内核。
如果 config.txt
里没指定 kernel
参数,则默认是先后搜寻 kernel8.img
、kernel8-32.img
、kernel7.img
、kernel.img
,分别对应 ARMv8-aarch64
、ARMv8-aarch32
、ARMv7
和之前版本的。