关于ARM的内存重映射

25 May 2009

先说说存储器映射:
所谓存储器映射,是指将开发板上不同的存储器映射到开发人员可见的4GB地址空间上,例如,假设开发板上有一个32KB的片内FLASH,16KB的片内SRAM(纯属虚构,如有雷同,纯属巧合),那么,将32KBFLASH映射到地址空间的0x00000000~0x0x00008FFF上,将16KB的SRAM映射到x40000000~0x40004fff上,这样开发者在读写0x00000000~0x00008fff内的地址时,访问的就是片内FLASH,不同开发板的映射规则是开发板厂商事先设定好的。


下面说说什么是重映射:
重映射分为中断向量的重映射和boot的重映射
首先说说中断向量重映射
ARM中中断向量的地址位于0x00000000~0x0000003c(每个向量占4字节,但是为了能够实现4GB范围内的任意跳转,通常在中断向量表后附加一个跳转地址空间,跳转空间占4字节,因此,总的中断向量表大小为64B,不熟悉的自己查查ARM的中断向量吧,不多说了)。注意,这里所说的0x0000000~0x0000003C指的是用户可见的4GB地址空间(也就是上面所说的存储器映射后的地址空间),真正的中断向量位于哪块存贮器的哪个地址上可不一定(不过通常都是为与片内FLASH的底部),因此,需要将不同存储器的中断向量表映射到0x00000000~0x0000003c的地址上。另外,还有一次中断向量的映射,在用户RAM的映射模式(稍后说映射模式)下,需要将中断向量映射到静态RAM的底部(很明显,这样能够提高访问速度)。
下面是boot的重映射
这里所说的boot不是bootloader,而是厂商实现内嵌到板子中的一段代码,用于执行对FLASH的读写,擦除等任务,通常位于片内存储器上,但是不同的板子上存储器的大小不同,为了程序的兼容,通常需要将boottblock重映射到存储空间的顶端。

最后说一下映射模式:
ARM中支持4中映射模式,由存储器控制寄存器控制
四种模式为:
1.boot装载程序模式:在任何复位操作后都会执行Boot装载程序。Bootblock中中断向量映射到存储器的底端以允许处理异常,并在Boot装载过程中使用中断。
2.用户FLASH模式:当在存储器中识别了一个有效的用户程序标识并且Boot装载操作未被执行时,由Boot装载程序启动。中断向量没有重新映射,位于Flash的存储器底部
3.用户Flash:中断向量被映射到静态RAM的底部
4.用户外部模式:中断向量有外部存储器映射到存储空间底部。

大概就这些,该上课去了,全是个人揣摩,有错请轻拍:)



blog comments powered by Disqus