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 与引导加载程序有什么区别 的相关文章

  • GCC ARM 汇编预处理器宏

    我正在尝试使用汇编 ARM 宏进行定点乘法 define MULT a b asm volatile SMULL r2 r3 0 1 n t ADD r2 r2 0x8000 n t ADC r3 r3 0 n t MOV 0 r2 ASR
  • 在嵌入式设备上使用new或malloc引起的段错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 读取和打印手臂组件中的字符串

    我正在使用 ARMSim 刚刚开始学习汇编 所以如果我看起来一无所知 请原谅我 但我正在尝试从输入文件中读取字符串 然后将其打印到输出屏幕 到目前为止我有 equ SWI Open 0x66 open a file equ SWI Clos
  • 如何在 Android 设备上运行 VS Code [重复]

    这个问题在这里已经有答案了 我有 Galaxy Tab S6 它具有替代笔记本电脑的很酷的功能 例如连接鼠标和键盘 但不幸的是它运行 Android 操作系统 并且没有很多开发应用程序可用于 Android 所以我想是否有一个选项可以在至少
  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma
  • 有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 进行编译?

    如果有很多浮点运算正在进行 Apple 建议针对 ARM 进行编译 而不是针对拇指进行编译 我的整个应用程序几乎是一个大型浮点运算 iOS 应用程序开发工作流程指南中是这样说的 iOS 设备支持两种指令集 ARM 和 Thumb Xcode
  • 分析 Cortex-M7 (stm32f7) 上的 memcpy 性能

    简洁版本 从 GNU ARM 工具链中提取的 memcpy 的性能指标在 ARM Cortex M7 上对于不同的副本大小似乎差异很大 即使复制数据的代码始终保持不变 这可能是什么原因造成的 长版 我是使用 GNU Arm 工具链 11 2
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • AOSP 的“午餐”组合是什么意思?我需要选择什么?

    我是 Android 设备 ROM 开发的新手 无论如何 我现在正在为具有 64 位处理器的中国设备构建 AOSP 我按照 source android com 上的菜单进行操作 当我运行 午餐 命令时 终端显示 午餐菜单 选择一个组合 我
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • ARM 汇编:从 STDIN 获取字符串

    我目前正在学习 CS 课程 我们刚刚开始在 Raspberry Pi 上使用 ARM Assembly 事实证明这相当困难 想知道是否有人可以提供帮助 我当前的任务是从 stdin 获取一个字符串 使用 scanf 并计算其中的字符数 然后
  • LDR指令如何将常量加载到寄存器中?

    我刚刚读了一本ARM指令书 看到一条指令我无法解释 It says LDR将 32 位常量加载到r0登记 LDR r0 pc const number 8 pc const number DCD 0xff00ffff 我不明白什么 pc c
  • ARM、VFP、浮点、惰性上下文切换

    我正在为 ARM 处理器 Cortex A9 编写操作系统 我正在尝试实现浮点寄存器的延迟上下文切换 这背后的想法是 浮点扩展最初对线程禁用 因此不需要在任务切换上保存浮点上下文 当线程尝试使用浮点指令时 会触发异常 然后 操作系统启用浮点
  • 在 ARM Cortex-M3 中使用 newlib 的 malloc

    我正在为 ARM Cortex M3 NXP 的 LCP17xx 创建代码 到目前为止我一直在使用静态内存 一切都运行良好 我尝试添加动态内存支持 但是一旦调用 malloc 系统就会卡住 我正在使用 gcc 为 Arm Bare Meta
  • 什么是 .axf 文件?

    我是arm架构的新手 我从事嵌入式软件工作 并试图了解我的项目二进制文件的调试文件夹中存在的 axf文件 发现它是链接器在构建过程中生成的arm可执行格式文件 用于调试崩溃 所以很明显它包含了一些调试信息 但不清楚具体是什么信息 而且deb

随机推荐

  • 如何在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