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

Get*_*ree 3 hardware cpu-architecture memory-alignment memory-address address-bus

鉴于 CPU 的字长允许它寻址内存中的每个字节。
鉴于通过PAE CPU 甚至可以使用比其字长更多的位进行寻址。

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

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

Pep*_*ito 5

问题不在于 CPU 寻址内存中任何单个字节的能力。但粒度不一样的是内存。就像 Oli 所说,这是非常特定于架构的,但内存芯片通常通过其数据总线宽度来寻址。这意味着给定的地址代表其数据总线的完整“字”。

让我们以 32 位 CPU 为例,它具有连接到存储设备的 32 位宽数据总线。当CPU要在地址访问的话0x00000000,就真的要进入字节0123。然而,对于存储芯片,这由单个地址表示0x00000000

现在,当 CPU 想要访问 address 处的字时0x00000001,它确实想要访问字节1, 2,34。然而,对于存储芯片,这由地址处0x00000000的一段字和地址处的一段字表示0x00000001

因此需要两个总线周期。

编辑:添加一些接线图

为了说明这一点,这里有两个相反的寻址方案:

RAM_CPU_Bus

注意 RAM 芯片地址的位移。

地址将如下所示:

// From the RAM point of view
@0x00000000: Bytes 0x00000000 to 0x00000003
@0x00000001: Bytes 0x00000004 to 0x00000007
Run Code Online (Sandbox Code Playgroud)

要访问 dword @0x00000001,您可以看到无法直接寻址。您需要向 RAM 芯片询问地址0x000000000x00000001.