最近遇到了一个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磁盘。
参考资料
(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;