ARM 系统上的 Bootrom 与引导加载程序有什么区别

2024-01-27

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

有些文章提到,从 PowerON 开始,引导加载程序(如 u-boot)是首先执行的,而有些文章则说,从 PowerON 开始,首先执行 bootrom(通常在处理器的内部 ROM 上闪存),然后依次加载引导加载程序(如uboot)然后加载操作系统。

有人可以对 bootrom 与 bootloader 进行一些澄清吗?另外,我想知道 ARM 系统中通常使用的流行 bootrom 的名称。


以下是我对这些术语的理解。

Bootrom

Bootrom(或 Boot ROM)是嵌入处理器芯片内部的一小块掩模 ROM 或写保护闪存。它包含处理器在加电或重置时执行的第一个代码。根据某些带引脚或内部保险丝的配置,它可以决定从哪里加载要执行的下一部分代码以及如何或是否验证其正确性或有效性。有时它可能包含附加功能,可能在启动期间或启动后由用户代码使用。一些例子:

  • iPhone 启动 ROM。嵌入掩膜ROM中,无法修改。从闪存或 USB(在 DFU 模式下)加载下一阶段引导加载程序,并使用内置 RSA 实现验证其签名。还为下一阶段的bootloader提供加速解密功能。

  • TI 的 OMAP4 启动 ROM。可以从闪存(NOR、NAND、OneNAND)、外部存储器、SD/MMC、USB 或 UART 加载用户代码。引导顺序和选项由带 (SYSBOOT) 引脚设置。为后期提供一些功能(缓存/TLB管理等)

  • NXP的LPCxxxx系列Boot ROM。放置在内部闪存的隐藏部分,开机时映射为 0。实现 CRP(代码读取保护)、ISP(系统内编程),允许通过 UART 上传和刷新新代码。如果有效的用户代码在闪存中(需要有正确的校验和),则将其映射到 0 并跳转到它。 bootrom 的一部分仍然被映射以提供 IAP(应用内编程)和一些其他服务。

引导装载程序

引导加载程序负责查找并加载应该在芯片上运行的最终操作系统或固件。与 bootrom 的一个主要区别是它通常位于可写闪存中,并且可以更换或升级。

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

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

