32/64 位机器(处理器)中 RAM 的字长是多少?
这个问题让我抓狂。在 64 位机器(如英特尔酷睿 i5 微处理器)中,将数据保存在 RAM 本身中的字长到底是多少?
另外,保存数据的字长是否会从 32 位变为 64 位?
答案1
传统上,计算机架构中的“字”通常是内存的最小可寻址单位。传统上,这与机器的通用寄存器大小相同。
然而,自从字节寻址流行以来,这个概念就被淡化了。(我们或许应该将此归功于 IBM System/360 和小型机方面的 PDP-11。)
就 CPU 架构定义的内存寻址而言(即程序员如何看待机器),“字”概念在 x86/x64 上不存在,除非您将其视为字节的同义词。内存的每个字节都有自己的地址,并且字节的地址也是从该字节开始的任何较大区域的地址(扩展到更高编号的地址)。当然,我们可以一次在寄存器和 RAM 之间移动一个、两个、四个或(在 x64 上)八个字节 - 或者使用 REP 指令在内存到内存之间移动更多字节 - 但我们断言的地址仍然是字节的地址。我们可以对所有这些大小的字进行算术运算。(以及其他。)
如果从寄存器的角度考虑,通常认为机器的“字长”与其通用寄存器的字长相同。在 x86 上为 32 位,在 x64 上为 64 位。在大多数架构中,GPR 大小是 CPU 能够使用一条指令执行简单算术的最大整数的大小。
现在让我们引入更多的混乱...!
就平台(主板、RAM 模块和芯片等)而言,在所有使用 Intel 和 AMD“商品”CPU 和芯片组的机器上,RAM 都是以 64 位块寻址的 - 我想您可以称它们为字。您可以在早期的处理器上清楚地看到这一点,这些处理器具有用于地址和数据的单独引脚:最低有效地址引脚称为 A3,而不是 A0!物理地址位 A0、A1 和 A2 永远不会离开处理器。但程序员永远不会看到这样的地址。
最后,还有“缓存行”的概念。缓存行是物理上连续的 RAM 块,它占用 L1/L2/L3 缓存中的一个条目。Intel/AMD 世界中的缓存行已经有一段时间是 64 字节宽了。因此,当您访问当前不在缓存中的内存地址时,CPU 会获取八这些 8 字节 RAM 块。换句话说,存储在缓存中的地址省略了低六位。因此,一个字在缓存中实际上是 64 字节或 512 位!(但绕过缓存的内存访问仍然可以一次只读取或写入 8 个字节;在由内存映射 I/O 设备解码的物理地址范围内,单个字节可能是可寻址的;这取决于总线。当然,我们不能对 512 位整数进行算术运算。)
在 Microsoft C 派生的编程环境中,“字”为 16 位 - 早在 Microsoft 出现之前就已经如此,并且数据类型的名称和定义已延续到 32 位和 64 位环境以实现兼容性。“双字”(或 DWORD 或 LONG,代表“长字”,该术语在 VAX 上很常见)为 32 位。64 位整数在体系结构中称为“四字”,但在 C 中通常有更具体的名称,如 UINT64(64 位整数,无符号)。
因此,这取决于您在系统中的位置以及您正在查看的内容。如今我们通常根本不考虑“字大小”,而是考虑“GPR 大小”。
答案2
鉴于高速缓存一致性和 NUMA 等新技术的出现,我不太了解 RAM 如何与 Intel CPU 配合使用,但从 RAM 的角度来看,我相信它仍然是 8 位字节,尽管 RAM 现在通常排列在可以同时访问多个插槽的通道中。因此,在这样的系统上,一次抓取 4 个字节(假设有 4 个插槽)将花费与抓取 1 个字节相同的时间。不过,据我所知,RAM 接受来自内存控制器的地址作为输入,并将其返回 8 位作为输出。
“字”的大小可以表示不同的含义。我记得第一次遇到这个术语是在学习 68000 汇编语言时 - 在我阅读的文本中,“字节”表示 8 位,“字”表示 16 位,“字对齐”表示地址落在 16 位边界上。我知道“字”这个术语在 68000(1980 年?)推出之前就已使用,并且可能在那之前与“字节”同义。
CPU“倾向于”处理的“本机”数据与其架构的“位数”和运行模式相匹配。32 位 CPU(或不处于“长模式”的 64 位 CPU)具有 32 位寄存器、一系列用于将 RAM(4 字节)中的值加载到这些寄存器和其他内容的指令。但对于 Intel,32 位寄存器(例如 EAX)也可以作为两个寄存器 AH(EAX 的高 16 位)和 AL(低 16 位)进行寻址,并且有无数的 MOV 指令将内容从 RAM 加载到 EAX、AH、AL,然后从那里加载回 RAM。我现在懒得看 Intel 程序员的参考指南,但我认为有指令可以将单个字节加载到 AH 或 AL 的高 8 位或低 8 位。(我知道 MIPS 有这样的指令)。但我认为有更多指令可以适用于所有 32 位,如果您想使用更少的位,那么您的效率就会受到影响,因为您必须先将东西移动到临时寄存器等。
因此,在英特尔和自 16 位时代以来制造的大多数其他通用 CPU 中,您可以非常灵活地处理内存。不过,指令可能更适合在架构的“位数”下工作。