16、32和64位系统中的内存限制


17

16、32和64位计算机上的理论内存限制如下:

  • 16位= 65,536字节(64千字节)

  • 32位= 4,294,967,296字节(4 GB)

  • 64位= 18,446,744,073,709,551,616(16艾字节)

我记得在DOS / Windows 3.11的日子里,16位内存可以分成几部分,因此16位计算机可以访问的内存量大于64千字节。

我有一台具有16GB内存的计算机,并且正在双重引导32位操作系统和64位操作系统。我可以从64位访问所有16 GB,但在32位只能访问3.21 GB。

因此,我的问题是,如果16位操作系统由于内存分段而允许大于64KB的内存访问,为什么32位计算机不遵循相同的原理?

Answers:


15

他们做到了,该系统称为物理地址扩展(PAE)。这是Windows操作系统及其最大内存的列表,允许超过4GB RAM的任何32位系统都使用PAE来访问内存(例如Windows 2003 R2 Datacenter 32位允许128GB的内存)。


实际上,Windows 8 在最低要求上要求具有支持PAE的CPU 。


要解决有关您的32位操作系统为何无法访问ram(如果存在)的“未提出要求”的问题:许可。他们选择不让其32位操作系统的RAM超过4GB,除非您为数据中心版本付费(这就是为什么他们出售数据中心版本的原因,如果您需要那么多的内存,则您可能可以负担得起更多费用)在操作系统上赚钱)。


啊,我以前听说过PAE,但从未对其进行调查。它似乎主要用于服务器体系结构,因此似乎不适用于Windows 7 32位安装,因为该列表指定W7x86仅允许最大4GB
Matthew Layton

1
@ 0xC0000022L是公平的,我在他的评论后添加了许可证部分作为编辑,但是由于4分钟的编辑窗口,因此我似乎在他发表评论之前就将其发布了。
Scott Chamberlain

1
PAE需要页面表switcheroo才能工作,这在性能方面是昂贵的。
vonbrand

3
这是一个神话。由于PAE造成的开销很小。而且,如果您不喜欢PAE,您应该真的讨厌x64,因为x64上的页表结构看起来就像PAE,只是在顶部添加了另一个表级别,并为PxE中的PFN提供了更多位。
Jamie Hanrahan 2014年

1
PAE并没有“在Windows 7中删除,因为它不再需要”,它仍然存在于Windows 7的86 -它只是没有在默认情况下,而不是在被选配。
杰米·汉拉汉

13

我不会自己解释,而是让​​必须在PAE支持下维护内核的人以他迷人的方式讲话,Linus Torvalds

还请记住,Windows 32位版本中的PAE支持需要大量资金。XP甚至无法正常使用完整的4 GiB RAM,因为MS选择不启用其PAE功能。与之密切相关的内核Windows 2003 Server确实支持PAE。但是,即使在那里,“标准版”也最多仅支持4 GiB(但可以在BIOS内存孔内工作),而价格更高的版本则最多可以支持64 GiB的RAM。这同样适用于32位Vista

但是,并非在所有情况下 Windows都会施加此限制。如果是这样,引导启用PAE的Linux内核仍然可以使您使用完整的4 GiB(或更多)。并非如此,一些硬件制造商选择在BIOS级别上施加此限制,尽管CPU和芯片组将能够处理PAE。


只是一个旁注:当前的基于x86的64位处理器甚至无法物理地解决64位地址空间的全部范围(有关参考,请参阅此问题和解答)。


嗯,为什么我会觉得Linus真的讨厌HIGHMEM.SYS和PAE?:P
Karan

2
我知道,PAE对于任何需要多个工作组的代码以及对于需要管理多个工作(每个工作约2个)的系统级代码都是很麻烦的,但除非单个应用程序需要两个以上的工作我希望PAE透明。此外,我认为在需要3 GB的通用RAM以及大型磁盘缓存或临时存储驱动器的情况下,PAE也会比全局使用64位指针更好。
2014年

莱纳斯的评论很奇怪。himem.sys的工作方式与PAE的工作方式之间没有关系。看到人们主张使用x64并反对PAE寻址是一件非常有趣的事情……当x64长时间模式仅采用PAE方案并增加了一层页表时!
Jamie Hanrahan 2014年

