Remap Memory技术
一.为什么要引入remap
随着半导体工艺技术与处理器设计技术的不断提高,嵌入式处理器的速度愈来愈快;而非易失性存储器的读取速度却远远跟不上CPU的发展。传统的单片机运行模 式——机器代码存储在非易失性存储器(如ROM,FLASH),在运行时由CPU直接从其中取出指令执行——逐渐显得力不从心。如果继续沿用传统的程序运 行模式,那么在绝大多数时间内高速CPU将处于空闲等待状态,这既浪费了CPU的计算能力,也无法实现高密度数据流的实时处理与传输。而在短期之内,半导 体工业界尚无法实现低成本的非易失性高速存储器技术。为了解决上述处理器和非易失性存储器之间速度不匹配的矛盾,工程师们在嵌入式系统领域内引用了 Boot技术和Remap技术。而要正确理解Boot技术和Remap技术,必须先建立Memory Map(存储器映射)的概念。
二.概念描述
Memory Map
计算机最重要的功能单元之一是Memory。Memory是众多存储单元的集合,为了使CPU准确地找到存储有某个信息的存储单元,必须为这些单元分配一 个相互区别的“身份证号”,这个“身份证号”就是地址编码。在嵌入式处理器内,集成了多种类型的Memory,通常,我们称同一类型的Memory为一个 Memory Block。一般情况下,处理器设计者会为每一个Memory Block分配一个数值连续、数目与其存储单元数相等、以16进制表示的自 然数集合作为该Memory Block的地址编码。这种自然数集合与Memory Block的对应关系,就是Memory Map(存储器映射),有 时也叫Address Map(地址映射)。实际上,Address Map在字面意义上更加贴切。
需要强调的是, Memory Map是一个逻辑概念,是计算机系统在(上电)复位后才建立起来的。Memory Map相当于这样一个数学函数:函数的输入量是地址编 码,输出量被寻址单元中的数据。当计算机系统掉电后或复位时,这个数学函数不复存在,只剩下计算机系统中实现这个数学函数的物理基础——电路连接。也可以 这样认为:Memory Map是计算机系统(上电)复位时的预备动作,是一个将CPU所拥有的地址编码资源向系统内各个物理存储器块分配的自动过程。
Boot 在计算机专业英文中的意思是“引导”,它是计算机系统(上电)复位后CPU的第一个机器动作。那么,Boot引导的是什么呢?简要地说,Boot就是引导 CPU如何装入机器指令。最简单的Boot动作就是8位单片机系统复位后从复位向量中取出跳转指令,转移到用户程序代码段执行的这个过程。
通常,在计算机系统中,(上电)复位后除了执行Boot动作,还跟随着一个Load过程。一般情况下,该Load从低速非易失性存储器中“搬运”一些数据 到高速易失性存储器中。Boot和Load连续执行,一气呵成,我们称之为Bootload。最典型的例子之一就是DSP实时信号处理系统,系统上电后, 将存储在EEPROM中的实时信号处理程序复制到系统的RAM中,然后CPU直接从RAM中读取机器指令运行。
Remap
Remap与计算机的异常处理机制是紧密相关的。
完整的计算机系统必须具备异常处理能力。当异常产生时,CPU在硬件驱动机制下跳转到预先设定的存储器单元中,取出相应的异常处理程序的入口地址, 并根 据该入口地址进入异常处理程序。这个保存有异常处理程序入口地址的存储器单元就是通常所说的“异常入口”,单片机系统中也叫“中断入口”。实际的计算机系 统有多种类型的异常,CPU设计人员为了简化芯片设计,一般将所有的异常入口集中起来置于非易失性存储器中,并在系统上电时映射到一个固定的连续地址空间 上。位于这个地址空间上的异常入口集合就是“异常向量表”。
系统上电后的异常向量表是从低速非易失性存储器映射得到的。随着处理 器速度的不断提高,很自然地,人们希望计算机系统在异常处理时也充分发挥出CPU的处理能力,而非易失性存储器的读取速度使得CPU只能以多个空闲等待同 期来获取异常向量,这样就限制了CPU计算能力的充分发挥。尤其是非易失性存储器位宽小于CPU位宽时,这种负面的影响更加明显。于是,Remap技术被 引入,以提高系统对异常的实时响应能力。
从Remap这个英文单词的构成不难看出,它是对此前已确立的存储器映射的再次修改。从 本质上讲,Map和Remap是一样的,都是将地址编码资源分配给存储器块,只不过二者产生的时间不同:前者在系统上电的时刻发生,是任何计算机系统都必 需的;而后者在系统上电后稳定运行的时刻发生,对计算机系统设计人员来说是可选的。典型的8位单片机系统中,就没有使用Remap技术。
完整的Remap过程实际上通常始于系统的Bootload过程。具体执行动作为:Bootload将非易失性存储器中的异常向量复制到高速易失性存储器 块的一端,然后执行Remap命令,将位于高速易失性存储器中的异常向量块映射到异常向量表地址空间上。此后,系统若产生异常,CPU将从已映射到异常微 量表地址空间的高速非易失性存储器中读取异常向量。具体到典型的ARM7嵌入式系统中,就是由Bootload程序将片内或片外的Flash/ROM中的 异常向量复制到片内的SRAM中指定的存在器单元中,然后再执行Remap命令。由于片内的SRAM数据位宽通常与CPU数据位宽相等,因而CPU可以无 等待地全速跳入异常处理程序,获得最佳的实时异常响应。
评 论
cxl84 发表于 2007-12-14 21:01:00
EET网友对remap概念的解释: ------------------------------------------- 0.什么是Remap 我的理解是:在ROM从0x0用几句指令引导系统之后,把RAM映射到0x0就是Remap。 1.Remap的作用 当ARM处理器上电或者Reset之后,处理器从0x0取指。因此,必须保证系统上电时, 0x0处有指令可以执行。所以,上电的时候,0x0地址处必定是ROM或者Flash(NOR)。 但是,为了加快启动的速度,也方便可以更改异常向量表,加快中断响应速度,往 往把异常向量表映射到更快、更宽(32bit/16bit)的RAM中。但是异常向量表的开始地 址是由ARM架构决定的,必须位于0x0处,因此,必须把RAM映射到0x0。 2.Remap的配置 Remap的实现和ARM处理器的实现相关。 1)如果处理器有专门的寄存器可以完成Remap。那么Remap是通过Remap寄存器的相 应bit置1完成的。如Atmel AT91xx 2)如果处理器没有专门的寄存器,但是memory的bank控制寄存器可以用来配置bank 的起始地址,那么只要把RAM的起始地址编程为0x0,也可以完成remap。如samsung s3c4510 3)如果上面两种机制都没有,那么Remap就不要做了。因为处理器实现决定了SDRAM 对应的bank地址是不能改变的。如Samsung S3c2410. 3.Remap配置前后要做的工作 Remap前后,不同之处就是RAM的位置变了。为了达到Remap的目的,就是加快启动的 速度和异常处理速度,一定要初始化异常堆栈和建立异常向量表的。 4.如果象2410那样不能Remap的话怎么办? 2410不是不能Remap吗?为了加快启动速度,可以这样做 1)使用它的NAND boot模式。为什么NAND boot会比较快,那是因为2410里面有块小 石头——“SteppingStone”,一块4KB SRAM,它是映射在0x0的。启动程序会自动被cop y到这个石头里面。自然异常向量的入口放到这个地方,一样可以达到比NOR boot快的启 动、异常响应速度。 2)如果你对NOR Boot情有独衷,那么你只好把你的异常向量的入口copy到SDRAM里 面,实现所谓的High Vector