32位机器可以访问多少内存?

Posted

技术标签:

【中文标题】32位机器可以访问多少内存?【英文标题】:how much memory can be accessed by a 32 bit machine? 【发布时间】:2012-02-10 18:39:39 【问题描述】:

什么是32位或64位机器?

这是处理器架构……32位机器可以同时读取和写入32位数据,与64位机器相同……

32 位机器可以访问的最大内存是多少?

它是2^32=4Gb (4Gigabit = 0.5 GigaByte)

这意味着 4Gb 内存?

如果我在 64 位机器上考虑相同的方式,那么我可以拥有 16ExbiBytes 的内存 ..这可能吗?

我的概念对吗?

【问题讨论】:

2^32 = 4GB(这里 GB 是千兆字节而不是千兆位,因为您的操作系统不会访问/寻址到位级别的地址)。所以,2^32 = 4GB = 32 Gb @anurag86 GB 表示十进制值 (1000^3),而 GiB 表示二进制值 (1024^3)。 en.wikipedia.org/wiki/32-bit translatorscafe.com/cafe/EN/misc/unitconv/… 了解计算机使用的字节寻址方案对于理解这一点至关重要。计算机总是在字节而不是位的地址上工作。因此,使用 32 位寻址方案,您可以寻址 4 Giga 字节的地址。请点击此链接 - ***.com/questions/2724449/… 【参考方案1】:

回到一个非常基本的想法,我们的内存地址有 32 位。这可以计算出 2^32 个唯一的地址组合。按照惯例,每个地址指向 1 个字节的数据。因此,我们最多可以访问总共 2^32 字节的数据。

在 32 位操作系统中,每个寄存器存储 32 位或 4 个字节。每个时钟周期处理 32 位(1 个字)信息。如果您想访问特定的 1 字节,从概念上讲,我们可以通过按位逻辑运算“提取”各个字节(例如字节 0、字节 1、字节 2、字节 3 等)。

例如要获得“dddddddd”,请采取 “啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊” 和逻辑与 “00000000000000000000000011111111”。

【讨论】:

如果内存是字节可寻址的,那么您应该能够寻址每个字节而无需对字执行逻辑运算,不是吗? 方法 1:给定一个内存地址,我们会知道要检索哪个字(可能首先将字放入 32 位寄存器)。在下一个周期中,我们可以通过逻辑运算从该字中提取正确的字节。方法二:设计电路硬件,使每个内存地址直接连接到内存中的每个字节。这两种方式都可以使内存有效地进行字节寻址。有多种方法可以实现这一点,各有优缺点。我的目标是在答案中获得更多概念性的理解。【参考方案2】:

32 位或 64 位机器的典型含义是外部可见(“架构”)通用整数寄存器的大小。

这与硬件的构建方式几乎没有关系。例如,让我们考虑一下(长期过时的)Intel Pentium Pro。它通常被认为是“32 位”处理器,尽管它最多支持 36 位物理地址,具有 64 位宽的数据总线,并且所有支持的操作数类型的内部计算都在一组寄存器中进行(因此是 80 位宽,以支持最大的浮点类型)。

至少在 Intel 处理器的情况下,即使较大的 物理 寻址已经可用很长时间了,在 32 上的任何一个进程的地址空间内直接可见的最大内存量位处理器也限制为 4 GB(32 位寻址)。 36 位物理寻址允许寻址高达 64 GB 的 RAM,但在任何给定时间只能直接看到其中的 4 GB。

对 64 位机器的更改主要涉及更改对用户可见的内容(或更改为汇编语言级别的代码)。同样,您所看到的很少与真实的相同。例如,大多数 64 位代码将指针/地​​址视为 64 位,但实际处理器不支持那么大的地址。当前的 CPU 支持 48 位虚拟地址,并且(至少据我所知)最多支持 40 位物理地址。另一方面,它们是这样设计的,将来当更大的内存变得实用时,它们可以将物理寻址扩展到 48 位,而完全不影响软件。即使他们增加了 48 位虚拟寻址,在典型情况下它只会影响少量操作系统内核(正常代码不受影响,因为它已经假定地址是 64 位)。

所以,不:64 位机器确实真的支持最多 64 位的物理寻址,但是大多数典型的 64 位软件应该与支持直接寻址这么多 RAM 的未来处理器。

【讨论】:

值得注意的是,虽然语言并没有真正很好地支持 8086 分段,但简单地将段寄存器扩展为 32 位的变体可以轻松扩展 Java 或 . NET 到 64GB,并进行了一些远远超出此范围的调整。由于使用 32 位而不是 64 位偏移寄存器而减少的高速缓存开销可以比 64 位线性寻址更快地使用此类代码。太糟糕了,英特尔从未将段寄存器扩展到超过 16 位。 Pentium 将 80 位用于浮点,不是一般用途。而且 AFAIU 的 36 位地址 (PAE) 比 Pentium Pro 晚很多。 @supercat,8088(原始 PC)是一个 16 位 CPU,但能够通过段恶作剧寻址 1MiB(20 位地址)。从来没有真正起作用(只是在一些老手面前提到术语“近指针和远指针”和“大于 64KiB 的数组”,但要准备好必须快速逃跑)。 AFAIU IBM 370 架构仍然做类似的事情。 @vonbrand:关键是它使用 80 位 寄存器 进行整数和浮点运算。至于寻址,请参阅Intel manual 的第 60 页,特别是A[35:3]# 的描述(尽管它上升到A35 的事实本身应该是一个非常可靠的指示)。 @vonbrand:如果将单个对象限制为 16 字节对齐,则让每个对象从其段中的恒定偏移量开始(可能为零,或者如果将内存管理信息存储在每个段的开头)可以使寻址比使用 32 位指针更有效。这在汇编语言中很容易做到,但我不知道有任何主流语言可以做到这一点。考虑到指针大小的减少,16 字节对齐的开销实际上并不严重。 8086 设计遭受...【参考方案3】:

基本上,术语“x 位机器”不依赖于您的机器。这就是为什么我们不需要更改我们的处理器或其他硬件来从 32 位系统迁移到 64 位系统(反之亦然)。

32 位和 64 位代表您机器上运行的操作系统的寻址能力。

但是,这仍然不意味着 x 位操作系统能够寻址 2^x GB 内存。因为“GB”中的“B”表示“字节”而不是“位”。 1 字节等于 8 位。

实际上 32 位系统甚至无法寻址 2^32/8 = 2^29 GB 内存空间,而应该为操作系统保留一些内存。

它小于 3 GB。

【讨论】:

OP 专门询问硬件,而不是操作系统。【参考方案4】:

不,你的概念不对。要正确设置,您需要回答您错误回答的问题:

什么是32位或64位机器?

问题的答案是“CPU 中重要的东西是 32 位或 64 位”。所以问题是什么是重要的东西?很多人说数据总线的宽度决定了机器是32位还是64位。但是最新的 32 位处理器都没有 32 位或 64 位宽的数据总线。大多数 32 位系统将至少具有 36 位以支持更多 RAM。大多数 64 位处理器的数据总线不超过 48 位宽,因为那已经是非常大的内存了。

所以在我看来,32 位或 64 位机器是由计算中使用的通用寄存器的大小或计算机使用的“自然字长”决定的。

请注意,32 位操作系统是另一回事。您可以在 64 位计算机上运行 32 位操作系统。此外,您可以在 64 位操作系统上运行 32 位应用程序。如果您不了解其中的区别,请发布另一个问题。

因此,如果处理器中启用了正确的寻址模式,处理器可以寻址的最大 RAM 量为 2^(数据总线的宽度,以位为单位)。

进一步注意,没有什么能阻止有人在数据总线和内存组之间引入多路复用,这将选择一个组,然后寻址 RAM(分两步)。这样您就可以寻址更多的 RAM。但这是不切实际的,而且效率极低。

【讨论】:

所以在我看来,32 位或 64 位机器是由计算中使用的通用寄存器的大小或计算机使用的“自然字长”决定的。 - 不是它的地址大小。您不能真正按寄存器大小进行。在 16 位模式下,您可以访问 32 位寄存器。例如在实模式下它是 XOR EAX,EBX 是完全合法的。【参考方案5】:

是的,32 位架构仅限于寻址最多 4 GB 的内存。根据操作系统的不同,由于保留了地址空间,这个数字可以进一步减少。

在某些 32 位架构上可以通过使用 PAE (Physical Address Extension) 来消除此限制,但处理器必须支持此限制。 PAE 使处理器能够访问超过 4 GB 的内存,但它不会改变单个进程可用的虚拟地址空间量 - 每个进程仍将被限制为最多 4 GB 的地址空间。

是的,理论上 64 位架构可以处理 1680 万 TB 的内存,即 2^64 字节。但我不相信当前流行的实现完全支持这一点。例如,AMD64 架构最多只能寻址 1 TB 的内存。此外,您的操作系统还将限制支持的可寻址内存量。许多版本的 Windows(特别是为家庭或其他非服务器用途设计的版本)都受到任意限制。

【讨论】:

你能解释一下保留地址空间的概念是什么意思吗? @haris:它只是指操作系统为自己保留的地址范围(用于设备驱动程序之类的东西)并且不可供应用程序使用。 @CodyGray 这个答案比解释更令人困惑。您不断将物理地址空间(由处理器使用)与虚拟地址空间(由软件使用)混合 注意它是 4Gb(千兆位)而不是 4GB(千兆字节) @jerry 不,不是。它是 2^32 字节,大约是 43 亿字节。换言之,4 GB。 Also known as 4 gibibytes (GiB)。千兆位是完全不同的东西,意味着约 10 亿 ,而不是约 10 亿 字节。 (也许让您感到困惑的是,在 32 位架构上,RAM 以字节为单位进行寻址,因此机器可以访问 2^32 字节。)【参考方案6】:

基本上 32 位架构可以按您的预期寻址 4GB。 有一些技术可以让处理器处理更多数据,例如AWE 或PAE。

【讨论】:

【参考方案7】:

是的,在 32 位机器上,最大可用内存量约为 4GB。实际上,取决于操作系统,由于部分地址空间被保留,它可能会更少:例如,在 Windows 上,您只能使用 3.5GB。

在 64 位上,您确实可以寻址 2^64 字节的内存。并不是说你永远不会拥有这些——但话说回来,很久以前也有人说过需要超过 640kb 的内存......

【讨论】:

@Beyondo:什么?这是关于可以寻址的内存,而不是关于一个数字可以有多少位。

以上是关于32位机器可以访问多少内存?的主要内容,如果未能解决你的问题,请参考以下文章

11.用C对32位内存地址的访问方式

Linux中关于swap虚拟内存和page的区别

32 位 Windows 上 C++ 应用程序可用的最大内存是多少?

32 位 pyodbc 读取 64 位访问 (accdb)

访问 64 位 ODBC

64位系统下,一个32位的程序究竟可以申请到多少内存,4GB还是更多