树莓派启动过程
镜像构成
使用 buildroot 编译出来的树莓派镜像为 sdcard.img,其构成如下:
硬件构成
- 博通 BCM2837B0 SoC,集成四核 ARM Cortex-A53(ARMv8)64 位 @ 1.4GHz CPU,集成博通 Videocore-IV GPU
- 内存:1GB LPDDR2 SDRAM
- 有线网络:千兆以太网(通过 USB2.0 通道,最大吞吐量 300Mbps)
- 无线网络:2.4GHz 和 5GHz 双频Wi-Fi,支持 802.11b/g/n/ac
- 蓝牙:蓝牙 4.2 && 低功耗蓝牙(BLE)
- 存储:Micro-SD
- 其他接口:HDMI,3.5mm 模拟音频视频插孔,4 x USB 2.0,以太网,摄像机串行接口(CSI),显示器串行接口(DSI),MicroSD卡座,40pin扩展双排插针
- 尺寸:82mm x 56mm x 19.5mm,50克
启动过程
为了降低成本,树莓派省区了传统计算机用来存储引导加载程序的板载存储器(BIOS),直接把引导程序放在了 SD 卡中。
树莓派 3B+ 具有一款博通的 BCM2837B0 系统芯片,当启动时,ARM Cortex-A7 的 CPU 会处于复位状态,由 Videocore-IV GPU 负责启动系统,所以大部分 boot 的启动都是由 GPU code 来完成的,而不是 CPU。
- 第一阶段,从系统芯片中加载第一阶段的启动程序,这个启动程序负责挂载在 SD 卡中的 FAT32 的文件系统(boot.vfat),从而让它可以启动第二阶段的 boot(bootcode.bin),这个第一阶段的启动程序是写死在芯片中的,不能修改。
- 第二阶段,bootcode.bin 则用来从 SD 卡上检索 GPU 固件(start.elf),然后运行它,从而启动 GPU。
- 内核加载,start.elf 启动后,读取存放系统配置的文件 config.txt,当 config.txt 文件被加载解析之后,start.elf 会读取 cmdline.txt 和 zImage。cmdline.txt 包含内核运行的参数,而 zImage 将会被加载到处理器分配的共享内存中,当内核加载成功,处理器讲结束复位状态,内核开始正式运行,系统启动正式开始。
由于这种写死的程序加上从 SD 卡开始引导,这就让树莓派不会因为软件的原因变成砖头,除非硬件损坏。
GPU bootloaders
目前的 GPU 软件和固件都是二进制的文件,Raspbian 可以通过 apt-get 来升级,rip-update 也是最简单用来升级的方式,当然最新版本难免少不了一些 bug,所以推荐还是使用稳定版本。
而目前的树莓派的 GPU bootloader 是不开源的,所以不是像普通的是由 CPU 的 bootloader 来启动。
而且由于树莓派的启动核心是 VideoCore IV,是属于博通的 Broadcom BCM2837B0 这块芯片,是只供树莓派使用的,所以树莓派基本没有假的(想仿冒,但拿不到博通的这块芯片,只好无奈了),也造成了基于树莓派核心显卡的程序是无法移植到其他的芯片上去的。同时由于树莓派的这种启动方式,导致了树莓派不是一个裸机 ARM,就会出现了无法像单片机一样直接对树莓派编程,也需要其核心引导之后进入系统才行。
参考
树莓派3B+评测——不被辜负的等待? - 电路城 (cirmall.com) 硬件介绍
开源硬件平台全新简介 (2) Raspberry Pi “树莓派”(下): 问题与总评 博通芯片专供树莓派基金会,别人无法仿制,Datasheet 不开源,显卡程序闭源。迫于热销,后来逐渐开源部分 Datasheet 和 GUP 相关文档代码。 博通,你要摁着多少资源自己专属?