Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1028805
  • 博文数量: 166
  • 博客积分: 10217
  • 博客等级: 上将
  • 技术积分: 2133
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-09 19:45
文章分类

全部博文(166)

文章存档

2012年(3)

2011年(7)

2010年(18)

2009年(59)

2008年(79)

我的朋友

分类: LINUX

2009-12-15 18:01:53

存储器地址重映射是当前很多先进控制器所具有的功能。在上一节中已经提
到了0 地址处存储器重映射的例子,简而言之,地址重映射就是可以通过软件配
置来改变一块存储器物理地址的一种机制或方法。
当一段程序对运行自己的存储器进行重映射的时候,需要特别注意保证程序
执行流程在重映射前后的承接关系。下面是一种典型的存储器地址重映射情况:
 
系统上电后的缺省状态是0 地址上放有ROM,这块ROM 有两个地址:从0
起始和从0x10000 起始,里面存储了初始化代码。当进行地址remap 以后,从0
起始的地址被定向到了RAM 上,ROM 则只保留有唯一的从0x10000 起始的地
址了。
如果存储在ROM 里的Reset_Handler 一直在0 – 0x4000 的地址上运行,则
当执行完remap 以后,下面的指令将从RAM 里预取,必然会导致程序执行流程
的中断。根据系统特点,可以用下面的办法来解决这个问题:
(1) 上电后系统从0 地址开始自动执行,设计跳转指令在remap 发生前使PC指针指向0x10000 开始的ROM 地址中去,因为不同地址指向的是同一块ROM,所以程序能够顺利执行。
(2) 这时候0 - 0x4000 的地址空间空闲,不被程序引用,执行remap 后把RAM
引进。因为程序一直在0x10000 起始的ROM 空间里运行,remap 对运行流程没有任何影响。
(3) 通过在ROM 里运行的程序,对RAM 进行相应的代码和数据拷贝,完成应用程序运行的初始化。
下面是一段实现上述步骤的例程:
 
--------------------------------------------------------------------------------
ENTRY
;启动时,从0 开始,设法跳转到“真”的ROM 地址(0x10000 开始的空间里)
LDR pc, =start
;insert vector table here

Start ;Begin of Reset_Handler
; 进行remap 设置
LDR r1, =Ctrl_reg ;假定控制remap 的寄存器
LDR r0, [r1]
ORR r0, r0, #Remap_bit ;假定对控制寄存器进行remap 设置
STR r0, [r1]
;接下去可以进行从ROM 到RAM 的代码和数据拷贝
--------------------------------------------------------------------------------

除此之外,还有另外一种常见的remap 方式,如下图:
 
原来RAM 和ROM 各有自己的地址,进行重映射以后RAM 和ROM 的地址
都发生了变化,这种情况下,可以采用以下的方案:
(1) 上电后,从0 地址的ROM 开始往下执行。
(2) 根据映射前的地址,对RAM 进行必要的代码和数据拷贝。
(3) 拷贝完成后,进行remap 操作。
(4) 因为RAM 在remap 前准备好了内容,使得PC 指针能继续在RAM 里取
到正确的指令。
不同的系统可能会有多种灵活的remap 方案,根据上面提到的两个例子,可以总结出最根本的考虑是:要使程序指针在remap 以后能继续往下得到正确的指令。
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jianshe999/archive/2008/03/07/2157062.aspx
阅读(2140) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~