32/64 位机器(处理器)中 RAM 的字长是多少

M-T*_*T-A 6 memory

32/64 位机器(处理器)中 RAM 的字长是多少?

这个问题让我发疯。在像英特尔酷睿 i5 微处理器这样的 64 位机器中,将数据保存在 RAM 本身中的字的大小究竟是多少?

另外,保存数据的字长是否从 32 位变为 64 位?

Law*_*ceC 5

我不熟悉 RAM 如何与 Intel CPU 配合使用的具体细节,因为有了诸如缓存一致性和 NUMA 之类的新内容,但从 RAM 的角度来看,我相信它仍然是 8 位字节,尽管 RAM 现在通常排列在可以同时访问多个插槽的通道。因此,在此类系统上,一次抓取 4 个字节(假设有 4 个槽)所需的时间与抓取 1 个字节所需的时间相同。尽管如此,RAM 仍然接受来自内存控制器的地址作为输入,并返回 8 位作为输出 AFAIK。

“单词”的大小可以表示不同的意思。我记得在学习 68000 汇编语言时第一次遇到这个术语 - 在我正在阅读的文本中,“字节”表示 8 位,“字”表示 16 位,“字对齐”表示地址落在 16 位边界上。我知道术语“字”在 68000(1980 年?)推出之前就已经使用过,并且在更早的时期可能是“字节”的同义词。

CPU“更喜欢”处理的“本机”数据与其架构的“位数”及其运行模式相匹配。32 位 CPU(或不处于“长模式”的 64 位 CPU)有 32 个位寄存器,一组将 RAM(4 字节)中的值加载到这些寄存器和其他内容中的指令。但对于 Intel,EAX 等 32 位寄存器也可以作为两个寄存器 AH(EAX 的高 16 位)和 AL(低 16 位)来寻址,并且有无数的 MOV 指令将内容从 RAM 加载到 EAX,啊,AL,然后从那里回到 RAM。我现在懒得看英特尔程序员参考指南,但我认为有指令将单个字节加载到 AH 或 AL 的高 8 位或低 8 位。(我知道 MIPS 有类似的说明)。但我认为有更多的指令可以处理所有 32 位,如果你想使用更少的位,你的效率就会受到影响,因为你必须先将东西移动到临时寄存器等。

因此,在 Intel 和自 16 位时代以来制造的大多数其他通用 CPU 中,您对内存寻址的方式非常灵活。不过,指令可能会更优化以适应架构的“位数”。


Jam*_*han 5

传统上,计算机体系结构中的“字”通常是最小的可寻址内存单元。传统上这与机器的通用寄存器大小相同。

然而,自从字节寻址流行以来,这个概念就被淡化了。(我们大概可以归功于 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的8字节块。换句话说,缓存中存储的地址省略了低六位。所以也许缓存中有一个词真的是 64 字节或 512 位!(但是绕过缓存的内存访问仍然一次只能读取或写入 8 个字节;在由内存映射 I/O 设备解码的物理地址范围中,单个字节可能是可寻址的;这取决于总线。而当然,我们不能对 512 位整数进行算术运算。)

在 Microsoft C 派生的编程环境中,一个“字”是 16 位 - 早在 Microsoft 之前就已经如此,并且数据类型的名称和定义已沿用至 32 位和 64 位环境以实现兼容性。“双字”(或 DWORD 或 LONG,表示“长字”,该术语在 VAX 上很常见)是 32 位。64 位整数在体系结构中称为“四字”,但在 C 中通常有更具体的名称,如 UINT64(64 位整数,无符号)。

因此,这取决于您在系统中的位置以及您正在查看的内容。这些天我们通常根本不考虑“字大小”,而是“GPR 大小”。