第二阶段引导加载程序的需要是什么?为什么需要不同的引导加载程序,例如第一阶段和第二阶段?

10

我知道第一阶段的引导装载程序会进行基本硬件初始化,并调用第二阶段的引导装载程序,例如u-boot。但是我仍然不明白为什么我们需要多个阶段的引导装载程序。

为什么我们不能只有一个引导装载程序,在其中闪存单个映像以初始化硬件?如果只有一个引导装载程序阶段直接加载内核映像,会有什么缺点呢? 为了更清晰地说明,我正在使用ARM CORTEX A8开发Beagle Bone Black,在引导区域中放置MLO、U-Boot和内核映像,据我所知,第一阶段引导装载程序初始化外部RAM,其中复制了U-Boot,它又初始化了更多的外设,那为什么我不能直接选择内核映像而不使用第二阶段的引导装载程序呢?


很抱歉,您来到了错误的网站。 - Ahmed Salman Tahir
@AhmedSalmanTahir - 不,这是正确的网站,但在提供目标系统的详细信息之前,这个问题很难回答。 - Chris Stratton
3个回答

6
可能有几个原因。 也许您的平台对引导加载程序的大小有限制?这是时间和灵活性之间的权衡。您需要一个非常基本的引导加载程序来加载更复杂的引导加载程序。
例如,您可能希望从文件系统加载操作系统。处理文件系统的代码可能不适合于您的第一个引导加载程序,但是加载第二个引导加载程序的代码适合。您可以将所有文件系统代码放在第二个引导加载程序中,以便您拥有更多的灵活性,并让第一个引导加载程序来加载它。
另一个原因可能是可升级性。引导加载程序并不完美,可能存在漏洞。您可以将第一阶段引导加载程序配置为加载第二阶段引导加载程序和一些恢复实用程序。然后,您可以将第一阶段引导加载程序放入ROM中,永远不再触碰它。如果您发现漏洞,只需升级第二阶段引导加载程序即可。如果您砖化了系统,则仍然可以使用第一个引导加载程序进行恢复。
这还可以让您稍后将新功能包含到第二个引导加载程序中(如果您想要的话)。

我正在使用BeagleBone Black,每次启动时都需要将MLO、uboot和内核映像放置在引导分区中。 - Pradeep G

3
在Beaglebone Black中使用的AM3359芯片,第一阶段实际上是由内部64KiB引导ROM执行的。根据从SYSBOOT配置位读取的值,它将尝试从各种可能的源加载MLO并开始执行它-请参阅AM335x技术参考手册的第26章。
从这个点开始,如果您不想使用事实上的标准u-boot引导程序,那么没有任何东西可以阻止您编写自己的MLO / u-boot-spl等效项,该项将初始化SDRAM并加载内核,前提是代码和数据都适合于内部128KiB SRAM。
这可能可以通过重复使用最少量的u-boot代码来完成,或者如果这仍然是太多的代码,则可以使用AM3359Starterware库中的C编写功能等效的代码,或者在绝望情况下使用ARM汇编代码。
使用thumb2指令集有助于进一步减小此引导加载程序的大小。
但是因为这需要大量时间,大多数人发现重用优秀的u-boot引导程序更加方便,即使必须将其拆分为MLO / u-boot-spl和u-boot部分才能在AM3359及其128KiB内部SRAM上使用。
总之,您是正确的,在Beaglebone Black上具有三个阶段的引导过程(引导ROM + MLO + u-boot)不是技术限制-如果您可以承担不重用现有的,经过验证的,免费且广泛使用的引导程序代码的奢侈品,则两者(引导ROM + MLO)可能已足够。

2

1) 这512字节显示了PC台式机启动时第一个扇区内存的限制。

2) 在嵌入式系统中,有另一种多级引导加载程序的概念。如果板载上没有闪存,则必须从不同的设备引导到根文件系统,内核映像可能在SD卡、USB闪存驱动器、网络或另一个外部设备上,在这种情况下,x-loader(第一个引导加载程序只感知图像所在位置和主要初始化,并且在最多两个引导加载程序(u-boot)中,它将从不同的资源获取图像)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接