10回答

0收藏

关于存储器映射,你能理解几程

其他 其他 6374 人阅读 | 10 人回复 | 2012-10-22

本帖最后由 shamowangzi 于 2012-10-22 22:37 编辑

通过赋予每个任务不同的虚拟–物理地址转换映射,支持不同任务之间的保护。地址转换函数在每一个任务中定义,在一个任务中的虚拟地址空间映射到物理内存的一个部分,而另一个任务的虚拟地址空间映射到物理存储器中的另外区域。...
就是把一个地址连接到另一个地址。
例如,内存单元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——0X00000000SRAM——0X40000000BOOTBLOCK外部存储器 0X80000000VPB(低速外设地址,如GPIO,UART)——0XE0000000AHB(高速外设:向量中断控制器,外部存储器控制器)——从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个字的存储单元

temp11.jpg (72.41 KB, 下载次数: 136)

temp11.jpg
分享到:
回复

使用道具 举报

回答|共 10 个

倒序浏览

沙发

shamowangzi

发表于 2012-10-22 22:38:41 | 只看该作者

重新编排了一下!自己坐个沙发!
板凳

fengye5340-272571

发表于 2012-10-23 16:11:31 | 只看该作者

楼主分享的这个资料不错,顶一下!
地板

shamowangzi

发表于 2012-10-23 18:22:57 | 只看该作者

fengye5340 发表于 2012-10-23 16:11
楼主分享的这个资料不错,顶一下!

哈哈!谢谢支持!
5#

fengye5340-272571

发表于 2012-10-23 18:32:50 | 只看该作者

欢迎继续为ARM版块 做贡献啊!
6#

shamowangzi

发表于 2012-10-23 23:46:02 | 只看该作者

fengye5340 发表于 2012-10-23 18:32
欢迎继续为ARM版块 做贡献啊!

哈哈,互相支持!
7#

fengye5340-272571

发表于 2012-10-24 09:58:56 | 只看该作者

shamowangzi 发表于 2012-10-23 23:46
哈哈,互相支持!

好的,共同努力!呵呵
8#

leemtree

发表于 2012-10-24 15:41:49 | 只看该作者

fengye5340 发表于 2012-10-24 09:58
好的,共同努力!呵呵

不错的资料,谢谢楼主了
9#

hou_kang

发表于 2012-10-31 20:34:26 | 只看该作者

不错,帮顶~
10#

kingking

发表于 2013-3-25 22:14:27 | 只看该作者

支持一下  不错
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条