如何向Windows询问RAM是否运行在单通道、双通道还是四通道模式?

18

我该如何检测当前内存配置?我需要向Windows询问RAM当前是否以单通道、双通道还是四通道运行。

我已经搜索了很多,但在这个或其他网站上都没有找到类似的问题,这让我感到非常惊讶。

我正在使用 C++,但这个问题对所有编程语言都适用,因为它关于哪个Windows函数或 powershell/cmd 命令能给我所需信息。


2
这是一个起点吗?https://msdn.microsoft.com/en-us/library/aa394347(v=vs.85).aspx WMI似乎是正确的部分:https://msdn.microsoft.com/en-us/library/aa394582(v=vs.85).aspx - Richard Critten
CPU-Z 能够正确检测 RAM 的通道配置,因此如果那个软件能在 Windows 上检测到它,我的软件很可能也能。 - JohnAl
嗯...如果涉及到所有编程语言,那么问题应该标记为“语言无关”,而不是特定的语言。但实际上,这听起来像是你想要一个C++的答案,这与Powershell的答案不同,而且在CMD中可能根本不可能。 - EBGreen
@RichardCritten 我之前看过Win32_PhysicalMemory,但据我所知,其中的数据都无法帮助我检测通道配置。 - JohnAl
1
您可以使用 Win32_PhysicalMemory WMI 类,并访问 DeviceLocator 成员来确定 RAM 安装在哪个 DIMM 插槽中。 - Maximilian Burszley
显示剩余10条评论
2个回答

6

InterleavePosition 是你要找的东西。其中一个输出是 2,2,2,因为它在双通道模式下运行了 3 根内存条。你需要找出如何识别单通道模式下运行的机器,以便使用此命令的输出:

wmic memorychip get InterleavePosition

编辑:实际上我对于使用3根内存条的双通道并不确定。一些研究表明,现在大多数主板会将奇数个内存条设置为单通道。

因此,从MSDN上来看,这就是我们需要挖掘有关交错内存系统信息的内容。

Position of the physical memory in an interleave. For example, in a 2:1 interleave, a value of "1" indicates that the memory is in the "even" position.

This property is inherited from CIM_PhysicalMemory.

0 - Noninterleaved

1 - First position

2 - Second position

另外还有一个 InterleaveDataDepth 参数,它的含义如下:

InterleaveDataDepth

Unsigned 16-bit integer maximum number of consecutive rows of data that are accessed in a single interleaved transfer from the memory device. If the value is 0 (zero), the memory is not interleaved.

请注意,interleave是一个花哨的词,意思是“相互分享”,类似于现在的多通道,但并不是同一件事情。来自维基百科的交错内存:

它与多通道内存架构不同,主要是因为交错内存没有在主内存和内存控制器之间添加更多通道。然而,通道交错也是可能的… []

使用这个,我将分享一下使用cmd.exe在双通道中有4个RAM条的情况:

example of dual channel memory output from wmic

编辑: 一些人已经确认这些数值在某些机器上可以正常工作,但是很多时候会返回令人困惑/无意义的数值。

1
只是指出 wmicC:\Windows\System32\wbem\WMIC.exe - Maximilian Burszley
1
我现在已经测试了一个单通道的PC,InterleavePosition的输出为0。我应该如何解释这个数据?在只有一个内存模块的情况下,很容易知道它肯定是单通道的,但是两个运行单通道的内存模块很可能会显示0,02,2,那么我该如何从中检测出通道的数量呢? - JohnAl
1
我的有关MSDN的交错信息的编辑应该会有所帮助,但如果InterleaveDataDepth中显示为“0”,那么它是非交错的,也就是单通道。 - Dylan Moore
1
我还要指出,在我的机器上,InterleavePosition是空的。因此,像WMI中许多硬件类一样,这将取决于制造商是否首先将信息写入WMI。 - EBGreen
3
CPU-Z并不仅仅是“询问Windows”的,它当然会使用Windows的API来获取数据,但它可能会获取原始二进制固件表格,然后自己解释其内容。因此,可能没有Windows API可以执行这种解释。 - Ben Voigt
显示剩余10条评论

2
请查看 SMBIOS 规范:系统管理 BIOS(SMBIOS)参考规范。实际上,最新版本的日期是 2018 年 5 月 14 日。
步骤 1: 您需要从“7.6 内存控制器信息(类型 5)”中读取“Current Interleave”,然后按照有关如何读取最新结构的说明进行操作。
步骤 2:您需要从以下位置获取内存设备:
7.38 Memory Channel (Type 37)
Offset Name                   Length Value  Description
 06h   Memory Device Count(n)  BYTE  Varies Number of Memory Devices (Type 11h) that are 
                                            associated with this channel
                                            This value also defines the  number of 
                                            Load/Handle pairs that follow. 
您应该阅读带有其关联通道的那些“Count(n)”内存设备。
步骤 3:将所有内容汇总,您将得到以下表格:
Channel 1: DIMM #0
Channel 1: DIMM #1
Channel 2: DIMM #0
Channel 2: DIMM #1

幸运的是,在SMBIOS规范中有一些示例。
例如,看看第7.7.3节的内存子系统:
04h ; 当前使用2路交错
由于规范经常变化并且有些已过时,我不会依赖任何开箱即用的Windows WMI/API。我建议您最好读取原始的SMBIOS数据并一次性构建一个简单的表格,就像上面的表格一样。这是如何做到的:SMBIOS Demystified 此外,我认为您不能对实际有效通道速度做出任何进一步的假设。您可能需要收集一些有关每个DIMM模块速度的其他信息。
在我看来,发布此类任务的源代码远远超出了当前问题的范围,因此这里提供一些链接:关于该主题的最佳参考资料是dmidecode,但是,由于我擅长Delphi,所以我更喜欢查看这篇Delphi/FPC文章:使用Delphi读取SMBios表格

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