Arm 覆盆子皮是如何制作的;什么是引导加载程序工作?

Arm 覆盆子皮是如何制作的;什么是引导加载程序工作?,arm,raspberry-pi,bootloader,Arm,Raspberry Pi,Bootloader,最近我开始研究嵌入式系统和嵌入式Linux。我知道,在嵌入式系统中,操作系统存储在闪存或ROM上。当它打开时,引导加载程序将操作系统加载到主内存中,使用Raspberry Pi,“闪存或ROM”是一个SD卡 所以,我一直在寻找树莓圆周率,因为我想用它开始练习,我对“启动”树莓圆周率的概念感到困惑。我的问题是Raspberry Pi使用什么引导加载程序,它是如何工作的?(也就是说,在内核之前会发生什么进程?head.o?main.c?(启动内核))这个进程已经被描述得非常透彻了,在网上找到它应该没

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


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

这个进程已经被描述得非常透彻了,在网上找到它应该没有问题

raspberry pi包含一个GPU和一个ARM处理器,这是两个独立的处理器。GPU首先出现,我假设是由片上rom或硬件驱动,读取sd卡以查找第一个引导文件bootcode.bin。就我们而言,GPU引导加载程序是未记录的,它将芯片带到某个点,然后加载另一个GPU程序的start.elf。gpu程序完成了芯片(ddr init)的启动,并最终加载kernel.img,这是ARM应用程序(不是ARM引导加载程序,而是linux中的应用程序),它直接将其加载到ram中,并执行普通引导加载程序所做的操作,以准备ARM引导linux(通常几乎没有),然后ARM引导

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

raspberry pi初创公司以其简单性和可移动非易失性存储(sd卡)的功能而著称,这让你回到了启动前的日子,在那里你会弹出ROM并擦除它们,它有一些痛苦,但有一些方法可以解决。到目前为止,可能有第三方复杂(uboot等)引导加载程序可用。拥有可移动闪存意味着您不需要复杂的引导加载程序,您不必担心用损坏的应用程序阻塞系统,您只需移除闪存并对其进行更改即可恢复。引导加载程序已经从避免移除介质成长为避免在编程或使用注定要焊接部件的电路板上的插座后不得不取消闪存和重新封装

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


我有一个非常简单的xmodem引导加载程序和一个设置jtag引脚的引导加载程序,这样您就可以使用jtag(这两种情况都是为了避免在开发应用程序时必须进行数百到数千次sd卡舞蹈)。还有一些问题,有些更复杂,甚至可能是一个有usb接口的问题,直到网络工作为止。

这里回答得很好:我投票结束这个问题,因为它属于,并且是()