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