以下是我对这些条款的理解。
引导程序
Bootrom(或 Boot ROM)是嵌入在处理器芯片中的一小块掩膜 ROM 或写保护闪存。它包含处理器在上电或复位时执行的第一个代码。根据一些带引脚或内部保险丝的配置,它可能决定从哪里加载要执行的下一部分代码以及如何或是否验证它的正确性或有效性。有时它可能包含附加功能,可能在引导期间或之后可由用户代码使用。一些例子:
iPhone 启动 ROM。嵌入在掩码 ROM 中,无法修改。从闪存或 USB(在 DFU 模式下)加载下一阶段的引导加载程序,并使用内置的 RSA 实现验证其签名。还为下一阶段的引导加载程序提供加速解密功能。
TI 的 OMAP4 引导 ROM。可以从闪存(NOR、NAND、OneNAND)、外部存储器、SD/MMC、USB 或 UART 加载用户代码。引导顺序和选项由带 (SYSBOOT) 引脚设置。为后期阶段提供一些功能(缓存/TLB 管理等)
NXP 的 LPCxxxx 系列引导 ROM。放置在内部闪光灯的隐藏部分,开机时映射为 0。实现 CRP(代码读取保护)、ISP(系统内编程),允许通过 UART 上传和刷新新代码。如果有效的用户代码在闪存中(需要有正确的校验和),则将其映射到 0 并跳转到它。bootrom 的一部分仍然映射以提供 IAP(应用内编程)和其他一些服务。
引导加载程序
Bootloader 负责查找和加载应该在芯片上运行的最终操作系统或固件。与 bootrom 的一个主要区别是它通常位于可写闪存中,并且可以更换或升级。
有时 bootrom 可以执行引导加载程序的工作。例如,OMAP 的 bootrom 非常复杂(它可以解析 FAT32!),您可能可以让它直接加载并启动 Linux 内核。
但是,在许多情况下,会使用单独的引导加载程序,要么是因为 bootrom 功能不足(或不存在),要么是因为需要额外的灵活性。它可以非常简单(从 RAM 中的固定闪存位置加载内核并跳转到它),也可以更复杂。例如,U-Boot本身就像一个迷你操作系统——它有一个控制台、一些命令,允许你中断引导过程,例如修改内核命令行参数,甚至从不同的位置加载内核(SD/ MMC 或 USB),运行一些测试等等。
当您有一个或多或少复杂的操作系统时,通常会使用引导加载程序,这可能需要一些设置才能启动。像 NXP 的 LPC 系列这样的小型微控制器通常使用单片固件,因此它们可以在没有它的情况下正常运行(但是,它们也可能有定制的引导加载程序)。
在最简单的芯片上可能根本没有引导 ROM 或引导加载程序——它们只是尝试从固定的启动地址获取和执行指令。事实上,迄今为止,大多数 x86 芯片都是这样工作的——它们只是在 FFFFFFF0 开始执行代码,并期望芯片组已将 BIOS 闪存芯片映射到那里。在这里,您可以说 BIOS 是引导加载程序(尽管它也为操作系统提供服务,类似于 bootrom)。