地址重映射在ARM系统中的实现
2.2 系统启动过程及Remap实现
系统的地址重映射应该在系统的启动中完成,以下是S3C4510B的Remap启动过程。
①系统特殊寄存器的设置。主要是配置如上所述的用于实现地址空间和芯片内外存储介质映射的寄存器,在本系统中配置如下:
SYSCFG=0x87ffff90
EXTDBWTH=0x3001
ROMCON0=0x01000060
ROMCON1=0x13044060
DRAMCON0=0x11004060
②初始化系统堆栈。在ARM7的体系结构中共有七种工作模式,不同的模式有不贩堆栈指针,互不干扰。各模式对应于不贩异常中断,至于哪些模式的堆栈需要初始化取决于用户使用了哪些中断,以及系统需要处理些异常类型。一般来说,管理者(SVC)堆栈必须设置,如果使用了IRQ中断,则IRQ堆栈也必须设置。有一点需要注意的是,为保证Remap后程序运行正常,所有堆栈应设置在RAM的高端地址中。
③初始化I/O口、UART、定时器、中断控制器以及系统中所用到的其它资源。在初始化异常向量表或修改异常向量表中的入口地址前,要关掉所有中断。
⑤程序代码及数据的搬移。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中,其实现代码如下: 数据定义: BaseOfROM DCD Image$$RO$$Base TopOfROM DCD Image$$RO$$Limit BaseOfBSS DCD Image$$RW$$Base BaseOfZero DCD Image$$ZI$$Base EndOfBSS DCD Image$$ZI$$Limit 源程序: ;将ROM中的程序搬移到RAM中,重映射后的地址不变 adr r0,ResetEntry ;ROM中程序起始地址 mov r3,#(RamBaseAddr16) ;RamBaseAddr=0x100 Idr r1,BaseOfROM Idr r2,TopOfROM Add r1,r1,r3 Add r2,r2,r3 0 Idmia r0!,{r4-r11} Stmia r1!,{r4-r11} Cmp r1,r2 Bcc%B0 ;将RW段中预初始化的变量搬移到RAM中 sub r1,r1,r2 sub r0,r0,r1 ;将r0指向RO段的结束,即RW段的开始 ldr r1,BaseOfBSS Idr r2,BaseOfZero Add r1,r1,3 Add r2,r2,r3 1 ;基于局部标号的相对跳转,PC+偏移地址,产生与位置无关的代码 cmp r1,r2 ldrcc r4,[r0],#4 strcc r4,[r1],#4 bcc %B1
④异常向量表的初始化。将民常中煌怛处理程序的入口地址写入RAM中相应的异常向量。必须保证的是,异常向量表绝对不会被从ROM搬移到RAM中的代码和数据所覆盖,为此,异常向量表一般被定义在RAM中的高端地址中。
评论