ARM 的启动过程是怎样的?

2024-04-04

我们知道,对于X86架构:按下电源按钮后,机器开始执行0xFFFFFFF0处的代码,然后开始执行BIOS中的代码以进行硬件初始化。 BIOS 执行后,它使用引导加载程序将操作系统映像加载到内存中。最后,操作系统代码开始运行。 对于ARM架构,使用按下电源按钮后的启动过程是怎样的? 谢谢!


目前ARM架构中有两种异常模型(复位被认为是一种异常):

经典模型,用于前 Cortex 芯片和当前 Cortex-A/R 芯片。其中,0处的内存包含几个异常处理程序:

 Offset  Handler
 ===============
 00      Reset 
 04      Undefined Instruction
 08      Supervisor Call (SVC)
 0C      Prefetch Abort
 10      Data Abort
 14      (Reserved)
 18      Interrupt (IRQ)
 1C      Fast Interrupt (FIQ)

当异常发生时,处理器只是从特定的偏移量开始执行,因此通常该表包含单指令分支到代码中进一步的完整处理程序。典型的经典向量表如下所示:

00000000   LDR   PC, =Reset
00000004   LDR   PC, =Undef
00000008   LDR   PC, =SVC
0000000C   LDR   PC, =PrefAbort
00000010   LDR   PC, =DataAbort
00000014   NOP
00000018   LDR   PC, =IRQ
0000001C   LDR   PC, =FIQ

在运行时,向量表可以重定位到 0xFFFF0000,这通常被实现为紧密耦合的内存范围,以实现最快的异常处理。然而,上电复位通常从0x00000000开始(但在某些芯片中可以通过处理器引脚将其设置为0xFFFF0000)。

新的微控制器模型用于 Cortex-M 系列芯片。在那里,0处的向量表实际上是向量(指针)表,而不是指令。第一个条目包含 SP 寄存器的启动值,第二个条目是复位向量。这允许直接用 C 语言编写复位处理程序,因为处理器会设置堆栈。同样,该表可以在运行时重新定位。 Cortex-M 的典型向量表如下所示:

__Vectors       DCD     __initial_sp              ; Top of Stack
                DCD     Reset_Handler             ; Reset Handler
                DCD     NMI_Handler               ; NMI Handler
                DCD     HardFault_Handler         ; Hard Fault Handler
                DCD     MemManage_Handler         ; MPU Fault Handler
                DCD     BusFault_Handler          ; Bus Fault Handler
                DCD     UsageFault_Handler        ; Usage Fault Handler
                [...more vectors...]

请注意,在 OMAP3 或 Apple 的 A4 等现代复杂芯片中,执行的第一段代码通常不是用户代码,而是片上 Boot ROM。它可能会检查各种条件以确定从哪里加载用户代码以及是否加载它(例如,它可能需要有效的数字签名)。在这种情况下,用户代码可能必须符合不同的启动约定。

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

ARM 的启动过程是怎样的? 的相关文章

