前言
入手一个树莓派Raspberry 3B+后准备拿来当学习嵌入式Linux及深度学习边缘计算的板子,从BootLoader到Linux内核再到深度学习推理框架。本文主要是让树莓派启动Linux内核后开启一个命令行窗口,旨在了解系统启动过程。不用树莓派官方提供图形界面系统。中间走了很多坑,让我们一步步来捋一捋。

树莓派的启动流程分析
- 启动流程[1]
- First stage bootloader
树莓派上电后,SoC 中的 bootloader 首先被执行,其作用是挂载 SD 卡上的 FAT32 分区,从而加载下一阶段的 bootloader。这部分程序被固化在 SoC 的 ROM 中,用户无法修改。 - Second stage bootloader (bootcode.bin)
这个阶段的 bootloader 会从 SD 卡上检索 GPU 固件,将固件写入 GPU,随后启动 GPU。 - GPU firmware (start.elf)
本阶段中,GPU 启动后会检索附加配置文件(config.txt、fixup.dat),根据其内容设置 CPU 运行参数及内存分配情况,随后将用户代码加载至内存,启动 CPU。 - User code (kernel8.img)
通常情况下,CPU 启动后便开始执行 kernel8.img 中的指令,初始化操作系统内核,在某些情况下,也可以被 U-BOOT 代替,由 U-BOOT 来加载内核。在树莓派 1 代中,User code 部分被保存在 kernel.img 文件中,2 代中,该文件更名为 kernel7.img,3 代中,该文件更名为 kernel8.img - 官方的启动流程介绍链接
- First stage bootloader
- firmware文件介绍
SD卡里的boot文件可以在这里下载到官方最新的链接,包含如下文件:
| 文件 | 作用 |
|---|---|
| overlays | 存放设备树,必须有 |
| bcm2710-rpi-3-b-plus.dtb | 设备树文件,根据树莓派型号留一个对应dtb文件的即可 |
| bootcode.bin | 第二阶段的bootloader,必须存在 |
| fixup.dat | 官方介绍链接,GPU的Videocore固件。 |
| start.elf | 和fixup是成对使用的,用来GPU的内存 |
| kernel.img | 系统会先后搜寻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和之前版本的。 |
| config.txt | 如上面所说,该文件是启动过程第三阶段用来读取参数的。https://www.raspberrypi.org/documentation/configuration/config-txt/boot.md |
| cmdline.txt | 是树莓派原生系统启动时传给内核的参数,我们用uboot其实用不着这个 |
关于start.elf、fixup.dat文件的x、cd、db后缀的解释,大概是指定GPU使能功能和分配不同内存情况的。链接
start_x is the full firmware that includes camera and software codecs
It is enabled when start_x=1 is in config.txt
start_cd is the cutdown firmware that has no support for firmware hardware blocks like codecs and 3d
It is enabled when gpu_mem=16 is in config.txt
- 小结
开机后最先执行存

本文详述了树莓派3B+使用U-Boot替代官方系统,从BootLoader到Linux内核的启动流程。涵盖U-Boot与Linux内核的编译、配置、启动参数设置,以及通过TFTP、NFS实现远程内核加载与根文件系统挂载的过程。

1493

被折叠的 条评论
为什么被折叠?



