- 4
- 0
- 约 6页
- 2017-06-18 发布于湖北
- 举报
ARM 处理器的Boot 与Remap
于克兵,吕志明
中国地质大学(北京),北京(100083 )
E-mail :yukebing555@163.com
摘 要:以ARM 为处理器的嵌入式系统,在进入操作系统之前需要执行一段初始化代码,
叫做Boot 。它主要负责系统的初始化,包括:中断向量初始化、时钟初始化、MPU 初始化、
各种处理器模式的堆栈初始化和Image 文件的RW 段与ZI 段的初始化。处理器每次处理中
断都要从非易失性存储器读中断向量表,Remap (重映射)操作可以把中断向量表映射到更
快、更宽的RAM 中,从而加快了启动速度和中断响应速度,也使更改中断向量表成为可能。
关键词:Boot ,Remap ,中断向量表,嵌入式系统
中图分类号:TP368 文献标识码:A
1. 引言
Boot 的意思是“引导”,它是嵌入式系统上电或复位后处理器最开始执行的动作。Boot
的作用是将处理器引导至操作系统的入口,但是在进入操作系统之前引导程序需要做一些必
要的初始化。这些初始化代码是操作系统在处理器上正常运行的必要条件,也是操作系统和
硬件平台的连接纽带。由于和硬件紧密相关,所以这部分代码一般采用ARM 的汇编指令编
程实现。
系统每次上电或复位后,处理器都会从 0x0 地址处取指,因此必须保证 0x0 地址处有
可以正常执行的指令。一般厂商会将中断向量表固化到ROM (或其它非易失性存储器)里,
并将ROM 的地址映射到0x0 。但是,为了加快启动速度和中断响应速度,也方便可以更改
中断向量表,往往把向量表映射到RAM 中。但是中断向量表的开始地址是由ARM 架构决
定的,必须位于0x0 处,因此,必须把RAM 映射到0x0,这个过程就叫Remap 。
2. Boot 引导程序
任何嵌入式系统都不可避免的用到Boot 引导程序,引导程序是从系统上电到进入操作
系统之前的一段初始化代码,本节将对这段初始化代码的各个组成部分进行说明,着重论述
中断向量表与Image 文件的分散加载。
2.1 中断向量表
一个完整的嵌入式系统必须具备异常中断处理能力。ARM 体系结构中由7 种中断向量
和一个保留向量空间组成32 位的中断向量表[1],该表按一定顺序放到0x0 地址处。中断向
量表的作用就是保证有中断发生时,处理器能找到相应的中断处理函数。表中每一项存放的
其实是一条跳转指令或向PC 寄存器赋值的数据访问指令。当某个中断发生时,由系统硬件
强制程序跳转到中断向量表的对应位置,执行该地址处的跳转指令,跳转到中断处理函数,
进行中断处理。
中断向量表中的跳转指令实现方法常用的有两种:B 指令跳转和LDR 伪指令跳转。
B 指令为ARM 的RISC 单字指令,能实现的跳转空间最大为32MB,指令使用相对简
单。
LDR 伪指令等效生成1 条存储读取指令和1 条32 位常数定义指令[1] 。32 位常数存储在
LDR 指令附近的存储单元中,相对偏移小于4KB 。该32 位数据就是要跳转到的中断服务程
序入口地址。跳转的范围是任意32 位地址空间。如图 1 所示。
- 1 -
[2]
有些场合只适合用LDR 伪指令而不适合B 指令 :
1、B 指令不易实现被简单复制,因为,这时B 指令中的地址为相对偏移地址,在编译器编
译之后就确定了偏移值,如果B 指令被复制到其他地址将会出现错误。
2 、B 指令的跳转范围小于32MB,这样,如果异常中断处理程序起始地址大于32MB 就不
适合使用B 指令。
图1 跳转指令
2.2 分散加载
ARM 中源文件经过ARM 编译器编译后生成ELF 格式目标文件。这些目标文件和
相关联的C/C++运行时库经过ARM 连接器处理后,生成ELF 格式的映像文件(image )。
2.2.1 ARM 映像文件的组成
原创力文档

文档评论(0)