我的简单理解如下。
内存(RAM)由位组成,每 8 个位组成一个字节,每个字节都可以被寻址,因此是字节可寻址内存。
地址总线存储内存字节的位置。
如果地址总线大小为 32 位,则意味着它最多可容纳 2 32 个数字,因此它可以引用最多 2 32字节的内存 = 4GB 的内存,任何大于该大小的内存都是无用的。
数据总线用于发送要写入/读取内存的值。如果我有一条 32 位大小的数据总线,则意味着一次最多可以写入/读取内存 4 个字节。我发现这个大小与可能的最大内存大小之间没有关系。
但我读过这里那:
尽管大多数系统都是字节寻址的,但处理器移动尽可能多的数据也是有意义的。这是由数据总线完成的,数据总线的大小就是 8 位系统、16 位系统、32 位系统、64 位系统等名称的由来。当数据总线宽度为 8 位时,它可以在单个内存操作中传输 8 位。当数据总线宽度为 32 位(在撰写本文时最为常见)时,最多可以在单个内存操作中移动 32 位。
这说明数据总线的大小决定了操作系统的名称,例如 8 位、16 位等等。我的理解有什么问题?
答案1
在简单的设计中,数据总线的大小就是处理器寄存器的大小。对于大多数设计的第一代来说,这通常是正确的,因此第一个 16 位 CPU 有 16 位总线,32 位 CPU 有 32 位数据总线,等等。
但是,处理器整数寄存器的大小决定了操作系统类型(64 还是 32),而不是数据总线。数据总线可能与整数寄存器不同,但引用的作者将两者联系在一起,因为从历史上看,它们通常是相同的。
一些现实世界的例子,其中数据总线和整数寄存器宽度不同:
IBM PC 的原始 8088 是 16 位 CPU 设计,但数据总线宽度为 8 位。要将 16 位数据从 RAM 移入处理器寄存器,需要两个访问周期
1992 年推出的原始 Pentium 具有 64 位数据总线,但采用 32 位设计。更大的数据总线允许 CPU 通过缓存传入和传出更多数据,但仍然只能通过其 CPU 寄存器在内部每次访问 32 位数据。
通常,指针大小也遵循寄存器大小,但物理地址总线宽度可以大于或小于寄存器大小。以下是一些示例:
- 大多数 8 位 CPU 可以使用 16 位地址总线寻址至少 64k 内存。
- 8086 是 16 位的,但具有 20 位地址总线,以允许更多可寻址 RAM。
- 最初的 AMD Opteron 是 64 位的,但物理地址总线为 40 位(内部),以简化内存子系统的设计,因为完整的 64 位太大而无法利用。现代 64 位 AMD CPU 为 48 位。
现代设计还使用更复杂的总线,这些总线不能完全适应位宽范式。上面的 Opteron 示例是关于 CPU 可以根据软件物理寻址多少,实际上 CPU 可能公开也可能不公开任何物理 48 位寻址。CPU 高度集成,具有用于外设、内存和与其他 CPU 通信的专用总线。不再有单一的“数据总线”或“地址总线”。这些总线可能使用差分信号,这些信号不会以任何有意义的方式处理位宽,即使它们这样做,它们也不会与 CPU 的架构寄存器紧密耦合。
最好认识到,CPU 的位数完全是架构性的,主要只是从软件角度来看。它与物理设计不再有太大关系。
答案2
不存在“纯”的 32 位或 64 位系统,因此这些术语只是近似值。
例如记录你的陈述“内存(RAM)由位组成,每 8 个位组成一个字节,每个字节都可以寻址”。这种情况并不常见。PC 的 RAM 位于 DIMM 模块上,这些模块的宽度为 64 位。早在 90 年代,就有 SIMM,这些模块的宽度为 32 位。
在某些系统中,DIMM 必须或可以成对(“联动”/“双通道”),即 128 位数据总线。此概念早于 AMD 和 Intel 所谓的“64 位”处理器。
单个 DIMM 中的 64 位组确实可以细分为 8 个字节。您的 CPU 可以非常透明地完成此操作。它还可以将 64 位拆分为 4*16 位、2*32 位,或者仅将所有 64 位用作单个变量。
然而,最重要的问题是地址的宽度。内存中的每个字节都有自己的地址,但并非每个位都有。这意味着从单个 DIMM 获得的 64 位有 8 个地址。其中最小的地址始终是 8 的倍数:现在,CPU 支持多少个不同的地址?至少在理论上有两个常见的答案。一些 CPU 支持 2 32 个不同的地址,一些支持 2 64 个。这种区别是 32 位和 64 位系统之间最常见的区别。
实际上,如今的 64 位系统仅支持不到 264字节的 RAM。这太昂贵了,而且普通 PC 也装不下。这么多内存的重量将达到数百万吨!
答案3
它是处理器内的寄存器大小和内存处理。
使用技巧,一个 16 位处理器有一个 20 位地址总线,因此它不是处理器外部的内存。
答案4
事实上两者都有。
CPU 上的位通常是指其内部寄存器的大小。32 位 CPU 有 32 位寄存器,这些寄存器可能会或可能不会被划分为块。
32 位 CPU 配有 32 位数据总线是有意义的,因为您可以将所有数据从内存直接传输到寄存器,但数据总线大小可以是任意的。因此,32 位 CPU 通常配有 32 位数据总线,以便于从其传输数据和向其传输数据。
此外,出于两个原因,使用 32 位地址总线也是有意义的。更大的地址总线会使间接寻址变得更加困难,因为您没有足够大的寄存器来存储内存地址,或者 CPU 需要专门的寄存器来进行内存寻址,请注意,像 Intel 8080 这样的旧 CPU 是 8 位的,并且具有 16 位地址总线。相反,小于寄存器的地址总线只是浪费资源。有些微控制器使用较小的地址总线。