最近,在做ucos在arm9上移植的相关问题,不过有一个小插曲:我不太明白arm的存储空间的编制和寻址。不明白32位机器是怎样实现按字节寻址的。
我查了一些资料,终于弄明白了。原来,我们用的arm和平常我们用的pc机都是按字节编址的,主要是为了和外围设备通信方便。
下面是我从网上找的资料:
“存储器可以按字节寻址,也可按字寻址。”这种说法是正确的。有些型号的计算机是按字节寻址(按字节编址,按字节访问)的,硬件实现比较简单,有多少位的地址,系统就有多少位的地址总线,CPU就有多少位的地址引脚。按字节寻址数据传输能力小(一次一个字节)。有些型号的计算机是按字来寻址(按字编址,按字访问)的,硬件实现也比较简单。一个字为若干字节,按字单元编址,地址位数少,同时按字单元访问,数据位数(数据线位数)多,数据传输能力大。也有些型号的计算机即可按字节寻址,又可按字寻址(按字节编址,按字节或字访问),硬件实现较复杂。我们现在所用的微机就属这一类型。在你以下所举例子中:例如:一个1M*32位(4MB)的存储器,可以得到,该存储器有2^20个字存储单元,数据线宽度为32,地址线宽度为20。当按字寻址时,需要20位的地址来表示一个地址编号;当按字节寻址时,则需要22位的地址来表示一个地址编号。而地址线只有20位,如果按字节寻址的话,貌似不够。 如果用20位的地址按字节寻址4MB的内存,肯定是不够的。若该存储器只有20位地址线既能按字寻址,又能按字节寻址,则必有控制对一个字内的四个字节的单独寻址的信号线。下以微机系统为例加以说明。在8086CPU中,字长为16位(2字节),CPU有20位的地址引脚(A19—A16,AD15—AD0),16位数据引脚(AD15—AD0,注意8086CPU的数据引脚和低16位地址引脚是共有的,采用分时复用的办法分别传送地址和数据)。可以按字节或字访问1MB的的内存单元。另外CPU还有一个BHE引脚,它与地址引脚A0一块决定对内存的访问。BHEA0内存访问状态00偶地址访问内存字单元,16位数据通过16位数据引脚(AD15—AD0)传送01奇地址访问内存字节单元,8位数据通过高8位数据引脚(AD15—AD8)传送10偶地址访问内存字节单元,8位数据通过低8位数据引脚(AD7—AD0)传送11无操作在80286CPU中,字长也为16位,CPU有24位地址引脚(A23—A0),16位的数据引脚(D15—D0),地址引脚和数据引脚分离,可以按字节或字访问16MB的内存。CPU也设有一个BHE引脚,它与地址引脚A0一块决定对内存的访问,实现方法与8086相同。
在80386CPU中,字长增加到了32位(4字节),CPU有30位地址引脚(A31—A2,而没有A1和A0噢),32位的数据引脚(D31—D0),可以按字节(8位)、半字(16位)或字(32位)访问最多为4GB的内存。这里就出现了问题,怎样用30位地址字节访问4GB的内存呢?解决办法是80386CPU又设置了BE3—BE0四个引脚,称为是字节允许引脚(低电平有效),它们和30位的地址引脚一块儿决定对内存的访问方式(按字节、半字、字访问)。因此80386CPU由A31—A2和BE3—BE0共同决定了对4GB内存访问的32位地址。本文来源于Spirit's Home , 原文地址: 并且,我用的arm板子,它里面有两片sdram和一片flash,并且是统一编制的。
版权声明:本文为博主原创文章,未经博主允许不得转载。