Raspberry Pi的启动加载程序如何工作?

时间:2013-05-01 11:51:50

标签: arm raspberry-pi bootloader

最近我开始研究嵌入式系统和嵌入式Linux。我知道在嵌入式系统中,操作系统存储在Flash或ROM中。当它打开时,引导加载程序将操作系统加载到主存储器中,而使用Raspberry Pi,“flash或ROM”是SD卡。

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

1 个答案:

答案 0 :(得分:16)

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

raspberry pi包含一个GPU和一个ARM处理器,两个独立的处理器。 GPU首先出现,我假设由片上ROM或硬件驱动,读取SD卡寻找第一个引导文件bootcode.bin。就我们而言,GPU引导加载程序没有记录,它将芯片提升到一定程度,然后加载start.elf另一个GPU程序。那个gpu程序完成了启动芯片(ddr init)并最终加载了kernel.img这是ARM应用程序(不是arm bootloader而是linux中的应用程序),它将它直接加载到ram中并执行正常的bootloader会做什么准备好手臂启动linux(通常几乎没有),然后手臂启动。

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

raspberry pi初创公司的简洁性以及可移动非易失性存储(SD卡)的功能非常优雅,它可以让您回到引导前的日子,在那里你可以弹出roms并擦除它们,它有一些痛苦,但有办法解决这个问题。到目前为止,可能有第三方复杂(uboot等)引导程序可用。拥有可移动闪存意味着您不需要复杂的引导加载程序,您不必担心使用损坏的应用程序来破坏系统,只需移除闪存并进行更改即可恢复。 Bootloader已经从避免移除介质成长,避免在编程之后拆除闪存和重新焊接,或者在预定有焊接部件的电路板上使用插座。

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

我有一个非常简单的xmodem引导程序和一个设置jtag引脚的程序,因此您可以使用jtag(这两种情况都可以避免在开发应用程序时跳过数百到数千次的SD卡)。还有其他一些,一些更复杂,甚至可能有一个网络工作的USB。