一、背景分析
- 在进一步研究学习 linux 嵌入开发之前,先来了解一下树莓派的启动过程。
- 树莓派具有一款博通的 BCM2835 系统芯片, 当启动时,CPU 会处于复位状态,由 GPU 核心负责启动系统。
- 主要研究如下过程:树莓派上电 --> bootloader --> linux 内核
- 转载请标注出处,如果有问题,可以到我的文章中进行评论 [树莓派启动过程分析]
二、过程记录
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 和之前版本的。
4) 树莓派启动注意事项
-
SD 卡里的 boot 需要包含如下文件:
(1)overlays:存放设备树,必须有 (2)bcm2711-rpi-4-b:设备树文件 (3)bootcode.bin:第二阶段的bootloader,必须存在(4B除外) (4)fixup*.dat :链接器文件,与 start*.elf 文件匹配 (5)start*.elf :GPU基本固件,第三阶段启动器 (6)kernel.img :linux内核镜像,也可以为uboot,然后再进一步启动内核 (7)config.txt :该文件是启动过程第三阶段用来读取参数的。 (8)cmdline.txt :是树莓派原生系统启动时传给内核的参数
三、总结
- 完成时间:2022-03-29 14:00
- 经过分析树莓派启动的过程,有利于接下来的内核编译和替换操作。