首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

总线 与 数据的字节对齐

总线 与 数据的字节对齐

首先要明白总线的概念
数据总线
(1) 是CPU与内存或其他器件之间的数据传送的通道。
(2)数据总线的宽度决定了CPU和外界的数据传送速度。
(3)每条传输线一次只能传输1位二进制数据。eg: 8根数据线一次可传送一个8位二进制数据(即一个字节)。
(4)数据总线是数据线数量之和。
地址总线
(1)CPU是通过地址总线来指定存储单元的。
(2)地址总线决定了cpu所能访问的最大内存空间的大小。eg: 10根地址线能访问的最大的内存为1024位二进制数据(1B)
(3)地址总线是地址线数量之和。
控制总线
(1)CPU通过控制总线对外部器件进行控制。
(2)控制总线的宽度决定了CPU对外部器件的控制能力。
(3)控制总线是控制线数量之和。
例题:若内存容量为4GB,字长为32,则______。
A.地址总线和数据总线的宽度都为32
B.地址总线的宽度为30,数据总线的宽度为32
C.地址总线的宽度为30,数据总线的宽度为8
D.地址总线的宽度为32,数据总线的宽度为8
答案:A
   内存容量为4GB,即内存单元的地址宽度为32位。字长为32位即要求数据总线的宽度为32位,因此地址总线和数据总线的宽度都为32。

再来说说数据总线
举个简单例子:假设一款CPU,数据总线为32位。也就是说一次CPU读操作可以获得4字节(32bit)的数据。那么现在有两个数据,即char ch_val; int int_val;如果按照一个字节一个地向内存中存取数据,且存取的起始位置0x10000。那么存储后数据的存储方式为:
(其中int_val有4个字节数据组成,分别是 int_val0 ... int_val3).
       --------------------------------------------
0x1000 | cha_val | int_val3 | int_val2 | int_val1 |
       --------------------------------------------
0x1004 | int_val0|          |          |          |
       --------------------------------------------
现在如果要CPU要访问int_val,那么就需要二次访问内存,一次先访问0x1000,一次访问0x1004,然后把二次访问的结果提取并合并为int_val。然而如果int_val如果地址对齐的话一次就够了。而内存的访问速度比cpu速度要慢至少一个数量级。当程序很大,数据较多的时候,你可以想象一下你的程序速度........

(顺便说一句,x86系cpu,从来都能支持非对齐地址访问,只是对非对齐地址访问,效率低而已。)

最后再说说地址总线
CPU通过地址总线来存取内存中的数据, 32位的CPU的地址总线宽度既为32位置, 标为A[0:31]. 在一个总线周期内, CPU从内存读/写32位.
但是某些CPU只能在能够被4整除的地址进行内存访问, 这是因为: 32位CPU不使用地址总线的A1和A2. (比如ARM, 它的A[0:1]用于字节选择, 用于逻辑控制, 而不和存储器相连, 存储器连接到A[2:31].)
访问内存的最小单位是字节(byte), A0和A1不使用, 那么对于地址来说, 最低两位是无效的, 所以它只能识别能被4整除的地址了. 在4字节中, 通过A0和A1确定某一个字节.

通常情况而言, 字节对齐只和数据总线相关. 但也会有一些CPU, 多少回和地址总线有些关系的. 比如ARM.
返回列表