1简介
ARM 启动代码主要包含系统环境初始化及应用程序初始化
系统环境初始化主要完成:
- 设置目标代码初始入口点
- 中断向量初始化
- 数据堆栈初始化
- 存储系统及关键 I/O 端口初始化
- 初始化异常中断所需 RAM 变量
- 使能异常中断
- 根据需要切换处理器模式或状态
应用程序初始化主要完成:
- 将已初始化的数据段转移至可写数据区(ROM->RAM)
- 在可写存储区建立 ZI 属性的可写数据区
ARM 启动代码序列如图 1 所示:
2中断向量表设计
ARM 处理器共有 7 种异常中断类型,其对应向量地址如表 1 所示
中断向量表实现代码如下:
//装载地址到PC
程序正常复位后
- 首先执行LDR PC,ResetAddr:把ResetAddr的值加载到PC
- 通过后面的一条伪指令ResetAddr DCD Resetlnit:将行号Resetlnit所在的地址值给ResetAddr得到ResetAddr的值
在系统复位后,应用程序从指令( 1) 处开始执行,该指令所在内存地址为 PC - 0x08,而指令( 4) 所在内存地址为 PC + 0x18,LDR PC,ResetAddr 等效于 LDR PC,[PC,0x18]
3 堆栈指针设计
ARM 处理器共有 7 种运行模式,其对应 CPSR 中控制位如表 2 所示。
User 模式和 System 模式共用一组寄存器,各异常模式有独立的堆栈指针寄存器( SP_mode) 及连接寄存器( LR_mode) ,如果应用程序使用异常中断,ARM 启动代码必须根据实际情况设置相应处 理器模式堆栈指针。具体实现代码如下:
StackIrq
的数据,它的值是
IrqStackSpace
的地址加上
(256 - 1) * 4
IntStacks
的数据区域,表示这是一个用于存储数据的区域,不需要初始化。
IrqStackSpace
的区域,它是一个 256 个 4 字节单元的区域
StackUser
的区域,它是一个 1 个单元的区域
在上述示例中,只给出了 IRQ及用户模式堆栈指针的初始化,为设置不同处理器模式下的堆栈指针,需要在不同处理器模式 之间进行切换,这就需要用 MSR 指令对 CPSR 寄存器进行设置,但只能在特权处理器模式下才能对CPSR 寄存器进行访问。
在上述程序段中,用户模式堆栈指针的设置放在最后,这主要考虑到用户程序运行于用户模式下,在该子程序返回后,无须进行处理器模式转换,直接跳转到用户程序执行。
ARM 处理器在复位后处于特权模式,可以在复位处理子程序中完成对各处理器堆栈指针的初始化
- 将处理器模式切换到相应的处理器模式,
- 设置堆栈指针,此时对 SP 的访问即是对该处理器模式下堆栈指针的访问。
4 映像文件地址影射
ARM 链接器将目标文件与相应的 C /C + + 运行时库连接处理后生成 ELF 格式的映像文件。
映像文件在存储区域中的地址有两种: 加载时地址和运行时地址。
具体实现方法有两种: 一是通过链接器命令行,这只应用于比较简单的场合; 二是通过分散加载文件,该方法比较灵活,这里着重介绍第二种方法。现给出一个分散加载文件,
代码如下:
加载时域 ROM 地址为 0x00
运行时域 INROM、INRAM、HEAP(动态内存分配)、STACKS 地址分别为:
0x00000000、0x40000000、0x40000000 + 运行时域 INRAM 的大小、0x40004000
16KB RAM 对应存储区域为 0x40000000 ~ 0x40003FFF
128KB Flash 对应内存地址为 0x00000000 ~ 0x0001FFFF
按上述地址映射,所得结果如图 3 所示。
本来RO RW 和未初始化的全局变量都是在装载在ROM里的,上电运行前需要把程序加载到运行地址里,这里的RO一直放在ROM没动,INT堆栈、RW和ZI(ZI 数据区只有在运行时才建立)加载到了RAM,heap放在接着放在后面(RAM),用户堆栈放在heap后面。
在该加载文件中,INROM 运行时域地址与加载时域地址相同,所以目标文件的初始入口点还是 0x00000000。
【总结】
在系统复位后,程序从 0x00000000 处开始执行,
即跳转至复位处理子程序(ResetHandler)执行,
在ResetHandler中,首先设置了各处理器模式堆栈指针(InitStack),然后调用系统提供的__main( ) 函数,由 C 运行时库进行应用程序初始化
最后进入用户 main( ) 函数开始应用程序的运行。
参考文献
[1]孙昊,曹玉强,杜秀芳.ARM处理器启动代码的分析与编程[J].工业控制计算机,2005(11):54-55.
[2]梁斌,司扬,张爱军.ARM处理器启动代码分析与设计[J].青海大学学报(自然科版),2011,29(03):10-14.DOI:10.13901/j.cnki.qhwxxbzk.2011.03.003.