#1 楼
固件是已编程到SoC(片上系统)处理器中的闭源专有代码,无法修改。上电后,固件将在SD卡上启动引导加载程序。我认为SoC固件不提供任何其他服务,因此它本身并不是真正的“ BIOS”(基本输入/输出系统)。在这之后,其他所有内容都将来自SD卡。根据Wiki的软件部分,引导顺序如下: >第一阶段引导程序-用于将FAT32引导分区挂载到SD卡上,以便可以访问第二阶段引导程序。它在RPi的制造过程中被编程到SoC本身中,并且用户无法对其进行重新编程。 SD卡,编程固件,然后启动GPU。另一个文件fixup.dat用于在GPU和CPU之间配置SDRAM分区。此时,CPU从复位释放,执行转移过来。
用户代码-这可以是任意数量的二进制文件之一。默认情况下,它是Linux内核(通常称为kernel.img),但也可以是另一个引导程序(例如U-Boot)或准系统应用程序。
评论
我只补充说第一阶段的引导加载程序是在SoC内部的小ROM上刻录的。如前所述,仅负责从SD卡加载bootcode.bin。这就是为什么无法从SD卡以外的媒体引导RaspberryPi的原因。
– Krzysztof Adamski
13年7月17日在18:38
@TevoD,不错的答案!我喜欢详尽的细节。
–德文·科利尔·约翰逊(Devyn Collier Johnson)
13年7月17日在19:26
#2 楼
@TevoD在他的回答中几乎是正确的-RaspberryPi使用封闭源固件二进制文件作为引导加载程序。当前版本可以在这里找到。构成固件的两个文件是bootcode.bin
(第二阶段引导加载程序)和start.elf
(GPU“固件”)。 RaspberryPi有趣且非常独特的地方是它从GPU
(图形芯片)开始,这是引导加载程序实际运行的地方。然后,GPU
启动ARM CPU
并运行Linux内核。 启动Linux后,不会卸载
GPU
上的代码。而是运行它自己的简单操作系统,称为VCOS
(Video Core Operating System
)。 Linux内核使用特殊的mailbox protocol
和中断(GPU可以产生ARM中断)与其服务进行通信。您可以在此处阅读有关用于framebuffer
的邮箱协议的一些信息。 GPU不仅负责图形事物-例如,它还控制时钟并产生音频。在这方面,可以将GPU固件视为与普通PC计算机中的BIOS
类似的东西。您可以在阅读RaspberryPi Linux内核驱动程序时找到更多信息。您还可以在此答案中找到更多信息。
评论
好点子。我正在考虑将BIOS问题明确地指代板载固件而不是SD卡,并添加了引导顺序以获取更完整的答案。您当然可以从那里开始。 +1
– Tevo D
13年7月17日在17:51
评论
BIOS会在启动之前存储一些软件来控制您的PC(示例设置硬盘,内存等)。 Pi不像PC那样使用“ BIOS”。它只是使用为该芯片编写的固件初始化Broadcom芯片(CPU,缓存,GPU),然后直接传递给操作系统。然后,操作系统将检测Broadcom报告的硬件和内存。这可以使启动真正快速,但是只有Broadcom知道如何动态调试或设置属性。