【问题标题】:What is the booting process for ARM?ARM的启动过程是什么?
【发布时间】:2011-05-26 14:09:53
【问题描述】:

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

【问题讨论】:

  • ARM 处理器用于许多不同的应用程序和电路板。带有处理器的特定板可以随意唤醒该处理器。您是否考虑过特定​​的硬件?
  • 嗨,克里斯,感谢您的 cmets。我打算玩 A8 或 A9 开发板。来自 arm.com,A8 的开发板是 Beagle Board,A9 的开发板是 Panda Board。我的目的是进行信任区测试。如果您能给我一些建议,我将不胜感激?我应该买哪个板(我个人更喜欢A9,因为它比较新)? A9/A8的启动顺序是什么?开机过程是否涉及信任区操作?

标签: arm boot bootloader


【解决方案1】:

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

经典模型,用于前 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。它可能会检查各种条件以确定从何处加载用户代码以及是否加载它(例如,它可能需要有效的数字签名)。在这种情况下,用户代码可能必须符合不同的启动约定。

【讨论】:

  • 这是一个很好且全面的答案,但有一个错误的说法:在支持“高向量”的 ARM 处理器上(实际上是 ARM11 及更高版本),上电复位(以及随后的异常,直到被软件更改) ) 使用位于 either 0x00000000 或 0xffff0000 的向量表。该决定是通过配置输入信号做出的,因此在不同的 SoC 之间可能会有所不同。参见例如infocenter.arm.com/help/topic/com.arm.doc.ddi0301h/…
  • @unixsmurf:你说得对,我忘了。我会修改我的答案,谢谢!
  • 另外,请注意,在拇指模式下的 Cortex-M 上,最低有效位将为 1,因此到 0x118 的向量是 0x119:books.google.se/…
【解决方案2】:

上电后cpu会开始执行异常模式第一个是reset,因为reset必须作为supervisor模式运行,因为CPU在执行的时候不知道寄存器的状态它不能进入​​supervisor模式。要实现这个小代码需要编写(见最后)。在此之后,可以通过将地址加载到 PC 来处理其他异常。

.globl _start
 _start: b       reset
    ldr     pc, _undefined_instruction
    ldr     pc, _software_interrupt
    ldr     pc, _prefetch_abort
    ldr     pc, _data_abort
    ldr     pc, _not_used
    ldr     pc, _irq
    ldr     pc, _fiq

reset:
    mrs     r0,cpsr                 /* set the cpu to SVC32 mode        */
    bic     r0,r0,#0x1f             /* (superviser mode, M=10011)       */
    orr     r0,r0,#0x13
    msr     cpsr,r0

【讨论】:

    【解决方案3】:

    ... 最后,操作系统代码开始运行。对于ARM架构,使用后按电源键的开机流程是怎样的?

    这个答案主要是在上下文或现代 Cortex-A CPU 中; ARM平台种类繁多。但是,对于类似于 PC 的 ARM(平板电脑、手机等)...

    ARM CPU 将从 0x0 或 0xffff0000 获取指令(对于 Cortex-M,它是数据而不是指令)。典型的 ARM SOC 有一些使用这种机制的引导 rom。对于最终用户,您需要查阅手册以确定如何让您的代码运行。即,许多使用向量的 ARM SOC 内置了一个 BIOS,但您需要使用不同的东西来运行您的代码。

    通常,ARM SOC 将支持多个引导设备。该设备由某些 FUSE(由制造工具设置)或采样引脚确定。这些引脚将是运行系统中的 CPU 输出,但已被上拉/下拉以配置引导设备。每个启动设备都会有特殊的细节; ROM 很简单,但是 NAND 闪存、SPI 闪存、MMC 等需要一些配置细节。这些通常也由片上 FUSE 和/或采样引脚提供。可以读取设备的一小部分以进一步配置设备。

    对于深度嵌入的ARM芯片,它可能只能从板载flash启动,这个过程要简单得多;但我相信从您指的是更高级的ARM CPU的问题的上下文中。更高级的 ARM 系统具有引导加载程序。这是因为 ROM 加载器将加载的代码量通常是有限的和/或受限的。设置 SDRAM 通常也很复杂,并且引导加载程序可能会被构造为从配置 SDRAM 的内部静态 RAM 运行。

    见:Why we need a bootloader

    运行操作系统有其自身的特殊问题。对于 ARM Linux,它是 ATAGS,现在是 devicetree。人们可能会在那里编写自己的引导加载程序,或者使用最常见的 u-boot 开源项目之一。 U-boots 支持 vxWorks、Linux、NetBSD、Plan9、OSE、QNX、Integrity 和 OpenRTOS 以及二进制映像。

    许多原始 ARM Linux 设备支持 直接引导 的 Linux,无需引导加载程序。但是,除了一些非常古老的 ARM SOC/内核之外,Linux 在主线中不支持这一点。

    【讨论】:

    • Linux 引导加载程序列表在引用的问题 OR CorebootUbootWikipedia's comparison 中。 Barebox 是一个鲜为人知但结构良好且现代的 ARM 引导加载程序。 RedBoot也用于一些ARM系统;内核树支持 RedBoot 分区。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    相关资源
    最近更新 更多