【原创】ARM中的难啃的骨头

  • 冰山一角
  • LV5工程师
  • |      2014-07-31 14:28:30
  • 浏览量 913
  • 回复:5

 存储器映像 英文为 Memory Map    

1.什么是存储器映射?

         存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配的,给存储器分配地址的过程就称为存储器映射。在完成了存储器映射后,用户就可以按地址去访问对应的存储单元。

2.什么是存储器重新映射?

        顾名思义,存储器重映射就是给存储单元再分配 1 个地址。此时,该存储单元就有了两个地址。用户可以通过这两个地址来访问该存储单元。

3.为什么要进行存储器重映射?       

        通过赋予每个任务不同的虚拟–物理地址转换映射,支持不同任务之间的保护。

        地址转换函数在每一个任务中定义,在一个任务中的虚拟地址空间映射到物理内存的一个部分,而另一个任务的虚拟地址空间映射到物理存储器中的另外区域。...

就是把一个地址连接到另一个地址。
例如,内存单元A的地址为X,把它映射到地址Y,这样访问Y时,就可以访问到A了。当然,访问原来的地址X,也可以访问到A。

再如,在C语言等高级语言里面没有访问IO的指令,所以那样的话在C里面就无法访问IO,只能通过嵌入汇编或者通过调用系统函数来访问IO了。采用IO映射后就不同了,因为IO空间和内存空间本来不同,有不同的访问指令,那么,将IO空间映射到内存空间,就可以通过使用访问内存的方法来访问IO了,例如在C语言里面可以通过指针来访问内存单元,从而访问到被映射的IO。

存储器映射是指把芯片中或芯片外的FLASH,RAM,外设,BOOTBLOCK等进行统一编址。即用地址来表示对象。这个地址绝大多数是由厂家规定好的,用户只能用而不能改。用户只能在挂外部RAM或FLASH的情况下可进行自定义。

         ARM7TDMI的存储器映射可以有0X00000000~0XFFFFFFFF的空间,即4G的映射空间,但所有器件加起来肯定是填不满的。

        一般来说, 0X00000000依次开始存放

          FLASH——0X00000000,

          SRAM——0X40000000,

          BOOTBLOCK,

         外部存储器 0X80000000,

         VPB(低速外设地址,如GPIO,UART)——0XE0000000,

         AHB(高速外设:向量中断控制器,外部存储器控制器)——从0XFFFFFFFF回头。

         他们都是从固定位置开始编址的,而占用空间又不大,如AHB只占2MB,所以从中间有很大部分是空白区域,用户若使用这些空白区域,或者定义野指针,就可能出现取指令中止或者取数据中止。

         由于系统在上电复位时要从0X00000000 开始运行,而第一要运行的就是厂家固化在片子里的BOOTBLOCK,这是判断运行哪个存储器上的程序,检查用户代码是否有效,判断芯片是否加密,芯片是否IAP(在应用编程),芯片是否ISP(在系统编程),所以这个BOOTBLOCK要首先执行。而芯片中的BOOTBLOCK不能放在FLASH的头部,因为那要存放用户的异常向量表的,以便在运行、中断时跳到这来找入口,所以BOOTBLOCK只能放在FLSAH尾部才能好找到,呵呵。

         而ARM7的各芯片的FLASH大小又不一致,厂家为了BOOTBLOCK在芯片中的位置固定,就在编址的2G靠前编址的位置虚拟划分一个区域作为BOOTBLOCK 区域,这就是重映射,这样访问<2G即<0X80000000的位置时,就可以访问到在FLASH尾部的BOOTBLOCK区了。

         BOOTBLOCK运行完就是要运行用户自己写的启动代码了,而启动代码中最重要的就是异常向量表,这个表是放在FLASH的头部首先执行的,而异常向量表中要处理多方面的事情,包括复位、未定义指令、软中断、预取指中止、数据中止、IRQ(中断) ,FIQ (快速中断),而这个异常向量表是总表,还包括许多分散的异常向量表,比如在外部存储器,BOOTBLOCK,SRAM中固化的,不可能都由用户直接定义,所以还是需要重映射把那些异常向量表的地址映到总表中。

         为存储器分配地址的过程称为存储器映射,那么什么叫存储器重映射呢?为了增加系统的灵活性,系统中有部分地址可以同时出现在不同的地址上,这就叫做存储器重映射。

         重映射主要包括引导块“Boot Block”重映射和异常向量表的重映射。

         1.引导块“Boot Block”及其重映射 Boot Block是芯片设计厂商在LPC2000系列ARM内部固化的一段代码,用户无法对其进行修改或者删除。这段代码在复位时被首先运行,主要用来判断运行哪个存储器上面的程序,检查用户代码是否有效,判断芯片是否被加密,系统的在应用编程(IAP)以及在系统编程功能(ISP)等。 Boot Block存在于内部Flash,LPC2200系列大小为8kb,它占用了用户的Flash空间,但也有其他的LPC系列不占用FLash空间的,而部分没有内部Flash空间的ARM处理器仍然存在Boot Block。

          重映射的原因: Boot Block中有些程序可被用户调用,如擦写片内Flash的IAP代码。为了增加用户代码的可移植性,所以最好把Boot Block的代码固定的某个地址上。但由于各芯片的片内Flash大小不尽相同,如果把Boot Block的地址安排在内部Flash结束的位置上,那就无法固定Boot Block的地址。

         为了解决上面的问题,于是芯片厂家将Boot Block的地址重映射到片内存储器空间的最高端,即接近2Gb的地方,这样无论片内存储器的大小如何,都不会影响Boot Block的地址。因此当Boot Block中包含可被用户调用的IAP操作的代码时,不用修改IAP的操作地址就可以在不同的LPC系列的ARM上运行了。

           2.异常向量表及其重映射 ARM内核在发生异常后,会使程序跳转到位于0x0000~0x001C的异常向量表处,再经过向量跳转到异常服务程序。但ARM单条指令的寻址范围有限,无法用一条指令实现4G范围的跳转,所以应在其后面的0x0020~0x003F地址上放置跳转目标,这样就可以实现4G范围内的任意跳转,因此一个异常向量表实际上占用了16个字的存储单元。

4.小结 
     由上述可知,存储器重映射的用途就是给存储器单元再分配 1 个地址,以解决一些实际需要。应用存储器重映射机制的例子,除异常向量表以外还有 Boot ROM。

【原创】ARM中的难啃的骨头

  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:4
边城 2014-08-02
arm确实有点难学啊
0   回复
举报
发布
冰山一角 2014-08-01
谢谢 过奖了
0   回复
举报
发布
冰山一角 2014-07-31
ARM里面 存储器映射
0   回复
举报
发布
雨森 2014-07-31

这是干什么用的?

0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子