我如何向 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 棒的样子:
编辑:一些人已经确认这些值在某些机器上工作得很好,但经常返回令人费解/无意义的值。
【讨论】:
只是指出wmic
是C:\Windows\System32\wbem\WMIC.exe
我现在测试了一台单通道PC,InterleavePosition的输出是0
。我应该如何解释这些数据?在 1 个单 ram 模块的情况下,很容易知道它肯定是单通道,但是运行单通道的两个 ram 模块很可能会说 0,0
或 2,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 是在单通道、双通道还是四通道中运行?的主要内容,如果未能解决你的问题,请参考以下文章