计算机或者嵌入式刚刚入门的人,可能会有这样的疑问:CPU 是 32 位/64 位的计算机,是怎么读取一个字节的?又或者说,是怎么一下子读取到 32 位/64 位数据的?这其实就是计算机的编址的问题。只要知道了,按字节编址与按字长编址的区别就可以解决这些疑问了。下面将用按字节编址与按字编址的电路原理图图解来讲述其中的奥秘。
首先,32 位/64 位 CPU 指的是 CPU 的数据总线的宽度,也是字长。初学者可能就会认为,既然是 32 位 CPU 了,数据总线的宽度也是 32 位的,那么 CPU 就应该是每一次都是从内存中并行读取 32 位的数据,那么 32 位 CPU 的内存的基本单元就应该是 32 位的才对,为什么现在的计算机都是以 8 位一个字节为基本存储单元的呢?32 位 CPU 它是怎么实现对一个字节单元的读写操作的呢?
按字节编址
关键就在于字节编址。编址,顾名思义就是对地址的编排。而按字节编址就是,一个字节做为一个基本的地址单元。通俗点说就是一个地址对应一个字节(8 位)。
♦需要说明的是该芯片的基本存储单元是 8 位(一个字节),cADDR0-cADDR15 是 CPU 的地址线。
如上图所示就是一个很经典的按字节编址的电路。按照该电路设计,那么 CPU 的每一个地址都对应着存储芯片的一个字节。这时候还是会有疑问,那么按字节编址,CPU 不是每一次都是只能读取一个字节的数据吗?这个时候再看一个图:
这是一个 32 位 CPU 的内存芯片电路图。仔细观察电路图可以看到,CPU 的 32 位数据是由两个 16 位内存芯片的数据并成的。这样 CPU 就可以每一次都是读取到 32 位的数据了。这时候再来看看地址总线。你会发现,CPU 的地址总线 LADDR2 接的是内存芯片的 A0,LADDR1、LADDR0 哪里去了?为什么错开了两条地址线?
其实这就是 16 位及以上的 CPU 实现按字节编址的关键所在。举个例子就好理解了。CPU 地址总线发出 4 个地址信号 000000、000001、000010、000011(省略掉前面的 N 个 0 了),这 4 个地址信号改变的是最低两位的地址线(LADDR1、LADDR0),高 30 位(LADDR2-LADDR31)始终还是 0,结合电路知道,CPU 地址总线发出的这 4 个地址信号读取到的数据其实是相同的 32 位数据,因为最低两位地址线根本没有接到内存芯片上。而这 32 位数据(4 个字节)刚好可以通过最低两位地址线进行编排(2^2=4),具体 4 个地址与 4 个字节是如何编排的则是由 CPU 所决定的(可以是高字节对高地址,也可以是高字节对低地址)。所以 CPU 发出的每一个地址信号其实还是只对应着一个字节(8 位)的,也就是 CPU 的寻址还是按照字节来寻址的。这就是按字节编址。
而 CPU 要实现对其中某一个字节的操作可以通过“按位与”和“按位或”运算实现。
♦请忽略LADDR14-LADDR24 之间的不连续,这需要结合到具体的芯片型号才能看懂的。并不是本文的重点。
按字编址
如果懂了按字节编址,那么按字编址就很好理解了。直接看图
该图是 32 位 CPU 按字编址的电路原理图。32 位 CPU 的字长就是 32 位,因此按字编址就是,每一个地址对应着一个字长的数据。图中可以看到,CPU 的地址总线 cADDR0-cADDR15 与内存芯片的 A0-A15 是一一对应的,并没有像按字节编址那样,将最低两位错开。然后由两个 16 位的内存芯片的数据合并成 32 位数据。CPU 同样是每次读取 32 字节的数据,但是,CPU 发出的每一个地址信号都对应着一个 32 位的数据,不同的地址信号对应着不同的存储单元。
按字编址设计的电路,CPU 是没办法寻址到某一个字节并对其操作的,因为 CPU 发出的每一个地址信号都对应着 32 位的数据,无法具体到其中的哪些字节。
总结
判断是按字编址还是按字节编址的关键在于,判断 CPU 给出的每一个地址所确定的存储单元的大小。其大小等于一个字节,那么就是按字节编址的;等于一个字,则是按字编址的。
现代计算机大多数采用的都是按字节编址的方式设计的,也就是经常所说的,计算机最基本的存储单位是字节。
按字节编址的计算机较为通用,兼容性更好;
而按字编址的计算机的兼容性没有那么好了,因为当 CPU 的字长发生变化时,计算机的基本存储单位都会发生变化,但是它可寻址的存储空间更大,因为它的一个地址对应着是 32 位/64 位数据,而按字节编址的一个地址对应的只有一个字节(8 位)的数据。
编辑:hfy
全部0条评论
快来发表一下你的评论吧 !