ARM9的存储器层次结构从微处理器的CPU到外依次是寄存器组、Cache存储器、主存储器和辅助存储器。寄存器组的访问一般需要几个纳秒,Cache存储器的访问需要十几纳秒,主存储器一般为几兆字节到1GB的动态存储器,访问时间约50ns。
寄存器组主要辅助CPU进行运算,以加快CPU的处理速度;Cache主要预存将要执行的指令以及相关的数据;主存储器是运行程序和访问数据的所在地。
有的ARM9处理器内置指令Cache和数据Cache,但不带有片内RAM和片内ROM。系统所需的RAM和ROM(包括Flash)都通过总线外接。由于系统的地址范围较大(2 32 =4GB),有的片内还带有存储器管理单元(Memory Management Unit,MMU)。ARM架构处理器还允许外接PC存储卡国际协会(Personal Computer Memory Card International Association,PCMCIA)卡。
ARM9体系结构的存储器和I/O端口采用统一编址。通常对于I/O端口的编址有两种方式:独立编址、与存储器采用统一编址。前者不占用处理器的存储器空间,但需要设计专用的指令,访问速度快,但它不太适用于RISC系统;后者占用了存储器空间的一部分,与存储器采用同一指令进行访问,访问速度相对慢一些,它符合RISC系统的要求。
ARM9体系结构存储器与I/O端口采用的统一编址所构成的地址空间称为平面地址空间,亦可叫作线性地址空间,如由32根地址线组成的2 32 字节地址单元,范围为0x00000000~0xffffffff,将字节地址作为无符号数对待。
前面已经讲到,ARM9的每个地址单元是对应一个存储字节单元而不是一个存储字(占4字节的存储单元),但ARM9可以按存储字访问,也可以按半字(2字节)访问或按单字节访问。在按字进行访问时,要求其地址是字对齐的,即字地址可以被4整除,也就是说,字地址的最低2位A1A0=00,程序计数器PC指针的高30位使用地址线A 31 …A 3 A 2 。最低2位地址线的值取00,是默认的,也是必需的,因为按字地址访问时低2位必须有值。这样按字访问的第1字节的数据默认存储在A1A0=00的字节地址单元、第2字节的数据存储在A1A0=01的字节地址单元、第3字节的数据存储在A1A0=10的字节地址单元、第4字节的数据存储在A1A0=11的字节地址单元。因此PC地址指针最低2位为00,暗示用字地址访问时其对应字节数据的内存连续访问单元次序是00,01,10,11顺序组合,其他均为非字对齐。注意,连续字地址存储最低2位的变化是00,01,10,11,00,01,10,11,00,…,每一个00,01,10,11的组合都对应着一个固定的高30位字地址值。如果取地址最低2位的组合是01,10,11,00字节单元的值,则前3个组态对应一个高30位的字地址值,最后一个00对应的值是前高30位字地址值+4,字数据不在同一个高30位地址所指的范围内,属于非字对齐。
一个字由4个字节组成,如果某个字的地址是A(A必须能被4整除),那么该字的4个字节对应的地址依次是A、A+1、A+2、A+3。
同理,对于由2个字节组成的半字,访问地址使用地址线高31位,最低位默认取0,即该地址值能被2整除。半字对齐时要求高31位地址不变,第1字节数据的默认最低位地址值必须为0,第2字节数据的默认最低位地址值必须为1。
ARM存储系统可以使用小端存储或者大端存储两种方式。大端存储就是将字数据的最高8位字节数据存放在字节地址最小的存储单元中,将字数据的最低8位字节数据存放在字节地址最大的存储单元中,如图2-2所示。
图2-2 大端存储方式
而小端存储与大端存储正好相反,它的定义是,将字数据的最高8位字节数据存放在字节地址最大的存储单元中,将字数据的最低8位字节数据存放在字节地址最小的存储单元中,如图2-3所示。
图2-3 小端存储方式
小端存储方式是ARM9处理器的默认方式。ARM9指令集中,没有相应的指令集来选择是采用大端存储方式还是小端存储方式,但可以通过外部硬件接入引脚来配置它。如果外部引脚BIGEND接高电平,则使用大端存储方式;如果外部引脚BIGEND接低电平,则使用小端存储方式。
ARM9对于存储器单元的访问要求字对齐或半字对齐,即访问字存储单元时,要求字对齐(PC指针的值能被4整除);访问半字存储单元时,要求半字对齐(PC指针的值能被2整除)。如果没有按照这种对齐方式对存储单元进行访问,称为非对齐存储器访问。非对齐的存储器访问可能会引起不可预知的状态。
对于I/O端口的访问,ARM9体系结构是应用存储器映射的方式来实现的。由于I/O端口与存储器采用统一编址,I/O端口必然要占用存储器空间。存储器映射法就是为每个I/O端口分配特定的存储器地址,当从这些地址读出或向该地址写入数据时,实际完成的是I/O端口的操作功能。
注意 :存储器映射I/O端口地址的行为通常不同于对一个正常存储器地址操作所期望的行为。例如,从一个正常存储器地址两次连续的读入,两次返回的值相同。而对于存储器映射I/O地址,第2次读入的返回值可以不同于第1次读入的返回值,因为第2次读入时对应端口的电平可能发生了变化。