memory - 为什么32位机器最大有4GB?

标签 memory memory-management 32-bit

这是我在进行任何研究之前的第一个逻辑:

由于它是 32 位机器,因此将有 2 ^ 32 个空格(约 40 亿) 但它们是以位为单位的,所以我必须将其转换为字节。 (~40 亿/8) 然后我得到 ~ 5 亿字节,或 ~ 500MB。

我实际上很好奇为什么它不是 500 MB,所以我发现了这个:

"By definition, a 32-bit processor uses 32 bits to refer to the location of each byte of memory. 2^32 = 4.2 billion, which means a memory address that's 32 bits long can only refer to 4.2 billion unique locations (i.e. 4 GB)." (original source)

但是我又困惑了,因为每个内存地址都是32位长,而且有42亿个。每个内存地址是4个字节,而不是1个字节。所以它将是 4.2 Giga * 4 字节 = 16.8 GB。

很明显我在逻辑上遗漏了一些东西。有任何澄清吗?

最佳答案

您将地址的长度与位于该地址的内存的大小混淆了。它们完全无关。

到目前为止,32 位机器最常见的选择是将内存组织在 2^32 个唯一地址中,每个地址保存 8 位(1 字节)。因此,为了唯一地寻址每一位,您需要 32+3 位。实际上,内存以 128 或 256 位 block (8 或 16 字节)的形式加载到高速缓存中,因此物理上仅需要 32-3 或 32-4 地址线。那么为什么我们仍然使用 32 位这个术语呢?这是因为地址寄存器的物理大小为 32 位。有“加载字节”指令,但通常没有“加载位”。 (如果有,通常有 8 个)

关于memory - 为什么32位机器最大有4GB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39695899/

相关文章:

php - 32 位无符号整数 php

android - 更深入的解释 procstats for Android

java - Java:序列化到字节缓冲区的最快方法

performance - Flash 如何处理我的匿名函数?

vb.net - VB.NET 静态变量存储在哪里?

opencv - 如何通过 MacPorts 在 32 位中安装 OpenCV 2.1?

vbscript - 从批处理文件运行vbscript

python - 内存中似乎有什么东西被困住了

C "double free or corruption"错误

ios - 类方法的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS