我想知道,对于 32 位操作系统寻址“仅 4GB 的地址空间”,4 GB 是否意味着“千兆位”或“千兆字节”?
其他帖子提到 2^32 位等于 4294967296 字节。但如果他们谈论的是 32 位,结果怎么会以字节为单位给出呢?
或者我遗漏了什么?
答案1
在大多数(如果不是全部的话)当前广泛使用的架构中,内存寻址以字节为单位。
32 位地址宽度允许您指定 2 32(约 43 亿)地址。
这意味着使用 32 位寻址并以字节为单位寻址 RAM 的 CPU 可以本地寻址 2 32 字节,相当于 4 GiB(吉比字节)或 4,294,967,296 字节。
在很多当前的架构中,还有其他问题需要考虑,例如内存请求地址对齐,这会限制可用于实际访问的地址。但这不会改变 CPU 可以寻址的 RAM 数量,只会改变寻址方式,除非您在非常靠近 CPU 的地方工作,否则这通常会从程序员那里抽象出来,当然也不会从用户那里抽象出来。
还值得记住的是,CPU 的“位数”不一定指 CPU 的地址宽度,而通常是指 CPU 的本机字长。以最初的 IBM PC 中使用的 Intel 8088 及其兄弟 8086 为例;它的字长为 16 位,但地址宽度为 20 位,尽管 8088 只有 8 位数据总线宽度(8086 有 16 位数据总线),但通常被称为 16 位 CPU。Intel 80386SX 的本机字长为 32 位,但可用地址宽度为 24 位;80386DX 的地址宽度为 32 位。摩托罗拉 68000 与 8086/8088 大致同时代,地址宽度为 24 位,但采用混合 16/32 位设计。等等。本机字长可能与地址宽度相同,但不必如此。
有一些方法(例如物理地址扩展 (PAE))可以绕过通常由 32 位地址宽度施加的 4 GiB 限制,就像具有 16 位地址的 CPU 使用各种技术(包括分段和存储体切换)来寻址超过 64 KiB(2 16字节)的 RAM 一样。此外,如果寻址以不同的单位进行(例如,16 位字而不是 8 位字节),那么可以寻址的实际内存量也会相应变化;例如,通过寻址 16 位字而不是 8 位字节,32 位地址宽度将允许寻址 8 GiB,因为每个地址实际上寻址两个字节。
答案2
每个字节都有一个内存地址,因此 32 位地址总线可用于访问 4 GB 的内存。
您可以寻址的内存量是地址总线的可能值(2^32)乘以每个内存单元的大小(1 字节),因此 2^32 * 1 字节 = 4294967296 字节。
如果愿意,您也可以将其表示为位,即 2^32 * 8 位 = 34359738368 位。
表示结果的单位与表示内存单位的单位相同。可能的地址数量没有单位,因此虽然地址总线是 32 位,但可能的地址数量不是 4294967296 位,而只是 4294967296。
例如,如果您有一个 16 位地址总线,并且每个内存单元为 4 个字节,则您可以访问 2^16 * 4 字节 = 262144 个字节。
答案3
4GB 指的是 4 GB,并且操作系统中的 32 位与数字没有关系。
它不是以位计算的,而是在使用 2^32 时以字节计算的。但这种限制并不是由一件事引起的,而是会根据主板上的不同 I/O 配置而变化,因此它可能从 2 GB 到接近 4 GB 相差很大。使用 PAE 可以克服这个问题。
答案4
尝试一个小规模的例子来理解这个概念。
如果有 2 位(二进制数字),则可以存储 2^2 个数字,即 4 个数字。00,01,10,11
因此,如果您想引用四个苹果,则每个苹果都可以与一个数字相关联。
同样,32 位可以存储 2^32 ~= 4 亿个数字(cos 32=20+10+2,因此 2^32=2^20+2^10+2^2),4 亿是 40 亿或 4 Giga,因此有 4 Giga 个对象。在这种情况下,每个内存位置都是一个字节,每个字节都有一个地址。