当您有一个或多或少复杂的操作系统时,通常会使用引导加载程序,该操作系统可能需要一些设置才能启动。像 NXP 的 LPC 系列这样的小型微控制器通常使用单片固件,这样它们就可以在没有它的情况下运行(但是,可能有自定义引导加载程序 http://www.lpcware.com/content/nxpfile/an10866-lpc1700-secondary-usb-bootloader对他们来说也是如此)。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM 系统上的 Bootrom 与引导加载程序有什么区别 的相关文章

  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • 从 Visual Studio 交叉编译 ARM7 代码

    是否可以从 Visual Studio 2008 2010 Express 或 Professional 编译 ARM7 如果是这样 可以指导我如何做吗 我读过有关 Yagarto 工具链的其他帖子 这一切是如何融入图片中的 我在这个领域非
  • Pandaboard 交叉编译 Qt

    我花了几周的时间尝试为我的 Panda 板交叉编译 Qt 但没办法 我无法通过 configure 如果有人能给我帮助 我将不胜感激 我的主机系统是Ubuntu 13 04 86 64位 在Virtualbox中运行 我的目标系统是 Pan
  • 我们可以优化代码来降低功耗吗?

    有没有什么技术可以优化代码以确保更低的功耗 架构是ARM 语言是C 来自 ARM 技术参考网站 ARM11 MPCore 的特性 提高能源效率的处理器 效率包括 准确的分支和子程序返回预测 减少数量 错误的指令获取和 解码操作 使用物理寻址
  • 如何创建具有自定义外设和内存映射的 QEMU ARM 机器?

    我正在为 Cortex M3 cpu 编写代码 并且正在使用以下命令执行单元测试qemu arm二进制 现在一切都很好 但我想知道我是否能够使用测试整个系统qemu system arm 我的意思是 我想为 qemu 编写自定义 机器 我将
  • ARM 汇编不能同时使用立即值和 ADDS/ADCS

    我目前正在尝试使用汇编来加速 Cortex M0 Freescale KL25Z 上的一些 C 函数 我遇到这个最小测试程序的问题 syntax unified cpu cortex m0 text global test code 16
  • GNU Arm Cortex m4 上的 C++ 异常处理程序与 freertos

    2016 年 12 月更新现在还有一个关于此行为的最小示例 https community nxp com message 862676 https community nxp com message 862676 我正在使用带有 free
  • arm64 汇编:LDP 与 LD4 执行时间

    假设我想用连续内存位置的值加载四个连续的 aarch64 向量寄存器 一种方法是 ldp q0 q1 x0 ldp q2 q3 x0 32 根据ARM优化指南 https static docs arm com uan0016 a cort
  • ARM 的启动过程是怎样的?

    我们知道 对于X86架构 按下电源按钮后 机器开始执行0xFFFFFFF0处的代码 然后开始执行BIOS中的代码以进行硬件初始化 BIOS 执行后 它使用引导加载程序将操作系统映像加载到内存中 最后 操作系统代码开始运行 对于ARM架构 使
  • 使用 gnueabihf 为 ARMv6 构建

    我尝试为 ARMv6 构建应用程序 但失败了 我猜问题是工具链支持硬浮点 但 ARMv6 不支持 好吧 首先我设置 march armv6 编译失败 opt gcc linaro arm linux gnueabihf 4 8 2014 0
  • 在 ARM 处理器上执行存储在外部 SPI 闪存中的程序

    我有一个 ARM 处理器 能够与外部闪存芯片连接 写入芯片的是为 ARM 架构编译的程序 可供执行 我需要知道如何将这些数据从外部闪存获取到 ARM 处理器上以供执行 我可以提前运行某种复制例程 将数据复制到可执行内存空间吗 我想我可以 但
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • ARM架构中不同处理器模式下如何使用内核堆栈?

    据我了解 每个进程都有一个用户堆栈和内核堆栈 除此之外 ARM 架构中的每种模式都有一个堆栈 所以我想知道不同的堆栈和堆栈指针在 ARM 模式下如何工作 另外 何时会使用与进程关联的内核堆栈 何时会使用与进程关联的内核堆栈 当您进行系统调用
  • ARM 中只有两个操作数的 ADD 或 SUB

    我正在学习ARM汇编语言 我读过 ADD 应该有 3 个操作数 然而 我见过很多案例 现实中只有两种 例如 STR R1 SP 0x20 var 1C LDR R1 a lua 0x1DE4E6 MOVS R0 R4 haystack AD
  • 读取和打印手臂组件中的字符串

    我正在使用 ARMSim 刚刚开始学习汇编 所以如果我看起来一无所知 请原谅我 但我正在尝试从输入文件中读取字符串 然后将其打印到输出屏幕 到目前为止我有 equ SWI Open 0x66 open a file equ SWI Clos
  • Linux malloc() 在 ARM 和 x86 上的行为是否不同?

    这个网站上有很多关于内存分配的问题 但是我 找不到专门解决我的问题的人 这 问题 https stackoverflow com questions 19148296 linux memory overcommit details似乎最接近
  • 源和目标具有不同的 EABI 版本

    我正在尝试使用 ARM 工具链编译 so 文件 但是我不断收到这个错误 错误 源对象的 EABI 版本为 0 但目标对象的 EABI 版本为 5 我无法更改工具链中的任何内容 因为我必须使用给定的工具链 我以前从未见过这个错误 我使用了这个
  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • 是否可以将 SpaCy 安装到 Raspberry Pi 4 Raspbian Buster

    我一整天都在安装 SpaCy sudo pip install U spacy Looking in indexes https pypi org simple https www piwheels org simple Collectin

随机推荐

  • 如何在Pubnub中的ngHistory中实现回调?

    当尝试检索历史消息时on事件 加载时间太长 微调器显示和隐藏速度太快 但该消息尚未加载 我们如何计算或获取加载历史记录的准确时间 scope limit 100 PubNub ngHistory channel scope channel
  • 设置开发服务器

    开发 PHP 应用程序时 最好有一个用于开发 测试的服务器 然后是一个实时服务器 一旦准备好就可以放置所有内容 好吧 但是怎么办呢 如果您通过托管公司进行托管 如何设置自己的开发服务器来测试模仿所有 LAMP 设置作为实时服务器 因为如果它
  • 如何对 GUI 进行单元测试?

    我的代码中的计算经过了充分测试 但由于 GUI 代码太多 我的整体代码覆盖率低于我的预期 有关于单元测试 GUI 代码的指南吗 这还有道理吗 例如 我的应用程序中有图表 我一直无法弄清楚如何自动测试图表 AFAIK 需要人眼来检查图表是否正
  • Corda 在终端中查看消耗状态

    有没有一种简单的方法可以使用 CordaRPCOps 界面查看终端中的消耗状态 似乎VaultQuery默认返回未使用的状态 我不知道如何使用vaultQueryBy或任何符合条件的东西 我知道应该有消耗状态 因为我可以用 H2 看到它们
  • 为什么我的 datumTokenizer 从未被调用?

    我在 datumTokenizer 函数中放置了一个断点 但它似乎从未被调用 为什么不 它适用于仅远程数据吗 var engine new Bloodhound datumTokenizer function d return Bloodh
  • es6箭头函数调试器语句

    如果我有这样的功能 param gt params 1 我需要放一个debugger函数体内的语句 添加括号是这样的 param gt debugger return params 1 唯一的选择 来自MDN https developer
  • 内联安装 Chrome 扩展程序时出现“未捕获无效的 Chrome Web Store 项目 URL”

    我创建了一个 Chrome 扩展程序 并将其发布到 Chrome Webstore 上的测试人员组 当我尝试从我的网站加载 添加 扩展程序时 出现错误 未捕获无效的 Chrome 应用商店项目 URL 论方法Installer protot
  • Android 中的 CTL(复杂文本语言)支持

    我正在尝试为亚洲语言开发 Android IME 需要复杂的渲染 例如更改字形形式 重新排序字符顺序等 在PC中 使用GTK Pango Graphite就足够了 在 Android 中 如何解决复杂文本语言的 Unicode 渲染问题 提
  • ARKit:再现Project Point功能

    我正在尝试重现 ARCamera 的项目点函数 但由于某种原因 这些值没有正确匹配 我采用 ARCamera 的投影矩阵和视图矩阵 并应用基本的 CG 透视变换数学 PV p 但 NDC 值与 ARCamera 的项目点函数给出的像素值不匹
  • 如何从 SSMS 获取完整结果集

    如何获取 SQL Server Management Studio 中行的完整内容 如果您使用 结果网格 数据将被编码 因此换行符之类的内容会丢失 如果您执行 结果到文件 或 结果到文本 则文本限制为 8192 个字符 注意 我有解决方案
  • 设置为联系人铃声?安卓

    我正在尝试学习如何添加设置为联系人铃声功能 我已经知道如何设置默认铃声 但我不知道如何设置为联系人铃声 我到达了选择联系人的部分 但我不知道如何为该联系人分配铃声 这部分困扰着我 我似乎无法在已经提出的有关该主题的问题中找到答案 到目前为止
  • 执行 ajax 调用时序列化某个类型的对象时检测到循环引用

    在我看来 我使用的是 Viewmodel 并且我有一个表单 该表单只有一个接受日期的文本框 不是视图模型的一部分 和 3 个表 默认情况下 在页面加载时 表格中填充了基于今天日期的数据 您可以在下面的控制器代码中看到 但是如果用户选择日期并
  • 如何让机器在执行期间停止睡眠/休眠

    我有一个用 golang 编写的应用程序 部分 作为其操作的一部分 它将生成一个外部进程 用 c 编写 并开始监视 这个外部过程可能需要几个小时才能完成 因此我正在寻找一种方法来防止机器在处理时休眠或休眠 我希望能够放弃这个锁 以便当进程完
  • 有没有适用于 Windows 的开源 C 可视化调试器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有适用于 Windows 的开源 C 可视化调试器 我听说过 Visual C Express 免费
  • JavaScript 中的谷歌 API

    我正在尝试使用 javascript 从 google 获取日历信息 我读过 如何做 手册 他们没有帮助 即使这个 有用的 复制粘贴代码 授权 也没有 有人能教我如何使用 google api 吗 也许有人有一些样本可以分享 还有这个漂亮的
  • C# 不发出“尾巴”是否存在技术原因。 CIL指令? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 net C 不消除尾递归 https stackoverflow com questions 491376 why doesnt net c eliminate tail recursion
  • 为什么在使用 p:uploadFile 上传文件后无法更新 p:graphicImage 两次

    我一直在尝试使用 p uploadFile 上传图像 第一次它工作正常 但在第一个上传文件之后 它不会更新 p graphicImage 但如果我重新加载页面 graphicImage 的值很好并且图像显示 所以 我认为这是 primefa
  • Python脚本执行但听不到正在播放的声音

    我正在使用 libvlc python 绑定来播放音乐文件 我的代码如下 import vlc instance vlc Instance Create a MediaPlayer with the default instance pla
  • 如何更改struts action中的url模式

    domain Forum show action pg 2 forum java 我如何将其重写为 domain forum java pg 2 从一开始就使用您喜欢的 URL 结构 映射到任何 URL 结构的能力是 Servlet API
  • ARM 系统上的 Bootrom 与引导加载程序有什么区别

    我主要来自 x86 系统背景 其中 BIOS 固件 负责从 PowerON 加载引导加载程序 如 GRUB 进而加载操作系统 我现在一直在阅读 ARM 系统上的等效启动顺序 网上似乎有文章提到了两个术语 bootrom 和 bootload