我如何向 windows 询问 RAM 是在单通道、双通道还是四通道中运行?

Posted

技术标签:

【中文标题】我如何向 windows 询问 RAM 是在单通道、双通道还是四通道中运行?【英文标题】:How can I ask windows about if the RAM is running in single, dual or quad channel? 【发布时间】:2018-09-12 23:16:22 【问题描述】:

如何检测当前的 RAM 配置?我需要询问 Windows,RAM 当前是在单通道、双通道还是四通道中运行。

我搜索了很多,并没有在这个或其他网站上找到任何类似的问题,这让我很惊讶。

我正在使用 C++,但这个问题确实适用于所有编程语言,因为它是关于什么 windows 功能或 powershell/cmd 命令会给我我需要的信息。

【问题讨论】:

出于好奇,平台是否提供此类信息?在嵌入式系统中,我们不得不依赖平台原理图。 这是一个起点吗? msdn.microsoft.com/en-us/library/aa394347(v=vs.85).aspxWMI 似乎是正确的部分:msdn.microsoft.com/en-us/library/aa394582(v=vs.85).aspx CPU-Z 能够正确检测到 RAM 的通道配置,所以如果该软件可以在 windows 上检测到它,我的软件应该也可以。 嗯...如果它是关于所有编程语言的,那么问题应该被标记为Language-Agnostic 而不是特定的语言。实际上,尽管听起来您想要一个 C++ 答案,这与 Powershell 答案不同,而且很可能在 CMD 中甚至不可能。 您可以使用Win32_PhysicalMemory wmi 类并访问DeviceLocator 成员来确定安装在哪个DIMM 插槽中。 【参考方案1】:

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 是“相互分享”的花哨词,类似于现在的多渠道,但不是一回事。来自 wiki 上的交错内存:

它不同于多通道内存架构,主要是因为 交错内存不会在主内存之间添加更多通道 和内存控制器。然而,信道交织也是 可能...[]

使用这个,我将分享使用 cmd.exe 在双通道中拥有 4 个 RAM 棒的样子:

编辑:一些人已经确认这些值在某些机器上工作得很好,但经常返回令人费解/无意义的值。

【讨论】:

只是指出wmicC:\Windows\System32\wbem\WMIC.exe 我现在测试了一台单通道PC,InterleavePosition的输出是0。我应该如何解释这些数据?在 1 个单 ram 模块的情况下,很容易知道它肯定是单通道,但是运行单通道的两个 ram 模块很可能会说 0,02,2,那么我如何从中检测通道数量?跨度> 我对来自 MSDN 的 Interleave 信息的编辑应该会有所帮助,但如果它在 InterleaveDataDepth 中显示 0,则它是非交错的意思是单通道。 我还要指出 InterleavePosition 在我的机器上是空的。因此,与 WMI 中的许多硬件类一样,这将取决于制造商是否首先将信息写入 WMI。 @JohnAl:CPU-Z 只是“询问 Windows”不是真的。当然,它使用 Windows API 来获取数据,但它可能会获取原始二进制固件表,然后自己解释内容。所以可能没有任何 Windows API 来执行这种解释。【参考方案2】:

查看 SMBios 规范:System Management BIOS (SMBIOS) Reference Specification。实际上,最新版本是 2018 年 5 月 14 日。

第 1 步: 您需要阅读Current Interleave from 7.6 Memory Controller Information (Type 5) 用于旧版本,然后按照有关如何阅读最新结构的说明进行操作。

第 2 步:您需要从以下位置获取内存设备:

7.38 内存通道(37 型)
偏移名称 长度 值 描述
 06h Memory Device Count(n) BYTE 改变存储设备的数量(类型 11h)
                                            与此频道相关联
                                            该值还定义了
                                            随后的装载/处理对。

您应该阅读Count(n) 存储设备及其相关通道。

第 3 步:全部加在一起,您将得到如下表格:

Channel 1: DIMM #0
Channel 1: DIMM #1
Channel 2: DIMM #0
Channel 2: DIMM #1

幸运的是,在 SMBIOS 规范中有一些示例。

例如查看7.7.3 Memory subsystem部分:

04h ;当前使用 2 路交错

由于规范经常更改并且有些已经过时,我不会依赖任何开箱即用的 Windows WMI/API。我可以建议您的最佳方法是一次性读取 RAW SMBIOS 数据并构建一个像上面那样的简单表。方法如下:SMBIOS Demystified

此外,我相信您无法对真正的有效通道速度做任何进一步的假设。您可能需要收集有关每个 DIMM 模块速度的其他信息。

恕我直言,发布此类任务的源代码远远超出了当前问题的范围,因此有一些链接:关于该主题的最佳参考是 dmidecode 但是,由于我对 Delphi 感觉很好,我更愿意看看这个 Delphi/FPC 帖子:Reading the SMBios Tables using Delphi。

【讨论】:

以上是关于我如何向 windows 询问 RAM 是在单通道、双通道还是四通道中运行?的主要内容,如果未能解决你的问题,请参考以下文章

Android 可用内存

如何在 Windows 7 (Windows 2008 R2) 中创建 RAM 驱动器?

在 Windows XP 中将内存地址映射到物理模块

我如何向 Maven 询问默认存储库的列表?

RAM是如何分配的? [关闭]

Android 内存类型(RAM v 内部存储器)