为什么CPU不能直接访问不是总线宽度倍数的地址?

问题描述 投票:0回答:1

在我寻求了解结构填充在 Linux x86 环境中的 C 语言中如何工作时,我了解到对齐访问比未对齐访问更快。虽然我认为我理解给出的原因,但它们似乎都带有潜在的预设,即 CPU 无法直接访问不是总线宽度倍数的地址,因此,例如,如果32位总线CPU被指示从地址“2”开始读取4个字节的内存,它会首先读取从地址“0”开始的4个字节,屏蔽前两个字节,再读取从地址“4”开始的另外4个字节,屏蔽最后两个字节,最后合并两个结果,而不是一次读取 4 个字节(以防 4 个字节对齐)。

所以,我的问题是:为什么这个预设是正确的?为什么CPU不能直接访问不是总线宽度倍数的地址?

c x86 cpu cpu-architecture memory-alignment
1个回答
3
投票

从技术上讲,没有什么可以阻止你制造一台可以寻址内存总线上任何地址的机器。只是如果您将地址设置为总线大小的倍数,那么一切都会简单得多。

这意味着,例如,要制作 32 位内存,您只需使用 4 个 8 位内存芯片,将每个内存芯片插入具有相同地址总线的数据总线的四分之一上。当您发送单个地址时,所有 4 个芯片都会读/写其相应的 8 位,形成一个 32 位字。请注意,为此,您会忽略最低 2 位地址,因为单次访问会获得 32 位,并且实质上会强制地址进行 32 位对齐。

 Addr  | bus addr | CHIP0   CHIP2   CHIP3   CHIP1 | Value read
@0x00 => 0b000000    0x59    0x32    0xaa    0xba   0x5932aaba
@0x04 => 0b000001    0x84    0xff    0x51    0x32   0x84ff5132

要访问此类配置中的非对齐字,您需要向 4 个芯片发送两个不同的总线地址,因为可能两个芯片的值位于地址 0 上,另外两个芯片的值位于地址 1 上。这意味着您需要有多个地址总线,或者无论如何都可以进行多次访问。

请注意,现代 DRAM 显然更加复杂,并且访问是多个缓存线,比总线大得多。

总的来说,在大多数内存用例中,四舍五入访问使事情变得更简单。

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