Fen*_*ang 53 boot arm bootloader
我们知道,对于X86架构:按下电源按钮后,机器开始执行0xFFFFFFF0处的代码,然后它开始在BIOS中执行代码以进行硬件初始化.BIOS执行后,它使用bootloader将操作系统映像加载到内存中.最后,操作系统代码开始运行.对于ARM体系结构,使用后的启动过程按电源按钮是什么?谢谢!
Igo*_*sky 61
目前,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)
Run Code Online (Sandbox Code Playgroud)
当异常发生时,处理器只是从特定偏移量开始执行,因此通常该表包含代码中进一步处理完整处理程序的单指令分支.典型的经典矢量表如下所示:
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
Run Code Online (Sandbox Code Playgroud)
在运行时,向量表可以重新定位到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...]
Run Code Online (Sandbox Code Playgroud)
请注意,在现代复杂芯片(如OMAP3或Apple A4)中,执行的第一段代码通常不是用户代码,而是片上Boot ROM.它可以检查各种条件以确定从何处加载用户代码以及是否根本加载它(例如,它可能需要有效的数字签名).在这种情况下,用户代码可能必须符合不同的启动约定.