启动代码通常烧写在flash上,它是系统一上电就能够执行的一段程序,它运行在任何用户C代码之前,上电后ARM处理器处于ARM态,运行于管理模式,同时系统的所有中断被禁止,PC到地址0处取指令执行,一个可执行映像文件必须有一个入口点,而能够放在ROM起始处的映像文件的入口地址也必须设置为0
启动代码主要完成两方面的工作:
- 初始化执行环境 中断向量表 堆栈 I/O接口
- 初始化C库 和用户的应用程序
启动代码的任务可以详细描述为
- 建立中断向量表
- 初始化存储器
- 初始化堆栈寄存器
- 初始化I/O以及其他必要的设备
- 建立需要改变的处理器状态
建立中断向量表
初始化代码必须建立好中断向量表,以备应用程序后续使用,如果系统的地址0处是ROM,则中断向量表是一些跳性的指令就好了,他们转到相应的中断处理函数执行,如果系统的0地址不是RAM那么中断向量表则通过动态的方式进行创建,这主要通过存储器的映射来实现,即上电后ROM中的地址被映射到地址0它首先开始执行以便完成环境的初始化,最重要的是它会将中断向量表拷贝到RAM中,然后通过地址映射将RAM的地址映射为0这样RAM中的中断向量就可以使用了
初始化存储系统
对于MMU的处理器,需要正确初始化MMU只需要正确初始化存储控制器,为每一个bank配置正确的参数
初始化堆栈指针
初始化代码必须初始化处理器各个代码下的堆栈指针,所有系统或用户程序会涉及的处理器模式对应的堆栈指针都应该被初始化
通常未定义的指令和预取指终止一场对应模式的堆栈指针不需要配置,除非用户需要他们进行调试