处理器如何读取内存?

问题描述 投票:-2回答:2

我正在尝试学习如何通过计算机来安排和处理内存,但是我没有理解对齐的概念。

例如,在32位体系结构中,为什么我们说短(2个字节)如果它们完全位于单个32位字中,即使它们不位于偶数地址,也没有对齐?

因为如果处理器读取32位乘以32位,并且在地址x0处有一个char,则后跟一个短字符(地址x01和x02),然后是另一个char(x03)。突然没问题了,因为处理器读取了4个字节,所以没有剪切数据。

所以short是对齐的,对吗?

c memory cpu-architecture ram memory-alignment
2个回答
1
投票

该问题提出了一种处理器,该处理器具有32条连接至总线的导线以进行数据传输,可能还包含其他控制线。当它要从内存中获取数据时,它会在总线上放置一个地址,请求从内存中读取数据,等待数据,然后通过这32条线进行读取。

在典型的处理器设计中,这32条线连接到某个临时内部寄存器,而该寄存器本身具有与其他寄存器的连接。将这32位作为一个块移动很容易,每个位都在其自己的线路上。

如果要在32位内移动某些位,则需要对其进行移位。这可以通过各种硬件来完成,例如我们将比特放入其中的移位单元,请求一定的移位量并从中读取结果。在内部,该变速箱将具有各种连接和开关来完成其工作。

通常,这样的移位单元将能够将八个位从四个位置(从位0、8、16或24开始)中的任意一个移动到基本位置(0)。这样,可以通过从内存中读取32位(因为它只出现在32位块中)来实现诸如“加载字节”之类的指令,然后使用移位单元获得所需的字节。该移位单元可能没有将任意一组位(例如,从7、13或22开始)移动到基本位置所需的电线和开关。这将需要更多的电线和开关。

处理器还需要能够执行16位加载指令。为此,移位单元将能够将16位从位置0或16移动到位置0。当然,工程师可以将其设计为也将16位从位置8移动到位置0。但这需要更多的电线和开关,这需要花费很多钱金钱,硅和能源。在许多处理器中,都决定不花这笔钱,因此无法实现此功能。

结果,在加载过程中,硬件根本无法将数据从字节1和2转移到字节0和1。 (处理器中可能还有其他移位器,例如在用于实现移位指令的通用逻辑单元中,但是这些移位器通常是分开的,并且可以通过指令分派和控制机制进行访问。它们不在用于从中加载的组件中内存。)


0
投票

对齐是一个定义。假设8位字节,并且存储器是字节可寻址的。 8位字节(无符号字符)不能对齐。要对齐的16位半字必须具有lsbit零。一个32位字的低2位为零,一个64位双字的3位为零,依此类推。因此,如果您的16位无符号短裤在奇数地址上,则它是未对齐的。

© www.soinside.com 2019 - 2024. All rights reserved.