arm linux地址映射,arm 存储器地址重映射

存储器地址重映射是当前很多先进控制器所具有的功能。在上一节中已经提

到了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 以后能继续往下得到正确的指令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值