问题描述
我很困惑清除关于这三个问题的概念
-
为什么我们需要辅助程序加载器?
-
它在哪个内存中加载和重定位?
-
系统内部存储器和RAM有什么区别?
据我了解,通过阅读链接是..当系统内部内存无法完全容纳uboot时,需要SPL,因此我们需要使用称为SPL的最小代码初始化内存。是SPL实际迁移还是仅与自身相关的uboot?
最佳思路
让我以OMAP平台为例进行说明(仅提供一些实际背景,而不仅仅是理论或常识)。看一下入门的一些事实:
-
在基于OMAP的平台上,在power-on之后运行的第一个程序是ROM code(类似于PC上的BIOS)。
-
ROM代码查找引导加载程序(引导加载程序必须是名为”MLO”的文件,并且位于MMC的活动第一个分区上,该文件的格式必须为FAT12 /16/32,但这是详细信息)
-
ROM代码将该”MLO”文件的内容复制到static RAM(因为常规RAM尚未初始化)。下图显示了OMAP4460 SoC的SRAM存储器布局:
-
SRAM内存有限(由于物理原因),因此引导加载程序我们只有48 KiB。通常,常规的引导加载程序(例如U-Boot)二进制文件会更大。因此,我们需要创建一些其他的引导程序,这些引导程序将初始化常规的RAM并将常规的引导程序从MMC复制到RAM,然后跳转到执行该常规的引导程序。此附加的引导加载程序通常称为first-stage引导加载程序(在two-stage引导加载程序方案中)。
因此,此first-stage引导程序为U-Boot SPL;并且second-stage引导程序是常规的U-Boot(或U-Boot适当)。需要明确的是:SPL代表次要程序加载程序。这意味着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的同义词,并将Program Loader用作加载其他程序的任何程序的通用术语。
也可以看看:
[2] TPL: SPL loading SPL – Denx
[3] Bootloader (at OSDev Wiki)