32位计算机能够访问多少内存?

73
什么是32位或64位机器?
它指的是处理器架构... 32位机器可以同时读写32位数据,同样适用于64位机器...
32位机器能够访问的最大内存容量是多少?
它是2^32=4Gb(4千兆比特=0.5千兆字节)
这意味着4Gb的内存?
如果我也以同样的方式考虑64位机器,那么我可以拥有一块16艾比字节的内存吗?这可能吗?
我的理解正确吗?

15
2的32次方等于4GB(其中GB代表千兆字节而不是千兆比特,因为操作系统访问地址不是以位为单位)。因此,2的32次方等于4GB,也等于32 Gb。 - anurag86
3
@anurag86 提到的GB是指十进制值(1000的3次方),而GiB则用于二进制值(1024的3次方)。 - chipit24
1
https://en.wikipedia.org/wiki/32-bit - chipit24
4
了解计算机使用的字节寻址方案对于理解这一点至关重要。计算机始终使用字节地址而不是位地址。因此,使用32位寻址方案,可以寻址4GB的地址。请点击以下链接 - https://dev59.com/iXE85IYBdhLWcg3wikIu - RBT
7个回答

57

是的,32位架构在寻址时最多只能访问4GB内存。根据操作系统的不同,这个数字甚至可能因为保留地址空间而更低。

通过使用PAE(物理地址扩展),可以消除某些32位架构的这一限制,但必须要有处理器支持它。PAE使处理器能够访问超过4GB内存,但并不改变单个进程可用的虚拟地址空间大小——每个进程仍然被限制在最大4GB地址空间内。

是的,理论上64位架构可以访问16.8百万TB内存,即2^64字节。但我认为当前流行的实现并没有完全支持这一点;例如,AMD64架构只能访问最多1TB内存。此外,您的操作系统还会对支持和可寻址内存量施加限制。许多Windows版本(特别是针对家庭或其他非服务器用途的版本)都有任意限制。


2
你能解释一下保留地址空间的概念吗?它是什么意思? - haris
5
它指的是操作系统为自身保留的地址范围(例如用于设备驱动程序),不向应用程序开放使用。 - Cody Gray
1
注意,这是4Gb(千兆比特),而不是4GB(千兆字节)。 - GorvGoyl
9
@jerry 不是的,它是2^32字节,约为43亿字节。换句话说,4千兆字节(GB)。也被称为4吉比字节(GiB)。千兆位(Gigabits)意思完全不同,意味着大约10亿个,而不是大约10亿个字节。(也许让你感到困惑的是,在一个32位体系结构中,RAM是以字节为单位寻址的,所以机器可以访问2^32字节。) - Cody Gray
1
@CodyGray 我有一个问题:地址存储在哪里?换句话说,如果我可以拥有2^32个地址指向2^32字节的内存(在32位系统中),那么是谁在存储这些地址呢?例如,假设地址adr=00...01是第一个地址,并且指向RAM上的第一个8位块:谁在存储adr - tomasyany
显示剩余4条评论

25
通常所说的32位或64位机器,指的是外部可见(“架构”)的通用整数寄存器的大小。
但这基本上与硬件的构建方式无关。例如,让我们考虑一下(早已过时的)英特尔Pentium Pro。它通常被认为是“32位”处理器,即使它支持高达36位的物理地址,具有64位宽的数据总线,并且在单组寄存器中进行了所有支持操作数类型的内部计算(因此这些寄存器宽度为80位,以支持最大的浮点类型)。
至少在英特尔处理器的情况下,即使较大的物理寻址已经可用很长时间了,但在32位处理器上任何一个进程的地址空间内直接可见的最大内存量也被限制为4 GB(32位寻址)。 36位的物理寻址允许寻址高达64 GB的RAM,但其中只有4 GB可以在任何给定时间直接可见。
转向64位机器主要涉及更改对用户(或汇编语言级别的代码)可见的内容。同样,您看到的往往与实际情况不完全相同。例如,大多数64位代码将指针/地址视为64位,但实际处理器不支持那么大的地址。当前的CPU支持48位的虚拟地址,并且(至少在我注意到的范围内)最多支持40位的物理寻址。另一方面,它们被设计为在未来,当更大的内存变得实用时,可以将物理寻址扩展到48位,而不会影响软件。即使它们增加了48位的虚拟寻址,在典型情况下,它只会影响小部分操作系统内核(正常代码不受影响,因为它已经假设地址为64位)。
因此,不:64位机器实际上并不支持高达64位的物理寻址,但是大多数典型的64位软件应该仍然与未来支持直接寻址那么多RAM的处理器兼容。

