什么是使用SPL(二级程序加载器)

我在澄清关于这三个问题的概念时感到困惑

  1. 为什么我们需要一个辅助程序加载器?

  2. 在哪个内存中被加载和重定位?

  3. 系统内部存储器和RAM之间有什么区别?

据我所知通过阅读链接是.. SPL是必需的,当系统内部存储器不能完全保存uboot,所以我们需要使用称为SPL的一个最小的代码块初始化内存 。 SPL实际上是重新定位还是只关联自己的uboot?

让我以OMAP平台为例来解释它(仅仅提供一些实际的背景,而不仅仅是理论或常识)。 看看一些事实,对于初学者来说:

  • 在基于OMAP的平台上,开机后运行的第一个程序是ROM代码 (类似于PC上的BIOS)。
  • ROM代码查找引导加载程序(它必须是一个名为“MLO”的文件,位于MMC的活动第一个分区上,必须格式化为FAT12 / 16/32,但这是细节)
  • ROM代码将该“MLO”文件的内容复制到静态RAM (因为常规RAM尚未初始化)。 下图显示了OMAP4460 SoC的 SRAM存储器布局:

OMAP4460上的SRAM存储器布局

  • SRAM内存是有限的(由于物理原因),所以我们只有48 KiB的引导程序。 通常定期的引导程序(例如u-boot)二进制文件比这个大。 所以我们需要创建一些额外的bootloader,它会初始化普通的RAM,并将常规的bootloader从MMC复制到RAM,然后跳转到执行那个普通的bootloader。 这个额外的引导程序通常被称为第一阶段引导程序

所以这个第一阶段的bootloaderu-boot SPL ; 而第二阶段的bootloader常规的u-boot 。 要清楚:SPL代表次要程序加载器 。 这意味着ROM代码是加载(并执行)其他程序的第一件事 ,SPL是加载(并执行)其他程序的第二件事 。 所以通常启动顺序是:ROM代码 – > SPL – > u-boot – >内核。 实际上它与PC启动非常相似,即:BIOS – > MBR – > GRUB – >内核。

UPDATE

为了清楚起见,下面是描述引导顺序所有阶段的表格(为了澄清术语可能存在的不确定性):

+--------+----------------+----------------+----------+ | Boot | Terminology #1 | Terminology #2 | Actual | | stage | | | program | | number | | | name | +--------+----------------+----------------+----------+ | 1 | Primary | - | ROM code | | | Program | | | | | Loader | | | | | | | | | 2 | Secondary | 1st stage | u-boot | | | Program | bootloader | SPL | | | Loader (SPL) | | | | | | | | | 3 | - | 2nd stage | u-boot | | | | bootloader | | | | | | | | 4 | - | - | kernel | | | | | | +--------+----------------+----------------+----------+ 

所以我只是使用bootloader作为u-boot的同义词,而程序加载程序是所有加载其他程序的程序的通用术语。

也可以看看:

[1] SPL(维基百科)

[2] TPL:SPL加载SPL – Denx

[3] Bootloader(在OSDev Wiki上)

没有理论上需要辅助程序加载器。 但是,经常有务实的理由。 两个在我的头顶。 首先,模块化和易于开发。

其次,硬件启动过程可能过于严格。 可能期望书籍载入器位于没有足够空间存储整个引导过程的特定位置。 主加载程序完成加载完整书本过程(SPL)所需的任何操作。 例如,主装载程序可以存储在ROM中,但有内存限制。