ARM的存储器映射与存储器重映射
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARM 的存储器映射与存储器重映射
ARM 的存储器映射与存储器重映射
arm 处理器本身所产生的地址为虚拟地址,每一个arm 芯片内都有存储器,而这个芯片内的存储器的地址为物理地址。我们写程序的目的是为了利用芯片内的存储器,因此我们要知道存储器的地址,即物理地址,所以虚拟地址和物理地址之间必然存在一定的转换关系,这就是映射。把虚拟地址按照某种规则转换成物理地址的方法就为存储器映射。物理地址表示了被访问的存储器的位置。存储器映射有两种映射规则--大端映射和小端映射。
存储器映射是指把芯片中或芯片外的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 个字的存储单元。以下为一张中断向量表:
LDR PC, ResetAddr
LDR PC, UndefinedAddr
FIQ_Handler 重映射的原因: 由于 ARM 处理器的存储器结构比较复杂,可能同时存在片 内存储器和片外存储器等,他们在存储器映射上的起始地址 都不一样,因此 ARM 内核要访问的中断向量表可能不在 0x0000~0x003F 地址上,因此采用了存储器重映射来实现将 存在与不同
LDR
LDR
LDR
DCD
LDR
LDR Undefined
SoftwareInterrupt
PrefetchAbort
DataAbort
ResetAddr
UndefinedAddr
SWI_Addr
PrefetchAddr
DataAbortAdd
Nouse
IRQ_Addr
FIQ_Addr
PC, SWI_Addr PC, PrefetchAddr PC, DataAbortAddr 0xb9205f80 PC, [PC, #-0xff0] PC, FIQ_Addr
DCD ResetInit
DCD DCD DCD DCD DCD 0 DCD 0
DCD