嵌入式系统ARM的通用bootloader的设计与实现 第7页
设支持,阶段1的代码可以文护不变,只对阶段2的代码进行修改;若要支持不同的CPU,则基础代码只需在阶段1中修改。
4.2.2 地址规划设计
当bootloader阶段设计好之后,需要考虑的是镜像存储的地址分配:总镜像保存在什么地方,阶段2对应的镜像会被拷贝到什么地方;内核镜像原先存放在什么地方,bootloader会把它又重新加载到什么地方;如何进行准确的地址规划以保证没有相互冲突等等,这些都是本节需要考虑的范畴。
PXA255的地址空间是统一寻址的,对于本课题的硬件系统,外接32M的FLASH,由片选信号CS0选择,因此映射到物理地址的0x00000000处;对于64M的SDRAM,则对应PXA255的SDRAM BANK0,映射到0xa0000000处。
PXA255系统复位后,从物理地址的0x00000000开始执行第一段代码,这个地址是由 CPU制造商预先安排的。而我们基于PXA255构建的系统将固态存储设备FLASH映射到这个地址上。当Bootloader放到FLASH的起始处后,系统加电或者复位后,CPU将首先执行bootloader程序。
本文所使用的内核镜像以及根文件系统镜像都被加载到SDRAM中运行,这样做是因为基于运行速度的考虑,尽管在嵌入式系统中内核镜像与根文件系统镜像也可以直接在ROM或FLASH这样的固态存储设备中直接运行。所以毕业论文
http://www.Lwfree.cn终生成一个可执行镜像,但是为了更能清楚的解释其实现流程,在此虚拟地将其与启动阶段相对应起来,分成两个镜像:镜像1和镜像2(事实上,在编译过程中是会形成这两个镜像,除了一个总的镜像镜像1,还有被拷贝至SDRAM中的镜像2)。在本课题中,将物理地址的0x00000000-0x00040000存放bootloader的镜像,内核镜像放在物理地址开始0x000c0000之后的1M空间内(内核镜像一般都小于1M大小);在前面的阶段设计中已经谈及镜像2在SDRAM中运行,这样bootloader的启动速度会大大加快,因此本课题将镜像2放在SDRAM的起始地址0xa0000000处运行;而内核镜像则规划至物理地址的0xa0300000处执行(放在这边是基于这样的考虑:linux内核会在SDRAM开始处存放一些全局数据结构,比如启动参数和内核页表等,所以预留一段空间)。
4.2.3 模式设计
对于普通用户来说只需要bootloader的启动加载模式,但是对于开发者来说,则需要下载模式,因为他们需要时时刻刻地进行一些镜像的更新。为了在两者之间做到兼顾,本课题既支持启动加载模式,也支持下载模式,具体思路为:在bootloader做完一些硬件初始化工作后,而在加载内核镜像之前,先在一定的时间内等待有没有用户有键盘输入,如果没有,则为启动加载模式,直接加载内核镜像进行启动;如果有,则进入命令行格式,这时开发者就可以根据自己的需要以及bootloader的支持情况,做一些其他的工作。模式的转换设计主要在阶段2中实现。
综合起来,整个bootloader的实现流程可以如下图所示:
4.3 Bootloader的具体实现
从本节开始介绍本课题的bootloader的具体代码实现。
4.3.1 阶段1的代码实现
阶段1通常包括以下步骤(以执行的先后顺序):
一些本文来自优文论文网基本硬件的初始化工作
为加载镜像2准备RAM空间(RAM足够的情况下可以省略)
把镜像2拷贝到RAM空间
跳转到镜像2的入口点(一般是C入口点)
下面结合相关具体代码描述相关的实现,其中涉及到的汇编代码可以参考ARM指令
集,涉及到的对PXA255协处理器的操作可以参考参考文献中相关的介绍。
本课题将阶段1中的这段汇编文件命名为rom_reset.s。
和一般的汇编一样,首先要做的是一些伪代码:
(1)定义ARM各模式的栈大小。
.equ MonStackSz, 4096
.equ FiqStackSz, 4096
.equ IrqStackSz, 4096
.equ AbtStackSz, 4096
.equ UndStackSz, 4096
.equ SysStackSz, 4096
(2)申明各模式的栈。.global MonStack
.global FiqStack
.global IrqStack
.global AbtStack
.global UndStack
.global SysStack
(3)将各模式的栈与栈大小结合起来,即为各栈分配栈大小。
.comm MonStack, MonStackSz
.comm FiqStack, FiqStackSz
.comm IrqStack, IrqStackSz
.comm AbtStack, AbtStackSz
.comm UndStack, UndStackSz
.comm SysStack, SysStackSz
(4)接着就是申明一些标号量(代码略)。
这些基本工作做完之后,开始进入真正的初始化工作,标识为正文段(.text段,见后
面连接章节)。
以reset标号标识,一开始处设置异常中断向量表,当是冷启动时,直接跳转至对应处进行启动:
reset:
b coldstart
b 毕业论文http://www.Lwfree.cn
b abort_data
b not_used
b interrupt_request
b fast_interrupt_request
系统正常启动,都属于冷启动,程序直接跳转至coldstart标号处执行。接着完成的功能
包括:
1. 使能各协处理器,PXA255中很多特殊功能都需要借助于协处理器,比如存储管理。
ldr r0, =0x2001
mcr p15,0,r0,c15,c1,0
2. 关闭MMU,内部指令/数据cache以及写缓冲区,ARM体系bootloader中都无需MMU的功能,所有的地址都直接使用物理地址;cache也都关闭,原因可参看上一章相关内容 。
ldr r0, =0x00000078mcr p15,0,r0,c1,c0,0
3. 清空TLB,Caches以及写缓冲区,当系统冷启动时所有的保留数据都以无效处理,因此都要清空,况且cache都已经关闭。
ldr r0, =0x00000000
mcr p15,0,r0,c8,c7,0
mcr p15,0,r0,c7,c7,0
mcr p15,0,r0,c7,c10,4
4. 开系统各存储空间域的访问权限;ARM体系中系统的存储空间分为最多的16个域,每个域对应一定的内存区域,该区域具有相同的访问控制属性。MMU中寄存器C3用于控制与域相关属性的配置。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 下一页
嵌入式系统ARM的通用bootloader的设计与实现 第7页下载如图片无法显示或论文不完整,请联系qq752018766