奔腾处理器用于浮点运算的是80位,而不是通用的。据我所知,36位地址(PAE)比奔腾Pro晚很多。 - vonbrand
@supercat,8088(原始PC)是一款16位CPU,但通过段操作能够寻址1MiB(20位地址)。实际上并没有真正起作用(只需在某些老手面前提到“近指针”、“远指针”和“大于64KiB的数组”等术语,但要准备好快速逃跑)。据我所知,IBM 370架构仍然采用类似的方法。 - vonbrand
@vonbrand:关键是它使用了80位寄存器来进行整数和浮点运算。至于寻址方面,请参见Intel手册的第60页,特别是对A[35:3]#的描述(尽管它到达A35应该已经是一个非常明显的指示)。 - Jerry Coffin
@vonbrand:如果将单个对象限制为16字节对齐,则使每个对象在其段中以恒定偏移量开始(可能为零,或者如果在每个段的开头存储内存管理信息,则可能为其他值)可以使寻址比使用32位指针更有效率。这在汇编语言中很容易实现,但我不知道有哪些主流语言可以实现它。考虑到指针大小的减小,16字节对齐的开销并不严重。8086设计受到了影响... - supercat
......从只有一个“非专用”段寄存器开始,但我没有看到其他16位处理器能够更好地访问1MB。80286的分段比8088差得多,因为每个段都需要在描述符表中拥有一个专用条目,并且每次切换段时都需要重新加载它。不过,想象一下,如果80286上的段寄存器被分成3+13位;高位标识八个超级段之一,其描述符保留在CPU中。每个超级段都具有定义的边界、访问权限和缩放因子... - supercat
显示剩余2条评论

17

回到一个非常基本的概念,我们为我们的内存地址有32位。这相当于2^32个独特地址组合。按照惯例,每个地址指向1个字节的数据。因此,我们最多可以访问总共2^32个字节的数据。

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

例如,要获取“dddddddd”,请执行以下操作: 将“aaaaaaaabbbbbbbbccccccccdddddddd”和“00000000000000000000000011111111”进行逻辑与操作。


1
如果内存是按字节寻址的,那么您应该能够在不对单词执行逻辑操作的情况下寻址每个字节,对吗? - chipit24
方法1:给定一个内存地址,我们会知道要检索哪个字(可能首先将该字放入32位寄存器中)。在下一个周期中,我们可以通过逻辑操作从该字中提取正确的字节。方法2:设计电路硬件,使每个内存地址直接连接到内存中的每个字节。这两种方法都使内存有效地成为字节可寻址。有多种实现方式,各自具有优缺点。我旨在回答更概念性的理解。 - Kevin Lee

5
基本上,32位架构可以像您期望的那样寻址4GB。有一些技术可以让处理器寻址更多数据,例如AWEPAE

4

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

在64位上,确实可以寻址2 ^ 64字节的内存。尽管你永远不会拥有那么多 - 但很久以前也曾说过永远不需要超过640kb的内存......


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

2
你的概念不正确,要想纠正这个问题,你需要知道那个你错误回答的问题的答案:
什么是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是完全合法的。 - Mathai

-5

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

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

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

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

这大约是3 GB以下的东西。


1
OP特别询问的是硬件问题,而不是操作系统问题。 - Sven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接