随机推荐

  • grails 更改 gsp 视图中的日期格式

    当我尝试在 gsp 视图中使用日期格式标记来更改日期格式时 但它不起作用 这是我的代码 class MyDate Date date 我的日期控制器 def unixSeconds params date replaceAll as lon
  • 我可以使用Treetop来解析IO吗?

    我有一个文件想要用 Treetop 解析 如果我想解析整个事情 我会使用 rule document category listing end 我真的不想立即将整个文件读入内存 我知道我可以设置解析器来解析一个category listin
  • MySQL 中的行版本控制

    我想在表中包含一个整数版本字段 在每次更新行时自动递增 在 MySQL 中可以做到这一点吗 请注意 我不是在谈论TIMESTAMP 这是不可靠的 因为同一秒内可能会发生两个并发更新 是的 更一般的问题称为缓慢改变尺寸 http en wik
  • 在强类型 MVC 视图用户控件中使用值类型

    我有一个具有以下基本结构的 MVC 用户控件 当我使用它时 它给出了这个错误消息 编译器错误消息 CS0452 类型 decimal 必须是引用 输入以便将其用作参数 泛型类型或方法中的 TModel System Web Mvc View
  • 如何使用 Nokogiri 访问属性

    我有一个访问某些属性的值的简单任务 这是一个简单的脚本 使用Nokogiri XML Builder创建一个简单的 XML 文档 require nokogiri builder Nokogiri XML Builder new encod
  • 如何在子线程中继续ThreadLocal的对象?

    我在 ThreadLocal 中传递了一个对象 现在我当前的线程将创建新的子线程 我希望 ThreadLocal 中的对象也应该继续使用子线程 有什么办法可以做到这一点吗 先感谢您 你需要的是一个InheritableThreadLocal
  • 这个计算 a^n 的算法是如何重写以在 O(log n) 时间内运行的?

    Suppose you want to compute an A simple algorithm would multiply a n times as follows result 1 for int i 1 i lt n i resu
  • TypeScript - 是否可以根据模式匹配甚至长度来验证字符串类型?

    考虑以下组件 它使用一个名为的库styled components创建一个预样式Text成分 const StyledText styled Text font family Roboto color props ITextProps gt
  • 通过 os.system('') 激活 VT100?

    在 Win10 conhost 获得 VT100 支持后 我尝试了一下它 最终我发现os system 激活Python中的支持并得到以下结果 import os print 033 36mTest 033 0m os system pri
  • 将逗号分隔的记录放入字符串数组中?

    我正在尝试读取一个 BufferedReader 它读取包含用逗号分隔的记录的文件 我想将每个字符串 或记录 拆分在两个逗号之间 去掉双引号 然后将每个字符串放入字符串数组的索引中 例如 假设我的文件中有这一行 0001 00203 824
  • 是否有用于带有数据 uri 的链接下载的 Polyfill?

    我有一些代码应该由服务器生成 a href teszt a 它适用于当前的 chrome firefox opera 我希望它支持 MSIE11 AFAIKmsSaveBlob是解决方案 是否有我可以使用的现有 js polyfill 或者
  • 处理 wicket 中 AutoCompleteTextField 的 onchange 事件

    我正在使用 Java 和 Wicket 为 Web 应用程序编写一个自动完成组件 当用户选择自动完成列表的选项之一时 有没有办法处理 onchange 事件来运行一些代码 我尝试在自动完成文本字段中执行此操作 setOutputMarkup
  • Jenkins 不等待 Docker 命令完成

    我试图让 Jenkins 在 Jenkins 从机上的 docker 中运行以下命令 docker run i v pwd opt myapp w opt myapp t mydockerimage bin bash c setup dev
  • MongoDB Atlas 搜索中多个文档具有相同的搜索分数

    有没有办法提高 Atlas 搜索中精确匹配的分数 我在获取 hi 从英语到法语的正确 最佳翻译时遇到问题 经过一番调试后 我发现从聚合返回的前三 3 个文档的得分相同 均为 2 362138271331787 我期望 hi 具有更高的分数
  • 如何在网页中打印适合纸张尺寸(A3、A4、A5 等)的图像?

    我目前正在使用 IE9 和媒体查询 我不需要在其他浏览器中使用此功能 我尝试使用一组规则 例如 page size auto margin 10mm 10mm 10mm 10mm 匹配所有 A 格式 A0 A1 A2 等 的毫米的规则 包括
  • 比较 LINQ-to-SQL 中的 byte[] 和使用模拟的单元测试

    我有以下方法 User IDataContext AuthenticateUser string userName string password byte hash PasswordHasher HashPassword userName
  • Solr 精确单词搜索

    我想配置我的 Solr 搜索引擎 以便获得与我输入的搜索词完全匹配的结果 例如 taxes 应该返回带有 taxes 的文档 而不是 tax taxation 等 任何帮助或提示将不胜感激 我假设您的字段是 TextField 默认情况下
  • PHPUnit:尝试@cover或@use不存在的方法

    我正在学习如何使用 PHPUnit 4 3 5 PHP 5 5 14 进行单元测试 一切都很顺利 直到我尝试获得代码覆盖率 我收到此错误 尝试获取代码覆盖率时尝试 cover 或 use 不存在的方法 MyClass construct 我
  • 使用 ASP.NET 4.5 发布配置文件时如何参数化部署?

    ASP NET 4 5 中的新 pubxml 文件绝对是朝着正确方向迈出的一步 我也喜欢msdeploy的支持parameters xml文件 尽管它们有时没有我想要的那么强大 现在 我该如何结合msdeploy的参数和 pubxml 文件
  • ARM 的启动过程是怎样的?

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