13

最近开始研究嵌入式系统和嵌入式Linux。我知道在嵌入式系统中,操作系统存储在 Flash 或 ROM 上。当它打开时,引导加载程序将操作系统加载到主内存中,对于 Raspberry Pi,“闪存或 ROM”是一张 SD 卡。

所以,我一直在寻找 Raspberry Pi,因为我想开始练习,但我对“引导”Raspberry Pi 的概念感到困惑。我的问题是 Raspberry Pi 使用什么引导加载程序,它是如何工作的?(即内核之前发生了哪些进程head.o???main.c(启动内核))

4

1 回答 1

18

这个过程已经被描述死了,你在网上找到它应该没有问题。

树莓派包含一个 GPU 和一个 ARM 处理器,两个独立的处理器。GPU首先出现,我假设由读取SD卡的片上ROM或硬件驱动,以寻找第一个引导文件bootcode.bin。就我们而言,该 GPU 引导加载程序没有文档记录,它将芯片启动到一个点,然后加载 start.elf 另一个 GPU 程序。该gpu程序完成启动芯片(ddr init)并最终加载作为ARM应用程序的kernel.img(不是arm引导加载程序,而是linux中的应用程序),它将其直接加载到ram中并执行普通引导加载程序会做的事情准备 arm 以启动 linux(通常几乎什么都没有),然后 arm 启动。

传统的引导加载程序是指您只有一个处理器,该处理器也将运行应用程序/操作系统。像 redboot 和 uboot 这样的名字,但这些已经变得非常复杂,操作系统本身。启动 linux 只需要很少的时间,在 ram 中放入一些 ATAG 并设置几个寄存器,就是这样(当然,在你启动了系统/ram 等之后,它不需要太多代码,但是 delecate/difficult例如 ddr 的代码),较新的 linux 需要设置更多的东西,但不会太多。

树莓派初创公司的简洁性和可移动非易失性存储(sd 卡)的特性非常优雅,它可以让你回到引导加载程序前的时代,在那里你可以弹出并擦除它们,它有一些这些痛苦,但有办法解决。到目前为止,可能有第三方复杂的(uboot 等)引导加载程序可用。拥有可移动闪存意味着您不需要复杂的引导加载程序,您不必担心应用程序损坏导致系统变砖,您只需移除闪存并对其进行更改即可恢复。引导加载程序已经从避免移除媒体发展到避免在编程或使用注定有焊接部件的板上的插座后必须拆下闪存和重新焊接。

现在的 kernel.img(在某一时刻被加载到 0x00000000)加载到 0x8000。这就是您需要知道的全部内容,它是您将与引导加载程序一起使用的普通内核映像。然后,您可以编写任何您想要的裸机或其他程序/应用程序,只要将地址 0x8000 链接为二进制文件的开头和起点。如果你想使用异常,你需要以某种方式编写异常表(有多种方法可以做到这一点)。对此的替代方法是有一个传统模式设置,您可以使用可选文件 config.txt 进行配置,它将 kernel.img 加载到 0x0000,就像 rpi 的早期一样。就我个人而言,我使用现在默认的 0x8000,其他裸机人员采用另一条路径......

我有一个非常简单的 xmodem 引导加载程序和一个设置 jtag 引脚的引导加载程序,以便您可以使用 jtag(这两种情况都是为了避免在开发应用程序时必须使 sd 卡跳舞数百到数千次)。还有其他一些,有些更复杂,甚至可能有一个 USB 连接到网络工作的点。

于 2013-12-14T15:05:33.223 回答