@JamieHanrahan:...在较新的系统上至少有两个(由于虚拟化),这带来了一些令人兴奋的可能性。他(Linus)的比较并不完全正确,但是,如果这是一个外国概念,隐喻可以提供帮助:) ...我想这就是为什么他选择它来表达自己的观点。
0xC0000022L 2014年

2

8位CPU通常具有16位地址总线。(摩托罗拉具有统一的地址总线,RAM和外围I / O共享相同的地址空间,英特尔选择将两者分开。在英特尔的情况下,8088和8086的IO地址限制超过了8080和8085 CPU。)

英特尔的8088和8086具有20位的内存地址总线(1MB),而摩托罗拉的68000具有24位的地址总线(16 MB)。IIRC,[80] 286跳至24位地址总线。后来两者都分别使用[80] 386和68020扩展到32位地址总线。)使用奔腾芯片,地址总线扩展到64位。(我认为摩托罗拉/ IBM的PowerPC芯片也采用了64位地址总线。)

CPU可以直接访问的最大以下可用内存仅受支持的硬件芯片(芯片组)和OS限制。比尔·盖茨(Bill Gates)过去曾因指出没有人需要超过640K的RAM而闻名,因此DOS从未演变为直接访问更多的RAM。通过HiMem.sys和EMM386,DOS被扩展为访问更多“上部”内存,而EMM386被用来直接访问所有可用的RAM。HiMem.sys的灵活性较差,基本上可以使用额外的RAM进行存储。

超出该限制的内存需要MMU(内存管理单元)将内存分为多个部分并将其映射到CPU的可寻址内存空间。这就是CoCo 3,Commodore 128和其他8位计算机可以访问超过64K RAM的方式。

现在更有利的是使用虚拟内存来扩展物理内存限制,尽管存在操作系统所施加的限制。


1

因为没有实际的理由这样做。物理地址扩展允许使用几乎相同的功能,并且用户之间的使用仍然非常有限。在Windows 3.1的日子里,今天没有出现限制。


1
确实没有足够的信息来备份您的语句。Windows 3.1是16位操作系统。必须记住,1992年2MB内存超过300美元。
Ramhound13年

您在2月22日发表评论,Scott Chamberlin的解释几乎涵盖了我的意思。他们确实省略了为什么在DOS / Win16中使用可扩展分段分页的说明,但在以后的Windows中却没有使用。我没有将其包括在内,因为它不会直接有助于回答OP的问题。
OCDtech 2013年

我认为答案应该独立存在。您的评论中添加了足够的信息来解决我的问题。
Ramhound13年

1
@OCDtech:8086分段模型将允许一种面向对象的语言使用2字节的对象引用来标识在16字节边界上对齐的对象,但是语言不具备有效使用分段的能力。80286模型给此类程序带来了巨大的开销,并且在80386上进行扩展的方式将使按对象分段方案完全无用。
超级猫

0

16、32和64位计算机上的理论内存限制如下...

这里的根本缺陷是这样的观念,即处理器的“位宽”(通常是机器通用寄存器的大小)必须与RAM地址的宽度相同。

在启用分页但未启用PAE的x86中,程序和OS代码使用的地址被Intel称为“线性地址”-我们通常将其称为“虚拟地址”。它们是32位宽。这允许一个4 GiB虚拟地址空间。

但是,这或多或少是巧合,仅仅是页表项格式的一个假象,即物理(RAM)地址的大小也是32位。

使用PAE,后者为36位(起初...在以后的实现中更宽)。因此,仅因为它是“ 32位计算机”,并不意味着物理存储器地址被限制为32位。

该行业具有长期的机器,其“位宽”不符合他们的最大物理地址大小的历史。例如,VAX体系结构定义了32位计算机,而虚拟地址(即打开地址转换后代码使用的地址)确实为32位宽...但是VAX的物理地址仅为30位宽-物理地址空间的一半专用于I / O设备寄存器,因此最大RAM仅512 MiB。

即使没有地址转换硬件,机器的“位宽”也不一定会定义最大RAM地址。示例:CDC“ upper 3000”系列是36位计算机。您认为他们可以解决64 GiB的RAM吗?不难!这些机器是在60年代中期问世的!哎呀,那几天我们什至没有64 GB的磁盘空间。(CDC 6000系列是60位计算机。我需要继续吗?)


并且不要忘记每个RAM单元不使用8位的系统。(EG:16/16 =最大128K,32/32 =最大16G,32/64 = 32G最大)
SkyCharger,2017年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.