首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM remap与重定位摘抄(2)

ARM remap与重定位摘抄(2)

②初始化系统堆栈。在ARM7的体系结构中共有七种工作模式,不同的模式有不同堆栈指针,互不干扰。各模式对应于不同异常中断,至于哪些模式的堆栈需要初始化取决于用户使用了哪些中断,以及系统需要处理些异常类型。一般来说,管理者(SVC)堆栈必须设置,如果使用了IRQ中断,则IRQ堆栈也必须设置。有一点需要注意的是,为保证Remap后程序运行正常,所有堆栈应设置在RAM的高端地址中。
③初始化I/O口、UART、定时器、中断控制器以及系统中所用到的其它资源。在初始化异常向量表或修改异常向量表中的入口地址前,要关掉所有中断。
   ④异常向量表的初始化。将民常中煌怛处理程序的入口地址写入RAM中相应的异常向量。必须保证的是,异常向量表绝对不会被从ROM搬移到RAM中的代码和数据所覆盖,为此,异常向量表一般被定义在RAM中的高端地址中。
⑤程序代码及数据的搬移。Remap后,RAM被映射到0x0000的地址空间,ROM则被移到高端地址上。为保证Remap后程序能够瞠运行,ROM中的代码和数据必须地址不变地被移到RAM中。这是Remap成功的关键。两种途径可以实现搬移。
一种是不管实际的代码空间有多大,直接将ROM地址空间整个搬移到RAM中。当然,这种方法并不适合在真正的启动代码中使用,但在做初步的Remap测试时,可以用来检验堆栈及异常中断的设置是否合理。
另一种方法较复杂,它使用了SDT链接器ARMLink产生的定位信息,仅把RO风吹草动的有效代码和数据段到RAM中。ARMLink将编译后的程序链接成ELF文件。映像文件内部共有三种输出段:RO段、RW段和ZI段。这三种输出段分别包含了只读代码及包含在代码段中的少量数据、可读写的数据、初始化为0的数据,ARMLink同时还产生了这三种输出段的起始和终止定位信息:Image$$RO$$Base、Image$$RO$$Limit、Image$$RW$$Base、Image$$Limit、Image$$Linit和Image$$ZI$$Limit。可以在程序中使用这些定位信息。将ROM中的代码和数据搬移到RAM中,其实现代码如下:
数据定义:
BaseOfROMDCD|Image$$RO$$Base|
TopOfROMDCD|Image$$RO$$Limit|
BaseOfBSSDCD|Image$$RW$$Base|
BaseOfZeroDCD|Image$$ZI$$Base|
EndOfBSSDCD|Image$$ZI$$Limit|
源程序:
;将ROM中的程序搬移到RAM中,重映射后的地址不变
adrr0,ResetEntry;ROM中程序起始地址
movr3,#(RamBaseAddr<<16);RamBaseAddr=0x100
Idrr1,BaseOfROM
Idrr2,TopOfROM
Addr1,r1,r3
Addr2,r2,r3
0
Idmiar0!,{r4-r11}
Stmiar1!,{r4-r11}
Cmpr1,r2
Bcc%B0
;将RW段中预初始化的变量搬移到RAM中
subr1,r1,r2
subr0,r0,r1;将r0指向RO段的结束,即RW段的开始
ldrr1,BaseOfBSS
Idrr2,BaseOfZero
Addr1,r1,3
Addr2,r2,r3
1;基于局部标号的相对跳转,PC+偏移地址,产生与位置无关的代码
cmpr1,r2
ldrccr4,[r0],#4
strccr4,[r1],#4
bcc%B1
;接着把ZI段搬移到RAM中,并其将初始化为0
movr0,#0
Idrr2,EndOfBSS
Addr2,r2,r3
2
cmpr1,2
strccr0,[r1],#4
bcc%B2
⑥地址的重新映射。S3C4510B中的Remap过程其实很简单,只需重新设置ROMCON0~ROMCON5和DRAMCON0~DRAMCON3。在本系统中只需重新设置ROMCON0和DRAMCON0。
源代码:
;/*内存控制寄存器重新设置-存储空间重新映射地址空间*/
EXPORTRemapMemory
RemapMemory
movr12,r14
adrr0,RemapMem
ldmiar0,{r1-r11}
ldrr0,=ROMCON0;ROMCON0为Bank寄存器的起始地址
stmiar0,{r1-r11}
blExceptionTalbeInit;中断向量表重新初始化
movpc,r12
RemapMem
DCD&11040060;/*ROMCON00x1000000~0x1100000*/

DCD&10000398;/*DRACON00x0~0x1000000*/

⑦进入C代码空间,开始主程序的运行。此时代码应该运行于RAM中。
   上面的步骤可以根据实际需要进行适当的添加或删节。值得注意的是:汇编生成的代码应该是与位置无关的代码,即代码在运行期间可以被映射到不同的地址空间,其中的跳转指令都是基于PC寄存器的相对跳转指令。基于PC的标号是位于目标指令前或者程序中数据定义伪操作前的标号,这种符号在汇编时将被处理成PC值加上或减去一个数字常量。
3异常中断的处理
在Remap的启动代码中,需要特别注意的是异常中断的处理。在S3C4510B中,异常中断的入口地址是固定的,按表1次序排列。
继承事业,薪火相传
返回列表