为什么我们需要嵌入式设备中的引导加载程序?

cha*_*inz 18 linux embedded arm bootloader

我在ARM cortex-A8上使用ELinux内核.

我知道引导加载程序的工作原理以及它正在做什么工作.但我有一个问题 - 为什么我们需要bootloader,为什么bootloader诞生了

为什么我们不能在没有bootloader的情况下直接从闪存中将内核加载到RAM中?如果我们加载它会发生什么?事实上,处理器不会支持它,但为什么我们遵循这个程序呢?

art*_*ise 14

在Linux环境中,引导加载程序负责某些预定义任务.由于这个问题是标记的,我认为ARM启动可能是一个有用的资源.具体来说,引导加载程序负责设置一个ATAG描述RAM数量,内核命令行和其他参数的列表.最重要的参数之一是机器类型.使用设备树,可以传递完整的电路板描述.这使得ARM Linux无法启动,无需使用一些代码来设置参数,如上所述.

这些参数允许一个通用 Linux支持多个设备.例如,ARM Debian内核可以支持数百种不同的板类型. Uboot或其他引导加载程序可以动态地确定此信息,或者可以对该板进行硬编码.

您可能还希望在堆栈溢出时查看引导加载程序信息页面.

基本系统可能能够设置ATAGSNOR闪存并将其复制到SRAM.但是,它通常比这复杂一点.Linux需要RAM设置,因此您可能必须初始化SDRAM控制器.如果你使用NAND闪存,你必须处理坏块,副本可能比复杂一点memcpy().

Linux经常有一些潜在的驱动程序错误,驱动程序会假设时钟已初始化.例如,如果Uboot总是初始化特定机器的以太网时钟,则Linux以太网驱动程序可能忽略了设置此时钟.对于时钟树来说尤其如此.

某些系统需要Linux不支持的引导映像格式; 例如,可以立即初始化硬件的特殊标头; 比如配置devices从中读取初始代码.此外,通常还有应立即配置的硬件; 一个引导装载程序可以很快做到这一点,而Linux的正常结构可以显著延缓这个导致I/O冲突,等等.

从实用的角度来看,使用引导加载程序更简单.但是,没有什么可以阻止你改变Linux的源代码直接从它启动; 虽然它可能就像将引导加载程序代码直接粘贴到Linux的开头一样.

另请参阅:Coreboot,UbootWikipedia的比较.BareboxARM的一个鲜为人知但结构良好且现代的引导加载程序. RedBoot也用于某些ARM系统; 内核树支持RedBoot分区.


Bar*_*icz 13

引导加载程序是一种计算机程序,它在完成自检后为计算机加载主操作系统或运行时环境.

^ 来自维基百科文章

所以基本上bootloader正在做你想要的 - 将数据从闪存复制到操作内存.这真的很简单.

如果您想了解有关提升操作系统的更多信息,我强烈建议您阅读链接文章.除了测试之外,引导阶段还包括检查外围设备和其他一些东西.跳过它们只对非常简单的嵌入式设备有意义,这就是为什么它们的引导加载程序更简单:

某些嵌入式系统不需要明显的引导顺序即可开始工作,并且当打开时可能只是运行存储在ROM中的操作程序.

相同的来源

  • 虽然*Wikipedia*文章很有用,但它主要关注PC(在更大意义上)引导加载程序.嵌入式/ ARM/Linux平台还有一些其他问题.嵌入式ARM的CPU具有减少组件数量的功能; 专门消除通常拥有PC BIOS的ROM/NOR闪存降低了成本.这部分是最相关的:http://en.wikipedia.org/wiki/Bootloader#Other_kinds_of_boot_sequences (5认同)

Fel*_*tti 5

主引导加载程序通常内置于芯片中,并执行将在系统中运行的第一个用户代码的加载。

引导加载程序的存在是因为没有用于加载第一个代码的标准化协议,因为它依赖于芯片。有时可以通过串行端口、闪存甚至硬盘驱动器加载代码。它是引导加载程序功能来定位它。

一旦用户代码被加载并运行,引导加载程序就不再使用,系统执行的正确性是用户的责任。

在嵌入式 linux 链中,主引导加载程序将设置并运行 Uboot。然后Uboot会找到linux内核并加载它。