arm - Raspberry Pi 引导加载程序如何工作?

标签 arm raspberry-pi bootloader

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

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

最佳答案

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

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

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

树莓派启动的优雅之处在于它的简单性以及可移动非 volatile 存储(SD卡)的功能,它带你回到引导加载程序之前的时代,在那里你可以弹出ROM并删除它们,它有一些痛苦,但有一些方法可以解决这个问题。现在可能有第三方复杂的(uboot 等)引导加载程序可用。拥有可移动闪存意味着您不需要复杂的引导加载程序,您不必担心损坏的应用程序会使系统变砖,您可以通过简单地删除闪存并更改它来恢复。引导加载程序已经从避免移除介质发展到避免在编程或使用板上注定有焊接部件的 socket 后必须拆焊闪存和重新焊接。

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

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

关于arm - Raspberry Pi 引导加载程序如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16317623/

相关文章:

python - 使用 Python 从 MySQLdb 中提取条目

python - Raspberry Pi和Python(TKinter和Omxplayer)

assembly - UEFI 是如何工作的?

ARM Cortex-R4F、缓存和 MPU

gcc arm -- 确保使用内联 asm 语句内联函数时保留参数

optimization - GCC -mthumb 反对 -marm

android - 在汇编中编写 Android 应用程序部件

python - 是否可以确定性地设置 Debian 系统?

c - 从引导扇区到 C++ 内核

linux - 将 EFI 内存映射转换为 E820 映射