注:这篇译文出自十多年前的树莓派1代资料,也适用于树莓派2代、3代。树莓派4B增加了EEPROM,启动过程稍有不同。
这是从各种来源收集的Raspberry Pi启动过程的详细说明,主要来自官方论坛。首先,你需要知道RPi不像传统的台式电脑那样启动。VideoCore(即图形处理器)实际上在ARM CPU之前启动!在开始详细介绍之前,这里有一个RPi的简图,突出显示了Broadcom BCM2835 SoC。
SoC(或片上系统)包含ARM CPU、VideoCore图形处理器、ROM(只读存储器)芯片、SDRAM和许多其他东西。基本上,可以将SoC视为主板和CPU压缩到单个芯片中。
当打开Raspberry Pi电源时,运行的第一个代码段存储在SoC的ROM芯片中,并在制造过程中内置到Pi中!这个被称为first-stage bootloader(第一阶段启动载入程序)。SoC被硬连线启动一个小的RISC Core(精简指令集核芯)上运行该代码。它用于在SD卡中挂载FAT32启动分区,以便可以访问second-stage bootloader(第二阶段bootloader)。那么,SD卡中存储的“第二阶段bootloader”是什么?它就是“bootcode.bin”。如果您在Windows中安装了SD卡,您可能已经看到了这个文件。
现在,这里有一个棘手的问题。第一阶段bootloader尚未初始化您的ARM CPU(意味着CPU处于复位状态)或RAM。因此,第二阶段bootloader也必须在GPU上运行。bootloader.bin文件被加载到GPU的128K 4路组相联L2缓存中,然后执行。这时启用了RAM并加载了start.elf,它也在您的SD卡中。这个是third-stage bootloader(第三阶段bootloader)并且也是最重要的。它是GPU的固件,这意味着它包含设置,或者在我们的例子中,它包含从config.txt中加载设置的指令,config.txt也在SD卡中。你可以把config.txt看作是“BIOS设置”(正如论坛中提到的那样)。您可以控制的一些设置是:
arm_freq : ARM 频率(MHz),缺省值700.
gpu_freq : 一起设置 core_freq, h264_freq, isp_freq, v3d_freq.
core_freq : GPU processor core频率(MHz),缺省值 250.
h264_freq: hardware video block频率(MHz),缺省值 250.
isp_freq: image sensor pipeline block频率(MHz),缺省值 250.
v3d_freq: 3D block频率(MHz),缺省值 250.
sdram_freq: SDRAM 频率(MHz),缺省值 400.
start.elf 还会在 GPU 和 ARM CPU 之间分隔 RAM。 CPU只能访问 GPU 地址空间留下的地址空间。例如,如果 GPU 被分配了0x000F000 – 0x0000FFFF的地址,则 CPU只能访问 0x00000000 – 0x0000EFFF 的地址。(这些不是真实的地址范围。这只是为了演示目的)。ARM内核识别的物理地址实际上是由VideoCore的MMU(内存管理单元)映射到VideoCore中的另一个地址(0xC0000000及以上)。在分割完成后,config.txt被加载,因此您无法在config.txt中指定分割数量。然而,SD卡中存在具有不同分割的不同.elf文件。因此,根据您的要求,您可以重命名这些文件以启动.elf并启动Pi。(论坛提到以动态方式实现此功能,在8/7/2014编辑时已经在当前的固件中实现) 在Pi中,GPU是王者!
除了加载config.txt和分割RAM,start.elf还会加载cmdline.txt(如果存在)。它包含要加载的任何内核的命令行参数。这使我们进入了引导过程的最后阶段。start.elf最终加载kernel.img,这是一个包含OS内核的二进制文件,并释放CPU上的复位线。然后ARM CPU执行kernel.img中的任何指令,从而加载操作系统。
启动操作系统后,GPU代码并未卸载。事实上,start.elf不仅仅是GPU的固件,它是一个名为VideoCore OS的专有操作系统。当正常操作系统(Linux)需要一个它无法直接访问的元素时,Linux会使用邮箱消息系统与VCOS进行通信。