在ARM系统上Bootrom和bootloader的区别是什么?



我主要来自x86系统背景,BIOS(固件)负责从PowerON加载引导加载程序(如GRUB),然后加载操作系统。我现在一直在阅读ARM系统上的等效启动顺序,似乎网上有文章引用了两个术语:bootrom和bootloader。

一些文章提到,从PowerON引导加载程序(如u-boot)是第一个被执行的东西,而一些文章说,从PowerON,引导(通常闪现在处理器的内部ROM上)首先被执行,然后加载引导加载程序(如uboot),然后加载操作系统。

谁能提供一些澄清bootrom和bootloader?另外,我想知道一个在ARM系统中通常使用的流行引导程序的名字。

我是这样理解这些术语的

Bootrom

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上传和刷新新代码。如果一个有效的用户代码在flash中(需要有适当的校验和),将其映射到0并跳转到它。bootrom的一部分仍然被映射为提供IAP (In-Application Programming)和其他一些服务。

引导装载程序

Bootloader负责查找和加载芯片上运行的最终操作系统或固件。与bootrom的一个主要区别是它通常在可写闪存中,可以替换或升级。

有时bootrom可以执行引导加载程序的工作。例如,OMAP的引导足够复杂(它可以解析FAT32!),您可能可以让它直接加载并启动Linux内核。

然而,在许多情况下,使用单独的引导加载程序,要么是因为引导程序功能不够(或不存在),要么是因为需要额外的灵活性。它可以非常简单(从RAM中的固定闪存位置加载内核并跳转到它),也可以复杂得多。例如,U-Boot本身就像一个迷你操作系统——它有一个控制台,一些命令,允许你中断引导过程,例如修改内核命令行参数,甚至从不同的位置(SD/MMC或USB)加载内核,运行一些测试等等。

引导加载程序通常在您有一个或多或少复杂的操作系统时使用,可能需要在启动之前进行一些设置。较小的微控制器,如NXP的LPC系列通常使用一个单片固件,所以他们可以通过没有它(然而,也可能有自定义引导加载程序)。

在最简单的芯片上,可能根本没有引导ROM或引导加载程序——它们只是尝试从固定的启动地址获取和执行指令。事实上,到目前为止,大多数x86芯片都是这样工作的——它们只是在FFFFFFF0开始执行代码,并期望芯片组已经在那里映射了BIOS闪存芯片。在这里,您可以说BIOS是引导加载程序(尽管它也为操作系统提供服务,类似于bootrom)。

ARM cpu可以有flash ROM,即芯片掩码包含一些加载BIOS的代码。很多已经说过GPU做大多数启动序列,但我有我的保留意见。GPU运行ARM代码吗?不。因此,面对正式版本的引导序列,我从原始GPU数据中看到,32K被复制到L2缓存中(因为DRAM还没有打开),从那时起,CPU运行代码从SDRAM加载BIOS。启动顺序中没有启用Trustzone设置。这允许裸金属编码器(嵌入式系统)使用绝大多数CPU FlashROM作为矢量表,因此您可以轮询硬件并根据需要设置矢量。TZ的东西没有任何有用的属性,因为蓝精灵套件证明它是不安全的。但是如果你用那个空间做向量,如果有人刷新,操作系统就会死机。

相关内容

最新更新