SPL(Secondary Program Loader)的作用是什么?

56

我对以下三个问题的概念不清楚:

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

  2. 它加载和重定位到哪个内存中?

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

通过阅读链接,我了解到当系统内部内存无法完全容纳uboot时,需要使用称为SPL的最小代码片段初始化内存。 SPL实际上是否会重新定位,还是只有uboot会重新定位本身?

3个回答

124
让我用 OMAP平台举个例子来解释一下(只是为了提供一些实际背景,而不仅仅是理论或常识)。先看一些事实:
  • 在基于OMAP的平台上,开机后运行的第一个程序是 ROM代码(类似于PC上的BIOS)。
  • ROM代码寻找引导加载程序(必须是名为"MLO"的文件,位于MMC的活动第一个分区中,并且必须格式化为FAT12/16/32——但这是细节)。
  • ROM代码将"MLO"文件的内容复制到 静态RAM中(因为常规RAM尚未初始化)。下一张图片显示了OMAP4460 SoC的SRAM存储器布局:

SRAM memory layout on OMAP4460

  • 由于物理原因,SRAM内存有限,因此我们只有48 KiB的引导加载程序。通常常规的引导加载程序(例如U-Boot)二进制文件比这还要大。因此,我们需要创建一些额外的引导加载程序,它将初始化常规RAM并从MMC复制常规引导加载程序到RAM中,然后跳转执行该常规引导加载程序。这个额外的引导加载程序通常被称为第一阶段引导加载程序(在两阶段引导加载程序场景中)。

所以这个第一阶段引导加载程序就是U-Boot SPL;而第二阶段引导加载程序则是常规U-Boot(或U-Boot proper)。需要明确的是:SPL代表Secondary Program Loader。这意味着ROM代码是加载(和执行)其他程序的第一件事情,而SPL是加载(和执行)其他程序的第二件事情。因此,通常的启动顺序是:ROM代码 -> SPL -> u-boot -> 内核。实际上,它与PC启动非常相似,即:BIOS -> MBR -> GRUB -> 内核。

更新

为了让事情更加清晰明了,这里是描述引导序列所有阶段的表格(以澄清可能存在的术语不确定性):
+--------+----------------+----------------+----------+
| 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] 引导加载程序(在OSDev Wiki上)

[4] 引导ROM与引导加载程序


1
我猜这完全取决于被接受的术语。我找到了SPL既指第一阶段引导加载程序,也指第二阶段引导加载程序。在IT领域,这种情况经常发生,我的意思是术语没有得到很好的确立。可能是因为IT是一个相对较新的工程分支,或者说术语变化太快,以至于术语无法明确。不管怎样,如果你看一下[1]和[3],你会发现他们并不认为ROM代码是引导加载程序。可能是因为它是固定的代码,我们并不过多考虑它 :) - Sam Protsenko
1
@AlexeyVesnin 如上所述,这一切都与参考框架有关。至少我试图在评论中更好地解释这个问题,可能失败了 :) 我们在谈论U-Boot,而U-Boot是一个两阶段的引导加载程序。U-Boot的第一阶段是SPL,第二阶段是U-Boot本身。从系统的角度来看,在传统的ARMv7系统中有3个阶段:ROM代码、SRAM引导加载程序和RAM引导加载程序。但ROM代码是固定的,所以我们基本上可以忽略它。就像在PC上一样:我们有BIOS、MBR和GRUB。但我们认为BIOS是固定的,所以MBR被称为第一阶段,GRUB是第二阶段。 - Sam Protsenko
1
@AlexeyVesnin 好的,我想我明白你的意思了。我想坚持使用 OMAP 术语(考虑 BeagleBone Black),最好在这里详细描述:AM335x U-Boot 用户指南。从引导 ROM 代码的角度来看,相应的引导图可以在 AM335x TRM 中找到(请参见图 26-10“ROM 代码引导过程”)。希望你同意提到的文档。 - Sam Protsenko
1
@AlexeyVesnin 在我的表格(答案中)中,“术语 #2”列中的“1st stage bootloader”之类的内容可以替换为“U-Boot 1st stage bootloader”,但我认为这是不言而喻的,因为整个问题都是关于U-Boot的。 - Sam Protsenko
1
根据这个(这是这个答案的一个有用补充)http://processors.wiki.ti.com/index.php/The_Boot_Process,我是正确的,但我建议你在你的答案中澄清。 - oromoiluig
显示剩余13条评论

1

没有理论上需要一个次级程序加载器(SPL)。然而,通常有实际的原因需要它。我能想到两个。

  • 首先,模块化和开发的便利性。
  • 其次,硬件引导过程可能太过严格。它可能期望引导加载器在特定位置,而那里没有足够的空间来存储整个引导过程。

主要的加载器会执行所有必要的操作来加载完整的引导过程(SPL)。例如,主要的加载器可以存储在具有内存限制的ROM中。


1
内部SoC sram存储器的容量从4kB到512KB,有时甚至更大。SPL通常被用作一个过渡阶段,因为完整的u-boot无法适应内部SRAM。但不仅如此,在某些情况下,SPL还可以用于在SPL阶段执行DDR调优或其他需求。
内部RAM存储器是静态RAM。外部存储器通常是SDRAM,并且需要初始化,因此在SDRAM/DDR控制器初始化之前不能使用。
请注意,还存在XIP,例如并行NOR芯片,通常不需要SPL,即使内部SRAM很小,因为可以通过从XIP闪存中执行初始化来初始化SDRAM。

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