为什么不能一步读取未对齐的单词?

时间:2014-06-15 09:29:13

标签: hardware memory-address cpu-architecture memory-alignment address-bus

考虑到CPU的字大小允许它处理存储器中的每个字节 鉴于通过PAE,CPU甚至可以使用比字大小更多的位来进行寻址。

CPU无法一步读取未对齐字的原因是什么?

例如,在32位机器中,您可以读取从位置0开始的4字节块,但是您无法读取从位置1开始的块(您可以但需要几个步骤)。
为什么CPU不能这样做?

2 个答案:

答案 0 :(得分:3)

问题不在于CPU能否解决内存中的任何单字节问题。但它的内存具有不同的粒度。 像Oli所说,这是非常特定于架构的,但内存芯片通常通过数据总线宽度来解决。意味着给定的地址代表一个完整的"字"他们的数据总线。

我们以32位CPU为例,32位宽的数据总线连接到存储设备。当CPU想要访问地址0x00000000处的单词时,它确实想要访问字节0123。然而,对于存储器芯片,这由单个地址0x00000000表示。

现在当CPU想要访问地址0x00000001上的单词时,它真的想要访问字节123和{{1 }}。然而,对于存储器芯片,这由地址4处的一段字和地址0x00000000处的一段字表示。

因此需要两个总线周期。

编辑:添加一些布线图

为了说明这一点,这里有两种寻址方案:

RAM_CPU_Bus

注意RAM芯片地址的位移。

地址将如下所示:

0x00000001

要访问dword // From the RAM point of view @0x00000000: Bytes 0x00000000 to 0x00000003 @0x00000001: Bytes 0x00000004 to 0x00000007 ,您可以看到无法直接寻址。您需要向RAM芯片询问地址@0x000000010x00000000的两个dwords。

答案 1 :(得分:1)

简单的答案是他们无法解决,因为他们的设计并非如此。

以这种方式设计它们的主要原因是性能和可扩展性。我们会失去太多非常重要的功能来支持这一点。

一个简单的比喻,简陋的Shipping Container。在装运集装箱的日子之前,许多不同形状和尺寸的货物尽可能有效地装入船体。由于货物的大小无限可变,从板条箱到咖啡袋,再到干草和棉花捆,这些船只的容量都非常低,利用效率低下。

集装箱改变了所有这一切,现在如果你想在国际上发货,它必须在标准尺寸的集装箱中。你不能只是把你的猫粮袋装到香港的一个集装箱船上给你的朋友,它的效率是非常低效的,它只是不是&#&## 39;完成。

你想快速将这种猫粮送给你的朋友,而不是购买整个集装箱吗?好吧,你可以支付像FedEx这样的快递公司来支付747的费用,但你肯定会支付这笔费用。