是否可以找到 DIMM 的物理地址范围?

Alu*_*lun 22 memory smbios ecc

我注意到 SMBios Type 20 在这里会有所帮助,但它是可选的,从 version 2.5 (2006-09-05) pp. 25, L796 和 pp. 131 开始,而类型 16、17 和 19 是强制性的,但不完全帮助。

物理内存阵列(类型 16)

整个系统有一个这样的结构,解释了这个板上的可能性。

Handle 0x1000, DMI type 16, 23 bytes
Physical Memory Array
    Location: System Board Or Motherboard
    Use: System Memory
    Error Correction Type: Multi-bit ECC
    Maximum Capacity: 768 GB
    Error Information Handle: Not Provided
    Number Of Devices: 24
Run Code Online (Sandbox Code Playgroud)

存储设备(类型 17)

每个 Dimm 有一个记录,它告诉您安装在板上的物理 Dimm。

Handle 0x1100, DMI type 17, 34 bytes
Memory Device
    Array Handle: 0x1000
    Error Information Handle: Not Provided
    Total Width: 72 bits
    Data Width: 64 bits
    Size: 2048 MB
    Form Factor: DIMM
    Set: 1
    Locator: DIMM_A1 
    Bank Locator: Not Specified
    Type: DDR3
    Type Detail: Synchronous Registered (Buffered)
    Speed: 1600 MHz
    Manufacturer: XXXX
    Serial Number: XXXX
    Asset Tag: XXXX
    Part Number: XXXX 
    Rank: 1
    Configured Clock Speed: 1333 MHz
Run Code Online (Sandbox Code Playgroud)

内存阵列映射地址(类型 19)

可以有多个这样的记录,每个记录列出一个物理地址范围。

这是带有两个 2GB 记忆棒的输出:

Handle 0x1300, DMI type 19, 31 bytes
Memory Array Mapped Address
    Starting Address: 0x00000000000
    Ending Address: 0x000CFFFFFFF
    Range Size: 3328 MB
    Physical Array Handle: 0x1000
    Partition Width: 2

Handle 0x1301, DMI type 19, 31 bytes
Memory Array Mapped Address
    Starting Address: 0x00100000000
    Ending Address: 0x0012FFFFFFF
    Range Size: 768 MB
    Physical Array Handle: 0x1000
    Partition Width: 2
Run Code Online (Sandbox Code Playgroud)

这是 4 根棍子的输出;2*2GB 和 2*4GB:

Handle 0x1300, DMI type 19, 31 bytes
Memory Array Mapped Address
    Starting Address: 0x00000000000
    Ending Address: 0x000CFFFFFFF
    Range Size: 3328 MB
    Physical Array Handle: 0x1000
    Partition Width: 2

Handle 0x1301, DMI type 19, 31 bytes
Memory Array Mapped Address
    Starting Address: 0x00100000000
    Ending Address: 0x0032FFFFFFF
    Range Size: 8960 MB
    Physical Array Handle: 0x1000
    Partition Width: 2
Run Code Online (Sandbox Code Playgroud)

请注意,在上面的第一个示例输出中,有两个 2GB DIMM,但有 3.3GB 和 0.7GB 两个范围。使用4个Dimms,系统也会将内存阵列映射的地址区域合并成两个块,因为它只是表示与e820映射相同,即有效的内存物理地址范围。

1 到多个 20 类记录正好绑定到一个 17 类存储设备,这意味着可以知道整个物理范围:

例子

$ sudo dmidecode -t 20
# dmidecode 2.12
SMBIOS 2.6 present.

Handle 0x002F, DMI type 20, 19 bytes
Memory Device Mapped Address
    Starting Address: 0x00000000000
    Ending Address: 0x000FFFFFFFF
    Range Size: 4 GB
    Physical Device Handle: 0x002B
    Memory Array Mapped Address Handle: 0x002E
    Partition Row Position: 1

Handle 0x0030, DMI type 20, 19 bytes
Memory Device Mapped Address
    Starting Address: 0x00100000000
    Ending Address: 0x001FFFFFFFF
    Range Size: 4 GB
    Physical Device Handle: 0x002C
    Memory Array Mapped Address Handle: 0x002E
    Partition Row Position: 1
Run Code Online (Sandbox Code Playgroud)

似乎可以从地址到 DIMM 用于EDAC - 错误检测和纠正目的,但不能从 DIMM 到整个范围。

查看mcelog的源代码,它也是使用类型 20 进行解码的。

K7A*_*AAY 0

暴力解决方案似乎是

  1. 记录当前配置的内存范围
  2. 断电,取出有问题的 DIMM 及其上方的所有 DIMM
  3. 重新启动,查看新配置。

  • 不确定这是否有帮助...即,如果您有 6 个 2GB DIMM,并删除一对,您的最大范围可能只会缩小 4GB,但这并不能告诉您它们在前一种情况下的位置,但我会测试这个并更新。 (2认同)