怀德维宁

大邦维屏,大宗维翰。怀德维宁,宗子维城。

0%

windows内存限制研究

最近遇到了一个windows可识别内存只显示2g,其他内存显示为硬件预留的问题,查找相关资料,发现多数认为原因为系统未激活,甚至微软官方的文档也有这个说法。但是当笔者在测试环境进行测试时,发现这个问题不是必现的,笔者的未激活windows系统识别到了完整的内存,远大于2g。因此收集相关资料,尝试研究影响windows可识别内存的相关因素。

windows物理内存限制

该部分内容主要参考《Windows Internals》第六版第10章《Memory Management》中《Physical Memory Limits》章节。

Windows对物理内存的支持受硬件限制、激活证书、操作系统数据结构和驱动程序兼容性的影响。下表列出了不同版本的Windows目前支持的物理内存容量及其限制因素。

版本 32位系统限制 64位系统限制 限制因素
旗舰版、企业版、专业版 4GB 192GB 64位系统的激活证书;32位系统的激活证书、硬件支持及驱动程序兼容性
家庭高级版 4GB 16GB 64位系统的激活证书;32位系统的激活证书、硬件支持及驱动程序兼容性
家庭普通版 4GB 8GB 64位系统的激活证书;32位系统的激活证书、硬件支持及驱动程序兼容性
入门版 2GB 2GB 激活证书
数据中心版、企业版、基于Itanium版 N/A 2TB 测试和可用系统
基础版 N/A 8GB 激活证书
标准版和网页服务器版 N/A 32GB 激活证书
服务器HPC版本 N/A 128GB 激活证书

因此如果客户为系统配置的内存大于系统支持的最大物理内存,则多出的部分系统无法识别,就会造成系统识别到的内存远低于真实物理内存。

windows注册表文件限制

windows启动过程中会读取注册表来解析Kernel-WindowsMaxMemAllowedx64的值,如果解析失败就只能使用2GB的内存,对应的注册表路径如下:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ProductOptions\ProductPolicy

对应的注册表键值是大量的16进制数据,无法直观获取,可以使用如下的powershell指令获取具体数值:

(Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\ProductOptions\).ProductPolicy.count

正常的参数值应该是万级别,低于这个数量级就需要考虑注册表损坏的因素了。

该参数会在系统激活时被重置,因此可以通过激活系统的方法重新设置相关参数。

系统配置最大内存限制

在Windows系统配置-引导-高级选项中存在最大内存配置项,默认未勾选,即系统自动识别与设置最大内存。

如果用户勾选了对应选项,并手动设置了相关参数,可能就会造成系统识别到的内存异常。因此出现类似问题时,建议检查该配置项设置是否符合预期。

图形卡和其他设备影响内存限制

设备必须将其内存映射到低于4GB才能与非PAE感知Windows版本兼容。因此,如果系统具有4GB的RAM,则其中一些RAM被BIOS禁用或重新映射在4GB以上如果重新映射内存,X64 Windows可以使用此内存。X86客户端版本的Windows不支持超过4GB标记的物理内存,因此它们无法访问这些重新映射的区域。任何X64 Windows或X86 Server版本都可以。

启用了PAE的X86客户端版本具有37位可用 (128 GB) 物理地址空间。这些版本施加的限制是允许的最高物理RAM地址,而不是IO空间的大小。这意味着PAE感知驱动程序实际上可以使用超过4GB的物理空间(如果需要)。例如,驱动程序可以映射位4GB以上的“丢失”内存区域,并将此内存公开为RAM磁盘。

参考资料

(1)https://learn.microsoft.com/zh-cn/troubleshoot/azure/virtual-machines/windows/windows-virtual-machine-activation-faq;

(2)https://cloud.tencent.com/developer/article/1930066;

(3)https://help.aliyun.com/zh/ecs/the-physical-memory-of-a-windows-instance-is-abnormal;

(4)https://learn.microsoft.com/zh-cn/windows/win32/memory/memory-limits-for-windows-releases;