ARM启动代码

 1简介

ARM 启动代码主要包含系统环境初始化应用程序初始化

系统环境初始化主要完成:

  • 设置目标代码初始入口点
  • 中断向量初始化
  • 数据堆栈初始化
  • 存储系统及关键 I/O 端口初始化
  • 初始化异常中断所需 RAM 变量
  • 使能异常中断
  • 根据需要切换处理器模式或状态

应用程序初始化主要完成:

  • 将已初始化的数据段转移至可写数据区(ROM->RAM)
  • 在可写存储区建立 ZI 属性的可写数据区

ARM 启动代码序列如图 1 所示:

2中断向量表设计

ARM 处理器共有 7 种异常中断类型,其对应向量地址如表 1 所示

中断向量表实现代码如下:

EXPORT bottom_of_heap
EXPORT StackUser
EXPORT __user_initial_stackheap
//在汇编语言中, EXPORT用于告诉汇编器将标识符(通常是变量、标签或函数)导出到目标文件
这些导出的标识符通常是在链接阶段使用的,允许其他模块或文件引用它们。
CODE32
//`CODE32`: 这是一个用于指定指令集的伪指令。`CODE32` 通常用于指定使用 32 位指令集
AREA IntVector CODE READONLY
//定义了一个名为 `IntVector` 的代码区域,表明这个区域包含可执行代码。`READONLY` 表示这个区域是只读的,其中的指令不允许被修改。
ENTRY
//这个代码区域是程序执行的入口点
LDR PC ResetAddr                                                                      (1 )
LDR PC UndefinedAddr
LDR PC SWI_Addr
LDR PC PrefetchAddr
LDR PC DataAbortAddr

//装载地址到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]

DCD 0xB9205F80                                                                            (2 )
// 将向量表中保留字 ( 0x14 地址 ) 定义为 0xB9205F80 即可满足用户有效代码条件
LDR PC ,[ PC ,# - 0xFF0]                                                      ( 3 )
//当程序执行到指令( 3) 时,PC 值为 0x00000020,因此,PC - #0xFF0 =0xFFFFF030,将 VIDVectAddr 中保存地址值送入 PC,保证最高优先级,实现程序跳转
LDR PC FIQ_Addr 
ResetAddr DCD ResetHandler                                                                                    (4)
UndefinedAddr DCD UndefinedHandler
SWI_Addr DCD SWI_Handler
PrefetchAddr DCD PrefetchHandler
DataAbortAddr DCD DataAbortHandler
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
//赋值伪指令

3 堆栈指针设计

ARM 处理器共有 7 种运行模式,其对应 CPSR 中控制位如表 2 所示。

User 模式和 System 模式共用一组寄存器,各异常模式有独立的堆栈指针寄存器( SP_mode) 及连接寄存器( LR_mode) ,如果应用程序使用异常中断,ARM 启动代码必须根据实际情况设置相应处 理器模式堆栈指针。具体实现代码如下:

ResetHandler
        BL InitStack
        B __main
//跳转
StackIrq DCD IrqStackSpace + ( 256 - 1) * 4
//定义了一个名为 StackIrq 的数据,它的值是 IrqStackSpace 的地址加上 (256 - 1) * 4
AREA IntStacks,DATA,NOINIT
//定义了名为 IntStacks 的数据区域,表示这是一个用于存储数据的区域,不需要初始化。
IrqStackSpace SPACE 256 * 4 AREA UserStack,DATA,NOINIT
//义了一个名为 IrqStackSpace 的区域,它是一个 256 个 4 字节单元的区域
AREA UserStack,DATA,NOINIT
StackUser SPACE 1
//定义了一个名为 StackUser 的区域,它是一个 1 个单元的区域

在上述示例中,只给出了 IRQ及用户模式堆栈指针的初始化,为设置不同处理器模式下的堆栈指针,需要在不同处理器模式 之间进行切换,这就需要用 MSR 指令对 CPSR 寄存器进行设置,但只能在特权处理器模式下才能对CPSR 寄存器进行访问。

在上述程序段中,用户模式堆栈指针的设置放在最后,这主要考虑到用户程序运行于用户模式下,在该子程序返回后,无须进行处理器模式转换,直接跳转到用户程序执行。

ARM 处理器在复位后处于特权模式,可以在复位处理子程序中完成对各处理器堆栈指针的初始化

  • 将处理器模式切换到相应的处理器模式,
  • 设置堆栈指针,此时对 SP 的访问即是对该处理器模式下堆栈指针的访问。
如果在应用程序中使用了 C /C + + 运行时库 则必须重载函数 __user_initial_stackheap 该函数向 C /C + + 运行时库传递可用于数据堆的存储区域 具体实现代码如下 :
; Startup. s 源文件
AREA
HeapStack DATA NOINIT
bottom_of_heap
SPACE
1
__user_initial_stackheap
LDR
R0 = bottom_of_heap
MOV PC LR
END

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值