为什么CPU在字边界上访问内存?

smw*_*dia 19 c memory cpu assembly operating-system

我听到很多数据应该在内存中正确对齐,以提高访问效率.CPU访问内存在字边界上.

因此,在以下场景中,CPU必须进行2次内存访问才能获得单个字.

Supposing: 1 word = 4 bytes

("|" stands for word boundary. "o" stands for byte boundary)


|----o----o----o----|----o----o----o----|   (The word boundary in CPU's eye)
           ----o----o----o----              (What I want to read from memory)
Run Code Online (Sandbox Code Playgroud)

为什么会这样?什么是CPU的根本原因只能读取字边界?

如果CPU只能访问4字节字边界,则地址线应仅需要30位,而不是32位宽.因为CPU的眼中最后2位始终为0.

添加1

更重要的是,如果我们承认CPU必须读取字边界,为什么边界不能我想要读取的地方开始?似乎边界在CPU眼中是固定的.

添加2

根据AndreyT的说法,似乎边界设置是硬连线的,它是由内存访问硬件硬连线的.就这一点而言,CPU是无辜的.

非常感谢...

AnT*_*AnT 25

在这种情况下,"can"(在"...... CPU可以访问......")中的含义取决于硬件平台.

在x86平台上,CPU指令可以访问绝对任何边界上对齐的数据,而不仅仅是"字边界".未对齐的访问可能不如对齐访问有效,但其原因与CPU完全无关.它与底层低级内存访问硬件的工作方式有关.在这种情况下,与存储器相关的硬件很可能必须对实际存储器进行两次访问,但这是CPU指令不知道并且不需要知道的事情.就CPU而言,它可以访问任何边界上的任何数据.其余部分透明地实现到CPU指令.

在Sun SPARC等硬件平台上,CPU 无法访问未对齐的数据(简单来说,如果您尝试,程序将崩溃),这意味着如果由于某种原因您需要执行这种错位访问,则必须实现它手动和显式:将其拆分为两个(或更多)CPU指令,从而显式执行两个(或更多)内存访问.

至于为什么会这么......好吧,这就是现代计算机内存硬件的工作原理.数据必须对齐.如果未对齐,则访问效率较低或根本不起作用.

现代记忆的一个非常简化的模型是细胞网格(行和列),每个细胞存储一个数据字.可编程机器人手臂可以将单词放入特定单元格并从特定单元格中检索单词.一次一个.如果您的数据分布在多个单元格中,则除了使用该机械臂连续多次跳闸之外别无选择.在某些硬件平台上,组织这些连续行程的任务对CPU是隐藏的(意味着手臂本身知道如何从多个部件组装必要的数据),在其他平台上它对CPU是可见的(意味着它是负责组织这些连续行程的CPU).

  • @smwikipedia:嗯,是的.字边界实际上是在计算机中安装的实际RAM芯片中实现的.在这些芯片内部,数据位被组织成单词.因此,这些词是预先确定的,在实际硬件中实现.由于这个原因,绝对是固定的.为了访问数据,您可以使用芯片内部所谓的"字线"选择特定字,然后使用所谓的"位线"读取或写入位. (3认同)
  • IMO,这有点过于简单化了。现在 CPU 包括 L1 缓存,因此对它的未对齐访问确实需要额外的晶体管*在 CPU* 中。但是是的,它在 CPU 的缓存访问部分,如果缓存行的偏移量必须是 4 的倍数,这会更简单。更重要的是,跨越缓存行边界需要两次单独的访问,这是一个支持未对齐访问的大复杂性。(在具有缓存的系统中,实际的 DRAM 访问是通过一次读取或写入整个缓存行来进行的)。 (2认同)

JUS*_*ION 5

如果您可以对地址进行某些假设(例如“最低n位为零”),则可以节省寻址逻辑中的硅。某些CPU(x86及其工作方式)将放置逻辑,以将未对齐的数据转换为多次提取,从而隐藏了一些内容程序员的讨厌性能降低了性能,该世界以外的大多数CPU都会引发硬件错误,毫无疑问地说明他们不喜欢这样做。

您将听到的有关“效率”的所有争论都是胡扯,或更准确地说,是在乞求这个问题。真正的原因很简单,如果可以减少操作的地址位数,则可以节省处理器内核中的硅。由不对齐的访问(例如在x86世界中)引起的任何效率低下都是硬件设计决策的结果,而不是通常要解决的固有问题。

话虽如此,对于大多数用例来说,硬件设计决策是有意义的。如果你在两字节字访问数据,最常见的用例中有你的访问offset,然后offset+2,再offset+4等等。在访问两个字节的字时,能够按字节递增地址的地址通常(当然是99.44%)不是您想要执行的操作。因此,要求地址偏移量在字边界上对齐并没有什么坏处(在设计数据结构时,这是一种轻度的一次性麻烦),但确实可以节省硅片。

除了历史,我曾经在Interdata Model 70(16位微型计算机)上工作过。它要求所有内存访问都必须是16位对齐的。到我按照当时的标准进行处理时,它的内存也非常少。(即使在那时,这也是一个遗物。)字对齐用于使存储容量增加一倍,因为绕线式CPU很容易被黑客入侵。添加了新的地址解码逻辑,该逻辑在地址的低位取1(以前是对齐错误),并使用它来切换到第二个存储器组。尝试不使用对齐逻辑!:)