鉴于 CPU 的字长允许它寻址内存中的每一个字节。
并且考虑到通过PAE CPU 甚至可以使用比其字长更多的位来寻址。
CPU无法一步读取未对齐字的原因是什么?
例如,在 32 位机器中,您可以读取从位置 0 开始的 4 字节块,但不能读取从位置 1 开始的块(可以,但需要几个步骤)。
为什么 CPU 不能做到这一点?
鉴于 CPU 的字长允许它寻址内存中的每一个字节。
并且考虑到通过PAE CPU 甚至可以使用比其字长更多的位来寻址。
CPU无法一步读取未对齐字的原因是什么?
例如,在 32 位机器中,您可以读取从位置 0 开始的 4 字节块,但不能读取从位置 1 开始的块(可以,但需要几个步骤)。
为什么 CPU 不能做到这一点?
问题不在于 CPU 处理内存中任何单个字节的能力。但它是没有相同粒度的内存。正如 Oli 所说,这是非常特定于架构的,但内存芯片通常通过其数据总线宽度来解决。这意味着给定地址代表其数据总线的完整“字”。
让我们以一个 32 位 CPU 为例,它有一个 32 位宽的数据总线连接到一个存储设备。当 CPU 想要访问地址处的字时,0x00000000
它确实想要访问字节0
、 1
和。然而,对于存储芯片,这由单个地址表示。2
3
0x00000000
现在,当 CPU 想要访问地址处的字时,0x00000001
它确实想要访问字节1
、2
和。然而,对于内存芯片,这由 address 处的一段字和 address 处的一段字来表示。3
4
0x00000000
0x00000001
因此需要两个总线周期。
编辑:添加一些接线图
为了说明这一点,这里有两种相反的寻址方案:
注意 RAM 芯片地址的位移。
地址将如下所示:
// From the RAM point of view
@0x00000000: Bytes 0x00000000 to 0x00000003
@0x00000001: Bytes 0x00000004 to 0x00000007
要访问 dword @0x00000001
,您可以看到无法直接寻址。您需要向 RAM 芯片询问地址0x00000000
和0x00000001
.
简单的答案是它们不能,因为它们被设计成不能。
以这种方式设计它们的主要原因是为了提高性能和可扩展性。我们会失去太多非常重要的功能来支持这一点。
一个简单的类比,不起眼的海运集装箱。在海运集装箱出现之前,许多不同形状和大小的货物都尽可能高效地装入船体。由于货物的大小千变万化,从板条箱到咖啡袋,再到成捆的干草和棉花,这些船的运力被严重而低效地利用。
集装箱改变了这一切,现在如果你想在国际上运输东西,它必须放在标准尺寸的集装箱中。并不是说你不能用集装箱船把你的猫粮袋子寄给你在香港的朋友,而是这样做的效率太低了,以至于没有完成。
您想在不购买整个集装箱的情况下快速将猫粮送给您的朋友吗?好吧,你可以付钱给像联邦快递这样的快递公司,让它在 747 上飞过来,但你肯定会为这种能力买单。